2013-10-08 13 views
2

저는 Python Scrapy 도구를 사용하여 웹 사이트에서 데이터를 추출하고 있습니다. proc_open()을 사용하여 PHP 코드에서 Scrapy를 실행하고 있습니다. 이제는 대시 보드를 유지해야합니다. Scrapy에서 크롤러 세부 정보를 얻는 방법이 있습니까?Python Scrapy Crawler 세부 정보를 얻으려면 어떻게해야합니까?

  1. 크롤러가 실행하는 데 걸리는 시간.
  2. 크롤러 시작 및 중지 시간.
  3. 크롤러 상태 (활성 또는 중지됨).
  4. 동시에 실행되는 크롤러 목록.
+0

:

처럼, 당신의 settings.py 파일 확장자를 추가하는 것을 잊지 마십시오. 그런 다음 치료와 직접 상호 작용하지 않고 앱을 읽습니다. 더 자세한 답변이 필요합니까? – 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. 시간 : 그 end time - start time입니다. db에서 읽거나 종료 시간과 함께 저장할 때 계산할 수 있습니다.

  2. 시작과 크롤러의 정지 시간 : spider_openedspider_closed 방법에 저장됩니다. (활성 또는 중지)

  3. 크롤러 상태 : now - last update time 5 초에 가까운 경우 크롤러가 활성화됩니다. 그렇지 않으면 마지막 업데이트가 오래 전 (30 초, 5 분 이상)이었던 경우 스파이더가 비정상적으로 중지되거나 전화가 끊겼습니다. 스파이더 레코드에 end time이 있으면 크롤러가 올바르게 완료되었습니다.

  4. 동시에 실행되는 크롤러 목록 : 프론트 엔드는 end time이 비어있는 레코드를 쿼리 할 수 ​​있습니다. 그 거미는 달리고 죽을 것이다 (last update time가 오래 전에 있었던 경우).

프로세스가 갑자기 종료 될 경우 spider_closed 신호가 호출되지 않을 것이라는 점을 고려하십시오. 죽은 레코드를 정리하거나 업데이트하려면 cron 작업이 필요합니다. 당신은 당신이 당신의 대시 보드에 표시 할 데이터를 저장하기 위해 자신의 내선 번호를 쓸 수

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

@Rho .. 확장 기능 개발에 대한 자세한 정보를 주셔서 감사합니다. 정보를 따라 진행하고 진행 상황을 알려 드리겠습니다 .. 감사합니다 .. – kishan

관련 문제