2013-06-12 2 views
0

Надеюсь, вы можете мне помочь. Я пытаюсь просканировать сайт с 4500 ссылками, содержащими информацию. Таким образом, структура такова:Сканирование большого сайта, обработка тайм-аутов

Tier 1 (просто разные категории)
Tier 2 (содержащий различные темы)
Tier 3 (содержит информацию о топиках)

Так мой сценарий открывает каждую категорию в цикле - затем открывает тему по теме и извлекает всю информацию из Уровня 3. Но поскольку есть такие темы 4500, у меня есть проблемы, из-за которых у меня иногда возникает ошибка таймаута, и после этого я должен попытаться начать (Иногда после 200 тем и в другое время это было после 2200 тем). Мой вопрос в том, как я могу сделать это правильно, поэтому, если он сработает, я могу перейти к следующему разделу, где он разбился раньше, а не с самого начала. Я новичок в Ruby и Crawling и буду благодарен за каждый совет.

Спасибо!

ответ

0

Вам определенно необходимо разделить процедуру анализатора, и сохранить временные данные в БД одновременно.

Мой подход был бы:

  1. Crawl Tier 1 для сбора категорий. Сохраните их во временную БД.
  2. Используя БД, обходите уровень 2, чтобы собрать список тем. Сохраните их в БД.
  3. Используя БД, сканируйте уровень 3, чтобы получить фактическое содержимое. Сохраните их в БД, пропустите/повторите попытку, если возникнет ошибка.
+0

«Временная БД» может быть фактической реляционной базой данных, или вы можете просто использовать «Хэш»/«Массив» Ruby. – saki7

+0

Являются ли временные БД хранимыми где-то или они заполняются каждый раз снова и снова. Так, например, если бы я сделал первые 2 шага, и у них есть, а затем шаг 3, то не получится. Если я перезапущу, должны быть шаги 1 и 2, сделанные еще один раз, или только после перезапуска шага 3. Если это так, я должен сохранить, где это не удалось? – user2448801

+0

Это полностью зависит от вашего выбора и дизайна мысли. Если вы хотите отказаться от ошибок после перезапуска приложения, вы должны сохранить его на постоянном хранилище; иначе вы можете сохранить его в памяти. По-моему, я бы решил сохранить его в простом файле JSON. ActiveSupport предоставляет метод 'to_json' для хэшей и массивов. Дальнейший вопрос, связанный с дизайном приложения, будет слишком общим. Вы должны задать более конкретный вопрос в новом потоке. – saki7

1

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

См. "DRY search every page of a site with nokogiri" и "What are some good Ruby-based web crawlers?" и "What are the key considerations when creating a web crawler?" для получения дополнительной информации. Они охватывают большое количество вещей, которые я делаю, когда пишу пауки.

Смежные вопросы