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

时间:2015-01-27 11:46:52

标签: 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在调度程序类中的含义是什么?

2 个答案:

答案 0 :(得分:13)

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

self.crawler.engine.slot.scheduler

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

self.crawler.engine.scheduler_cls.has_pending_requests(self.crawler.engine.slot.scheduler)

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

len(self.crawler.engine.slot.inprogress)

答案 1 :(得分:1)

回答问题的方法:

从文档中 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'

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

从另一个SO回答中有一个关于访问(Storing scrapy queue in a database)scrapy internale queque rappresentation queuelib https://github.com/scrapy/queuelib

的建议

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