вопрос питона / скрапа: как избежать бесконечных петель - PullRequest
2 голосов
/ 13 июля 2011

Я использую фреймворк для поиска веб-страниц, scrapy, для сбора данных на некоторых сайтах. Я пытаюсь использовать CrawlSpider, и на страницах есть кнопки «назад» и «далее». URL-адреса в формате

www.qwerty.com/###

где ### - это число, которое увеличивается при каждом нажатии следующей кнопки. Как мне отформатировать правила, чтобы не происходил бесконечный цикл.

Вот мое правило:

rules = (
        Rule(SgmlLinkExtractor(allow='http://not-a-real-site.com/trunk-framework/791'),follow=True,callback='parse_item',
    ),
)

Ответы [ 3 ]

8 голосов
/ 14 июля 2011

Бесконечный цикл не должен происходить.Scrapy отфильтровывает дубликаты URL.

1 голос
/ 22 июля 2011

Вы можете установить ограничение на число следующих ссылок: используйте настройку DEPTH_LIMIT.

В качестве альтернативы вы можете проверить текущую глубину в функции обратного вызова синтаксического анализа:

def parse(self, response):
    if response.meta['depth'] > 100:
        print 'Loop?'
1 голос
/ 16 июля 2011

что заставляет вас думать, что программа войдет в бесконечный цикл, как вы ее тестировали? Scrapy не будет загружать URL, если он уже сделал это раньше. Вы пытались просмотреть все страницы, что происходит, когда вы нажимаете «Далее» на последней странице?

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

...