Ваша проблема может быть решена путем использования расширения.
Например:
from datetime import datetime
from scrapy import signals
from twisted.internet.task import LoopingCall
class SpiderDetails(object):
"""Extension for collect spider information like start/stop time."""
update_interval = 5 # in seconds
def __init__(self, crawler):
# keep a reference to the crawler in case is needed to access to more information
self.crawler = crawler
# keep track of polling calls per spider
self.pollers = {}
@classmethod
def from_crawler(cls, crawler):
instance = cls(crawler)
crawler.signals.connect(instance.spider_opened, signal=signals.spider_opened)
crawler.signals.connect(instance.spider_closed, signal=signals.spider_closed)
return instance
def spider_opened(self, spider):
now = datetime.utcnow()
# store curent timestamp in db as 'start time' for this spider
# TODO: complete db calls
# start activity poller
poller = self.pollers[spider.name] = LoopingCall(self.spider_update, spider)
poller.start(self.update_interval)
def spider_closed(self, spider, reason):
# store curent timestamp in db as 'end time' for this spider
# TODO: complete db calls
# remove and stop activity poller
poller = self.pollers.pop(spider.name)
poller.stop()
def spider_update(self, spider):
now = datetime.utcnow()
# update 'last update time' for this spider
# TODO: complete db calls
pass
Время, затраченное на Crawler для запуска: это end time - start time
. Вы можете рассчитать его при чтении с db или хранении также с конечным временем.
Start и Stop Время гусеничного: что хранится в spider_opened
и spider_closed
методов.
Crawler Статус (Активный или остановленный): Ваш гусеничный активен, если now - last update time
близка к 5 секунд. В противном случае, если последнее обновление было давным-давно (30 секунд, 5 минут и более), ваш паук либо остановился ненормально, либо повесил трубку. Если запись паука имеет end time
, тогда гусеница закончила правильно.
Список сканеров, работающих одновременно: ваш интерфейс может запрашивать записи с пустым end time
. Эти пауки будут либо бежать, либо мертвы (в случае, если last update time
был давным-давно).
Примите во внимание, что spider_closed
сигнал не будет вызываться в случае, если процесс отделки резко. Вам нужно будет выполнить задание cron для очистки и/или обновления мертвых записей.
Не забудьте добавить расширение файла settings.py
, как:
EXTENSIONS = {
# SpiderDetails class is in the file mybot/extensions.py
'mybot.extensions.SpiderDetails': 1000,
}
Вы можете написать собственное расширение для хранения каких-либо данных, которые вы хотите отобразить на панели управления. Затем читайте в своем приложении, не взаимодействуя напрямую с помощью scrapy. Вам нужен более подробный ответ? – Rolando
@Rho. Да, более подробный ответ был бы оценен. – kishan
Привет @Rho .. Я жду вашего подробного ответа. Я буду очень полезен, если вы предоставите еще несколько материалов по этому вопросу. – kishan