我想以广度优先搜索的方式运行抓取工具 所以,我写了下面的代码。
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,....
如何按预期运行?
答案 0 :(得分:0)
引自here
默认情况下,Scrapy使用LIFO队列来存储待处理的请求 基本上意味着它以DFO顺序爬行。这个订单更方便 在多数情况下。如果您确实希望以真正的BFO顺序进行爬网,则可以执行此操作 设置以下设置:
DEPTH_PRIORITY = 1 SCHEDULER_DISK_QUEUE = 'scrapy.squeues.PickleFifoDiskQueue' SCHEDULER_MEMORY_QUEUE = 'scrapy.squeues.FifoMemoryQueue'