Scrapy采集的顺序是深度优先还是广度优先?
问题描述
Scrapy
采集的顺序是深度优先还是广度优先?
问题解答
默认情况下,Scrapy
使用LIFO
(后进先出)队列存储待发出的请求,这基本上意味着它按DFO
(深度优先)顺序采集数据。这种顺序在大多数情况下都比较方便。如果你确实想要以真实的BFO(广度优先)顺序采集数据,可以通过设置以下设置来实现:
DEPTH_PRIORITY = 1
SCHEDULER_DISK_QUEUE = 'scrapy.squeues.PickleFifoDiskQueue'
SCHEDULER_MEMORY_QUEUE = 'scrapy.squeues.FifoMemoryQueue'
但是事情又并非如此绝对,当队列中待采集的请求低于CONCURRENT_REQUESTS
, CONCURRENT_REQUESTS_PER_DOMAIN
或 CONCURRENT_REQUESTS_PER_IP
的配置值时,将并发发送这些请求。因此,爬虫的前几个请求很少遵循所需的顺序。而如果将这些设置降低到1并强制执行所需的顺序,会显著降低整体爬虫的爬网速度[1]。
深度与广度优先[2]
-
深度优先:一个一个节点往下找,不找兄弟节点,每一个深度一个节点,先进去的节点最后出来,也即是先进后出队列。 -
广度优先: 横向取值,一个节点有兄弟节点,一同被取出来,同一个深度内有多个节点,先进去的节点的最先出来,也即是先进先出队列。
参考资料
Scrapy官方文档: https://docs.scrapy.org/en/latest/faq.html#does-scrapy-crawl-in-breadth-first-or-depth-first-order
[2]深度与广度优先: https://www.jianshu.com/p/bff70b786bb6