3

Python Scrapy ツールを使用して Web サイトからデータを抽出しています。を使用して、php コードから Scrapy を起動していますproc_open()。ここで、ダッシュボードのようなものを維持する必要があります。Scrapy で次のようなクローラーの詳細を取得する方法はありますか?

  1. クローラーの実行にかかった時間。
  2. クローラーの開始時間と停止時間。
  3. クローラーのステータス (アクティブまたは停止)。
  4. 同時に実行されているクローラーのリスト。
4

1 に答える 1

6

あなたの問題は、拡張機能を使用することで解決できます。

例えば:

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_opened:およびメソッドに格納されspider_closedます。

  3. クローラーのステータス (アクティブまたは停止)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,
}
于 2013-10-10T17:33:38.077 に答える