如何使用Scrapy(Python3)进行广度优先搜索爬行?

asa*_*i72 5 scrapy python-3.x

我想将爬虫作为广度优先搜索来运行。
所以,我写了下面的代码。

from scrapy.spider import BaseSpider
from scrapy.http   import Request

class MySpider(BaseSpider):
    start_urls = ['http://example.com/a']

    def parse(self, response):
        next_a = response.css('.next::attr(href)').extract_first()
        if next_a:
            yield Request(next_a, callback=self.parse, priority = 3)

        for b in response.css('.b::attr("href")'):
            yield Request(b, callback=self.parse_b, priority = 2)

    def parse_b(self, response):
        pass
Run Code Online (Sandbox Code Playgroud)

我希望这个爬虫能按如下方式移动。
a1, a2, a3, ..., an, b1, b2, b3, ...., bn

但实际上会是这样的。
a1, b1, b2, ...., b_n1, a2, b_n1+1, b_n1+2, ....

怎样才能按预期运行呢?

Uma*_*air 6

这里引用

Scrapy 是按广度优先还是深度优先的顺序爬行?

默认情况下,Scrapy 使用LIFO队列来存储待处理的请求,这基本上意味着它以DFO 顺序爬行。大多数情况下,这个顺序更方便。如果您确实想以真正的BFO order抓取,您可以通过设置以下设置来实现:

深度_优先级 = 1
SCHEDULER_DISK_QUEUE = 'scrapy.squeues.PickleFifoDiskQueue'
SCHEDULER_MEMORY_QUEUE = 'scrapy.squeues.FifoMemoryQueue'