2013-10-08 4 views
2

Я использую инструмент Python Scrapy для извлечения данных с веб-сайтов. Я увольняю Scrapy из своего php-кода, используя proc_open(). Теперь мне нужно поддерживать тип Dashboard. Есть ли способ в Scrapy получить информацию о Гусеницах, например:Как получить информацию об искателях Python Scrapy?

  1. Время, проведенное Crawler для запуска.
  2. Начало и остановка Время гусеничного.
  3. Состояние гусеницы (активен или остановлен).
  4. Список сканеров, работающих одновременно.
+0

Вы можете написать собственное расширение для хранения каких-либо данных, которые вы хотите отобразить на панели управления. Затем читайте в своем приложении, не взаимодействуя напрямую с помощью scrapy. Вам нужен более подробный ответ? – Rolando

+0

@Rho. Да, более подробный ответ был бы оценен. – kishan

+0

Привет @Rho .. Я жду вашего подробного ответа. Я буду очень полезен, если вы предоставите еще несколько материалов по этому вопросу. – kishan

ответ

4

Ваша проблема может быть решена путем использования расширения.

Например:

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 
  1. Время, затраченное на Crawler для запуска: это end time - start time. Вы можете рассчитать его при чтении с db или хранении также с конечным временем.

  2. Start и Stop Время гусеничного: что хранится в spider_opened и spider_closed методов.

  3. Crawler Статус (Активный или остановленный): Ваш гусеничный активен, если now - last update time близка к 5 секунд. В противном случае, если последнее обновление было давным-давно (30 секунд, 5 минут и более), ваш паук либо остановился ненормально, либо повесил трубку. Если запись паука имеет end time, тогда гусеница закончила правильно.

  4. Список сканеров, работающих одновременно: ваш интерфейс может запрашивать записи с пустым end time. Эти пауки будут либо бежать, либо мертвы (в случае, если last update time был давным-давно).

Примите во внимание, что spider_closed сигнал не будет вызываться в случае, если процесс отделки резко. Вам нужно будет выполнить задание cron для очистки и/или обновления мертвых записей.

Не забудьте добавить расширение файла settings.py, как:

EXTENSIONS = { 
    # SpiderDetails class is in the file mybot/extensions.py 
    'mybot.extensions.SpiderDetails': 1000, 
} 
+0

@Rho .. Спасибо за подробную информацию о разработке расширения. Я буду следить за информацией и сообщать вам о моем прогрессе. Спасибо. – kishan

Смежные вопросы