Python Scrapy ツールを使用して Web サイトからデータを抽出しています。を使用して、php コードから Scrapy を起動していますproc_open()
。ここで、ダッシュボードのようなものを維持する必要があります。Scrapy で次のようなクローラーの詳細を取得する方法はありますか?
- クローラーの実行にかかった時間。
- クローラーの開始時間と停止時間。
- クローラーのステータス (アクティブまたは停止)。
- 同時に実行されているクローラーのリスト。
あなたの問題は、拡張機能を使用することで解決できます。
例えば:
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
クローラーの実行にかかった時間: つまり ですend time - start time
。終了時間と同様に、db からの読み込み時または保存時に計算できます。
クローラーの開始時刻と停止時刻spider_opened
:およびメソッドに格納されspider_closed
ます。
クローラーのステータス (アクティブまたは停止)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,
}