我正在使用scrapy
抓取一些网站。如何获取队列中的请求数?
我查看了scrapy
源代码,发现scrapy.core.scheduler.Scheduler
可能会导致我的回答。请参阅:https://github.com/scrapy/scrapy/blob/0.24/scrapy/core/scheduler.py
两个问题:
self.dqs
和self.mqs
在调度程序类中的含义是什么?答案 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)
回答问题的方法:
默认情况下,Scrapy使用LIFO队列存储待处理的请求, 这基本上意味着它以DFO顺序爬行。这个订单更多 在大多数情况下方便。如果您确实想要以真正的BFO顺序进行爬网, 您可以通过设置以下设置来完成此操作:
DEPTH_PRIORITY = 1
SCHEDULER_DISK_QUEUE = 'scrapy.squeue.PickleFifoDiskQueue'
SCHEDULER_MEMORY_QUEUE = 'scrapy.squeue.FifoMemoryQueue'
因此self.dqs
和self.mqs
是自动识别的(磁盘队列调度程序和内存队列调度程序。
从另一个SO回答中有一个关于访问(Storing scrapy queue in a database)scrapy internale queque rappresentation queuelib
https://github.com/scrapy/queuelib
一旦你得到它,你只需要计算队列的长度。