Pull to refresh

С чего начинается поисковик, или несколько мыслей про crawler

Search engines *
В продолжение начатой темы про собственную поисковую машину

Итак есть несколько крупных задач, которые должна решить система поиска, начнем с того что отдельную страницу надо получить и сохранить.
Тут есть несколько способов, в зависимости от того, какие способы обработки Вы выберете в дальнейшем.

Очевидно, надо иметь очередь страниц, которые надо загрузить из web, хотя бы для того чтобы потом на них смотреть длинными зимними вечерами, если ничего лучшего не придумать. Я предпочитаю иметь очередь сайтов и их главных страниц, и локальную мини очередь того что я буду обрабатывать в данное время. Причина проста – список всех страниц которые я хотел бы загрузить просто за месяц – может существенно превысить объем моего немаленького винчестера :), поэтому я храню только то что действительно необходимо – сайты, их на данный момент 600 тысяч, и их приоритеты и времена загрузки.


При загрузке очередной страницы, все ссылки с этой страницы надо либо добавить в локальную очередь, если они остаются в рамках сайта, который я обрабатываю, либо в основной список сайтов к которым мне предстоит рано или поздно вернуться.

Сколько страниц получать с одного сайта за раз? Лично я предпочитаю не больше 100 тысяч, хотя периодически меняю это ограничение всего на 1000 страниц. Да и сайтов на которых страниц больше – не так много.
Сейчас рассмотрим подробнее:

Если мы получаем 1 страницу за раз, все страницы последовательно, то сколько страниц мы обработаем, скажем, за час?
— время получения страницы складывается из:
· времени, которое мы ждем ответа ДНС (оно, как показывает практика совсем не мало). ДНС сопоставляет имени сайта «site.ru» ip адрес сервера, на котором он лежит, и это не самая простая задача учитывая, что сайты имеют обыкновения переезжать, маршруты роутинга пакетов меняться и многое другое. Вкратце, ДНС сервер хранит таблицу адресов, и каждый раз мы стучимся к нему чтобы понять адрес – куда идти за страницей.
· времени коннекта и отсылки запроса (быстро если у вас хотя бы средний канал)
· времени получения собственно ответа – страницы

Именно поэтому Яндекс, по слухам, в свое время столкнулся с самой первой проблемой – если получать действительно много страниц, то ДНС провайдера не в состоянии справится с этим – по моему опыту задержка составляла до 10 секунд на адрес, тем более что надо еще передать ответ туда сюда по сети, и я у провайдера не один. Замечу, что при запросе последовательно 1000 страниц с одного сайта, Вы будете каждый из 1000 раз дергать провайдер.

С современным железом довольно просто поставить себе локальный кэширующий ДНС сервер в локальной сети, и грузить своей работой его, а не провайдер – тогда провайдер займется пересылкой Ваших пакетов быстрее. Однако можно заморочится и написать кэш в рамках вашего загрузчика страниц, если Вы пишете на достаточно низком уровне.
Если же используете готовые решения типа LWP или HTTP модулей для Perl, то локальный ДНС сервер будет оптимален.

Теперь положим, что ответ идет до Вас 1-10 секунд в среднем – есть быстрые сервера, а есть и очень медленные. Тогда в минуту Вы получили 6-60 страниц, в час 360-3600, в день примерно от 8000 до 60000 (осознано округляю в меньшую сторону на всевозможные задержки: в реальности при запросе 1 страницы за раз без локального ДНС, на канале 100mbit/s, Вы получите 10000 страниц в сутки, конечно, если сайты будут разные, а не один очень быстрый)

И даже учитывая, что здесь не учтено время на обработку, сохранение страниц – результат, откровенно, мизерный.

Ок, сказал я, и сделал 128 запросов за раз параллельно, все летало отлично – пик 120 тысяч страниц в час, пока не стали поступать матерные логии от админов серверов куда я стучался, о ДДОС атаках, ну да 5000 запросов за 5 минут это наверное не любой хостинг позволяет.

Все решилось тем, что одновременно грузить я стал 8-16 разных сайтов, не больше чем по 2-3 страницы параллельно. Получилось что-то около 20-30 тысяч страниц в час, и меня это устроило. Надо сказать ночью показатели намного вырастают

Полное содержание и список моих статей по поисковой машине будет обновлятся вот здесь: http://habrahabr.ru/blogs/search_engines/123671/
Tags:
Hubs:
Total votes 44: ↑37 and ↓7 +30
Views 13K
Comments Comments 57