vlambda博客
学习文章列表

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_DOMAINCONCURRENT_REQUESTS_PER_IP的配置值时,将并发发送这些请求。因此,爬虫的前几个请求很少遵循所需的顺序。而如果将这些设置降低到1并强制执行所需的顺序,会显著降低整体爬虫的爬网速度[1]

深度与广度优先[2]

  • 深度优先:一个一个节点往下找,不找兄弟节点,每一个深度一个节点,先进去的节点最后出来,也即是先进后出队列。
  • 广度优先:  横向取值,一个节点有兄弟节点,一同被取出来,同一个深度内有多个节点,先进去的节点的最先出来,也即是先进先出队列。

参考资料

[1]

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

- END -