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

时间:2017-03-31 14:18:52

标签: python-3.x scrapy

我想以广度优先搜索的方式运行抓取工具 所以,我写了下面的代码。

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

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

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

如何按预期运行?

1 个答案:

答案 0 :(得分:0)

引自here

Scrapy是以广度优先还是深度优先顺序爬行?¶

默认情况下,Scrapy使用LIFO队列来存储待处理的请求 基本上意味着它以DFO顺序爬行。这个订单更方便 在多数情况下。如果您确实希望以真正的BFO顺序进行爬网,则可以执行此操作 设置以下设置:

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