Посмотрите на использование Typhoeus и Hydra. Они упростят параллельную обработку URL-адресов.
Вам не нужно использовать Mechanize, если только вам не нужно запрашивать специальные данные с каждой страницы. Для обычного поискового робота вы можете получить тело и проанализировать его с помощью Open::URI и Nokogiri без накладных расходов Mechanize или дополнительных функций. Для ваших целей замените Open::URI на Typhoeus и позвольте Hydra управлять потоками.
Помните, что сканирование 200 000 веб-сайтов перегрузит вашу пропускную способность, если вы попытаетесь выполнить их все сразу. Это сделает ваш сайт Rails недоступным, поэтому вам нужно ограничить свои запросы. А это значит, что вам придется делать их в течение нескольких (или многих) часов. Здесь скорость не так важна, как поддержание вашего сайта в сети. Я бы, вероятно, разместил сканер на отдельной машине от сервера Rails и позволил базе данных связать все вместе.
Создайте таблицу или файл, содержащий URL-адреса сайтов, которые вы сканируете. Я бы порекомендовал таблицу, чтобы вы могли составить форму для редактирования/управления URL-адресами. Вы захотите отслеживать такие вещи, как:
- Время последнего сканирования URL. (дата/время)
- Нужно ли сканировать определенный URL-адрес (логический или char1)
- URL-адрес (строка или var char[1024] должны подойти). Это должен быть уникальный ключ.
- Просматривается ли этот URL в настоящее время (логическое значение или char1). Это очищается в начале прогона для всех записей, затем устанавливается и сбрасывается, когда паук загружает эту страницу.
- Поле, показывающее, в какие дни можно запускать этот сайт.
- Поле, показывающее, в какие часы можно запускать этот сайт.
Последние два важны. Вы не хотите сканировать небольшой сайт с недостаточной мощностью и прерывать его соединение. Это отличный способ получить бан.
Создайте еще одну таблицу, которая будет следующим URL-адресом для проверки на конкретном сайте, полученным из ссылок, с которыми вы сталкиваетесь при сканировании. Вы захотите придумать процедуру нормализации, чтобы уменьшить URL-адрес с данными и параметрами сеанса до того, что вы можете использовать для проверки уникальности. В этой новой таблице вам нужно, чтобы URL-адреса были уникальными, чтобы вы не попадали в цикл и не продолжали добавлять одну и ту же страницу с разными параметрами.
Возможно, вы захотите обратить внимание на фактический целевой URL-адрес, полученный после любых перенаправлений, а не на URL-адрес «получить», поскольку перенаправления и DNS-имена могут различаться внутри сайта, а люди, создающие контент, могут использовать разные имена хостов. Точно так же вы можете искать мета-перенаправления в головном блоке и следовать им. Это особенно раздражающий аспект написания того, что вы хотите написать.
Когда вы столкнетесь с новыми URL-адресами, проверьте, не являются ли они исходящими URL-адресами, что заставит вас покинуть этот сайт, если вы перейдете по ним. Если это так, не добавляйте их в свою таблицу URL.
Запись информации базы данных в файлы, вероятно, не поможет, потому что для поиска нужного файла вам, вероятно, все равно придется выполнять поиск в базе данных. Просто сохраните то, что вам нужно, в поле и запросите его напрямую. 200 тысяч строк для базы данных — это ничто.
Обратите внимание на правила «пауков» для сайтов, и если они предлагают API для получения данных, то используйте его, а не сканирование.
24.09.2012