Как получить количество запросов в очереди в режиме 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

Как только вы его получите, вам просто нужно подсчитать длину очереди.