如何在scrapy中获取队列中的请求数?

Shu*_*ang 16 python scrapy

我正在使用scrapy抓取一些网站.如何获取队列中的请求数?

我查看了scrapy源代码,发现scrapy.core.scheduler.Scheduler可能导致我的回答.请参阅:https://github.com/scrapy/scrapy/blob/0.24/scrapy/core/scheduler.py

两个问题:

  1. 如何在我的蜘蛛类中访问调度程序?
  2. 什么是self.dqsself.mqs在调度类是什么意思?

Bra*_*rad 15

我花了一段时间才弄清楚,但这是我用过的东西:

self.crawler.engine.slot.scheduler

这是调度程序的实例.然后,您可以调用__len__()它的方法,或者如果您对待处理的请求只需要true/false,请执行以下操作:

self.crawler.engine.scheduler_cls.has_pending_requests(self.crawler.engine.slot.scheduler)
Run Code Online (Sandbox Code Playgroud)

请注意,即使队列为空,仍然可能存在运行请求.要检查当前正在运行的请求数,请使用:

len(self.crawler.engine.slot.inprogress)
Run Code Online (Sandbox Code Playgroud)


abe*_*rna 0

回答您的问题的方法:

来自文档 http://readthedocs.org/docs/scrapy/en/0.14/faq.html#does-scrapy-crawl-in-breath-first-or-depth-first-order

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

DEPTH_PRIORITY = 1
SCHEDULER_DISK_QUEUE = 'scrapy.squeue.PickleFifoDiskQueue'
SCHEDULER_MEMORY_QUEUE = 'scrapy.squeue.FifoMemoryQueue'
Run Code Online (Sandbox Code Playgroud)

因此self.dqsself.mqs是自动esplicative(磁盘队列调度程序和内存队列调度程序)。

从另一个SO答案中,有一个关于访问(在数据库中存储scrapy队列)scrapy insidee queque rappresentation queuelib https://github.com/scrapy/queuelib的建议

一旦你得到它,你只需要计算队列的长度。