Scrapy, кажется, не делает DFO - PullRequest
11 голосов
/ 03 марта 2012

У меня есть веб-сайт, для которого мой сканер должен следовать последовательности. Так, например, ему нужно пройти a1, b1, c1, прежде чем он начнет идти a2 и т. Д. Каждый из a, b и c обрабатывается различными функциями синтаксического анализа, и соответствующие URL-адреса создаются в объекте Request и выдаются. Следующий пример примерно иллюстрирует код, который я использую:

class aspider(BaseSpider):

    def parse(self,response):
        yield Request(b, callback=self.parse_b, priority=10)

    def parse_b(self,response):
        yield Request(c, callback=self.parse_c, priority=20)

    def parse_c(self,response)
        final_function()        

Однако я обнаружил, что последовательность обходов выглядит как a1, a2, a3, b1, b2, b3, c1, c2, c3, что странно, поскольку я думал, что Scrapy должен сначала гарантировать глубину.

Последовательность не обязательно должна быть строгой, но у сайта, который я очищаю, есть ограничение, поэтому Scrapy нужно начинать очистку уровня c, как только это будет возможно, прежде чем 5 уровня bs будут сканированы. Как этого достичь?

Ответы [ 3 ]

9 голосов
/ 21 августа 2012

Первый поиск по глубине - это именно то, что вы описываете:

search as deep into a's as possible before moving to b's

Чтобы изменить Scrapy для поиска в ширину (a1, b1, c1, a2 и т. Д.), Измените эти настройки:

DEPTH_PRIORITY = 1
SCHEDULER_DISK_QUEUE = 'scrapy.squeue.PickleFifoDiskQueue'
SCHEDULER_MEMORY_QUEUE = 'scrapy.squeue.FifoMemoryQueue'

* Найдено в doc.scrapy.org FAQ

1 голос
/ 08 июля 2012

Я полагаю, что вы заметили разницу между алгоритмами поиска по глубине и по ширине (информацию об обоих см. В Википедии).

В Scrapy есть возможность изменить используемый алгоритм:

"По умолчанию Scrapy использует очередь LIFO для хранения ожидающих запросов, что в основном означает, что она сканируется в порядке DFO. Этот порядок более удобен в большинстве случаев. Если вы хотите сканировать в истинном порядке BFO, вы можете сделатьэто путем установки следующих настроек: "

См. http://doc.scrapy.org/en/0.14/faq.html для получения дополнительной информации.

0 голосов
/ 13 марта 2013

Scrapy использует DFO по умолчанию. Причиной последовательности сканирования является то, что scrapy сканирует страницы асинхронно. Несмотря на то, что используется DFO, последовательность выглядит в неоправданном порядке из-за задержки в сети или чего-то еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...