Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Сбор данных с интернета : Теория и Решения. Пишем простейший сборщик (Многопоточность)


многопоточный сбор Google API

В прошлый разя описал как организовать сбор данных на PHP, используя прокси сервера. Скрипт брал слова из файла и запрашивал поисковые результаты по ним через Goggle API. Все это работало через прокси, что существенно повышало скорость работы с Google API. Но все же был существенный недостаток в работе этого скрипта : в текущий момент времени шел только один запрос, хоть мы и использовали прокси сервера. Однако в один и тот же момент времени мы можем делать сразу несколько запросов через прокси, что существенно увеличит скорость работы нашего скрипта.

PHP Скрипт Мультипоточного сбора

Я решил сделать код который будет разбивать задачу на заданное количество потоков. Создавать папки с PHP сборщиком заданной части поисковых запросов и запускать сбор в несколько потоков. Также для этой задачи прокси тоже будут разбиваться на заданное число частей, чтобы в каждом из сборщиков были свои непересекающиеся с другими прокси. После некоторого времени у меня получился следующий код : здесь$num_threads- число потоков сборщика.$threads_folder - папка где будут создаваться потоки. Этот код разбивает файлы проксейin/proxy.txt и поисковых результатовin/queries.txt на заданное количество частей, копирует код каждого сборщика из ./src и создает папки со всей структурой для каждого потока.

Далее создается файл run.bat в главной папке, который запускает на выполнение файлы run.php для каждого потока. Тут следует отметить особенности создания этого bat файла, каждый поток запускается следующим образом : start "номер потока" /i /b "c:/php/php.exe" "Полный путь к run.php каждого потока" :

  • start - запускать php.exe в асинхронном режиме
  • /i - брать настройки из родительского bat файла для каждого потока
  • /b - не создавать отдельных окон консольных окон для каждого потока
И в файле run.php первая строчкаchdir(__DIR__); - устанавливает текущую папку скрипта для каждого потока. Это надо чтобы при любой ситуации ПХП выстраивал все подключаемые библиотеки относительно текущей папки для каждого потока. И командаsystem("cmd /c \"".$bat_file_path."\""); - запускает созданный bat файл, который запускает на сбор все потоки. В итоге мы получаем следующий лог, например для первого потока :

лог многопоточного сбора Google API

Выводы

Запустив на сбор этот код мы собираем 45 запросов где-то за 55 сек. Т.е примерно в 3 раза быстрее для 5 потоков, по сравнению со сбором в один поток, зависимость тут не линейная, но очень близкая к ней. Таким образом чем большее количество потоков мы запускаем тем выше у нас скорость. Но тут большую роль играет качество и скорость прокси серверов. Т.е на каждый поток нужно как минимум 30-60 хороших прокси , чтобы было как можно меньше неудачных запросов для каждого прокси. И тут еще лучше всего воспользоваться платными прокси серверами, но также есть несколько вариантов как улучшить работу скрипта не прибегая к платным прокси серверам. Это следующее :

  • Увеличение эффективности использования прокси
  • Оптимизация узких мест скрипта
  • Работа через TOR и другие анонимайзеры
  • Создание своих прокси серверов на VPS
  • Использование VPN
И об этом я расскажу в следующих статьях. Кроме того в процессе работы у нас уже получилось достаточно много кода. В следующем посту я оптимизирую этот код, заодно покажу основные принципы оптимизации и проектирования для сбора данных на PHP. Ну и как всегда напоследок я даю ссылки на материалы на x-scripts.com касательно этого скрипта.

Материалы

Весь исходный код по этой статье можноскачать здесь. Руководство «Как запустить этот и другие PHP скрипты с этого сайта» всегда можно найтиздесь. Где взять платные и бесплатные прокси сервера, можно найтиздесь.


В избранное