Задать вопрос
@ivanserpov

Какой способ парсинга выбрать?

Есть 15 млн url нужно проверить ответ каждого urla на существования.
Сейчас получаю ответы на php c помощью get_headers.
Но PHP для 15 млн адресов слишком долго, подскажите как ускорить процесс ? Перейти на питон ? Или выбрать какой то готовый продукт парсер ?
Как все сделать быстро и красиво ?)
  • Вопрос задан
  • 114 просмотров
Подписаться 1 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 2
Ichi
@Ichi
Увлекаюсь программированием
Тут вариант - перейти на очереди. При чем без разницы, на каком языке будут крутится воркеры.
Например, надо проверить ссылки, кидаем в очередь все ссылки. Очередь можно использовать любую - Redis, Gearman, YandexMQ, RabbitMQ. Последний я тестил с 10к записями, но многие пишут, что с 1м медленно работает. По идее Яндекс должен нормально справляться с такими нагрузками. Ну а Редис и Гирман довольно легко переваривают по 100к записей
Я рекомендовал бы использовать Redis. И очень сильно не рекомендую использовать Mysql для этого.

А дальше просто воркеры выполняют задачу и записывают результат. Ну или кидают в другую очередь. Воркеры можно писать на любом языке. Это довольно большой плюс. Также их можно размещать на разных серверах. Можно запустить несколько воркеров на php и несколько на python. И проверить их скорость.

Работу воркеров можно через Supervisor контролировать - автозапуск, рестарт и количество запущенных воркеров.

Зачем кидать результат в другую очередь? Чтобы избежать кучи одновременных коннектов к базе. Просто один-два воркера собирают результаты и записывают в базу.

Ну и первые воркеры будут выполнять определенную задачу и будут работать с очередями. То есть, взял задание, выполнил и кинул результат. На Python подобный скрипт будет потреблять памяти 5-15Мб. Можно около сотни воркеров на слабой vds запустить.
Ответ написан
Комментировать
@humoured
Вы всё на свете найдёте в коробке с карандашами
PHP отлично справится с такой задачей, достаточно распараллелить её выполнение на несколько процессов через fork.

А вместо get_headers лучше использовать curl: в нём можно установить таймауты (это важный аспект), получить http status code и заголовки ответа;
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы