07.11.2012 23:57
 0просмотров 16 0

Перебор всех персонажей.

Итак, мы вывели информацию о одном персонаже. Теперь Нужно просканировать группу персонажей. Для этого мы создадим ещё один метод, который циклично будет проверять персонажей, меняя их ID. Метод буде принимать два параметра – ID с которого начинать, и ID, перед которым заканчивать. Вот как он будет выглядеть:

private void ScanDiapason(int start_value, int stop_value){
    for (int i = start_value; i <= stop_value; i++ ){
        GetPage("http://www.heroeswm.ru/pl_info.php?id=" + i);
    }
}


Вместо вызова метода GetPage, вызовем новый метод, указав ограничения 2250 и 2350.

scanner.ScanDiapason(2250, 2350);

В результате мы получим файл, в котором будет куча пустых строк. Нам нужны только те персонажи, которые имеют достижение тыквика. Добавим условие в метод GetPage для вывода найденных результатов:

if (buffer.length() > 0)
    if (buffer.indexOf(";") != buffer.length() - 1)
        System.out.println(buffer);


Здесь мы проверяем, чтобы строка была не пуста и чтобы она не заканчивалась точкой с запятой. Выполнив программу ещё раз мы увидим две строчки с персонажами, удовлетворяющими нашему поиску.
Указав номера персонажей от 1 до много (не знаю, сколько сейчас зарегистрированных), можно получить файл, содержащий информацию о всех 12к достижениях. Остаётся одно но – это слишком долго. За ночь проверяется менее 100к персонажей, а их больше 4кк. Такая проверка займёт очень много времени.
Самое время вспомнить, что живём мы в 21-м веке и многопоточность стала обыденностью. Убираем из main создание экземпляра класса и вызов метода ScanDiapason. Создадим два потока и запустим их.

Thread t1 = new Thread(new Runnable() {
   @Override
   public void run() {
      HWM_PersScanner scanner = new HWM_PersScanner();
      scanner.ScanDiapason(1, 10000);
   }
});
        
Thread t2 = new Thread(new Runnable() {
   @Override
   public void run() {
      HWM_PersScanner scanner = new HWM_PersScanner();
      scanner.ScanDiapason(10000, 20000);
   }
});
        
t1.start();
t2.start();


Это простейший вариант создания потоков. Он не очень удобен, но останавливаться на потоках подробнее смысла нет.
Создав таким образом достаточное число потоков, вполне можно собрать всю информацию за ночь.
Бот для сбора статистики готов.

Возможность комментировать доступна после регистрации