Scrapy, похоже, не делает DFO

У меня есть веб-сайт, для которого мой искатель должен следовать последовательности. Так, например, ему нужно перейти 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, как только он сможет до сканирования уровня bs уровня. Как это можно достичь?

Ответ 1

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

search as deep into a 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 Часто задаваемые вопросы

Ответ 2

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

У Scrapy есть возможность изменить, какой алгоритм используется:

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

Подробнее см. http://doc.scrapy.org/en/0.14/faq.html.

Ответ 3

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