Как получить количество запросов в очереди в режиме scrapy?
Я использую scrapy
для сканирования некоторых веб-сайтов. Как получить количество запросов в очереди?
Я посмотрел исходный код scrapy
, и найти scrapy.core.scheduler.Scheduler
может привести к моему ответу. См.: https://github.com/scrapy/scrapy/blob/0.24/scrapy/core/scheduler.py
Два вопроса:
- Как получить доступ к планировщику в моем классе пауков?
- Что означают
self.dqs
и self.mqs
в классе планировщика?
Ответы
Ответ 1
Мне потребовалось некоторое время, чтобы понять, но вот что я использовал:
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)
Ответ 2
Подход к ответам на ваши вопросы:
Из документации
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.dqs
и self.mqs
являются автоэскивативными (планировщик очереди дисков и планировщик очереди памяти.
Из другого SO-ответа есть предложение о доступе к (Сохранению очереди проверки в базе данных) scrapy internale queque rappresentation queuelib
https://github.com/scrapy/queuelib
Как только вы его получите, вам просто нужно подсчитать длину очереди.