3

私は1つのプロジェクトに複数のスパイダーを持っています、問題は今私がSETTINGSのようにLOG_FILEを定義していることです

LOG_FILE = "scrapy_%s.log" % datetime.now()

私が欲しいのはscrapy_SPIDERNAME_DATETIME

しかし、私は log_file name に Spidername を提供することができません..

私が見つけた

scrapy.log.start(logfile=None, loglevel=None, logstdout=None)

各スパイダーinitメソッドでそれを呼び出しましたが、機能していません..

任意の助けをいただければ幸いです

4

3 に答える 3

7

ログオブザーバーはこの時点ですでに開始されているため、スパイダーはそれ自体__init__()を呼び出すのに十分な早さではありません。log.start()したがって、ロギング状態を再初期化して、Scrapy をだまして (再) 起動させる必要があります。

スパイダー クラス ファイルで:

from datetime import datetime
from scrapy import log
from scrapy.spider import BaseSpider

class ExampleSpider(BaseSpider):
    name = "example"
    allowed_domains = ["example.com"]
    start_urls = ["http://www.example.com/"]

    def __init__(self, name=None, **kwargs):
        LOG_FILE = "scrapy_%s_%s.log" % (self.name, datetime.now())
        # remove the current log
        # log.log.removeObserver(log.log.theLogPublisher.observers[0])
        # re-create the default Twisted observer which Scrapy checks
        log.log.defaultObserver = log.log.DefaultObserver()
        # start the default observer so it can be stopped
        log.log.defaultObserver.start()
        # trick Scrapy into thinking logging has not started
        log.started = False
        # start the new log file observer
        log.start(LOG_FILE)
        # continue with the normal spider init
        super(ExampleSpider, self).__init__(name, **kwargs)

    def parse(self, response):
        ...

出力ファイルは次のようになります。

scrapy_example_2012-08-25 12:34:48.823896.log

于 2012-08-25T18:14:49.693 に答える
1

settings.pyにBOT_NAMEが含まれている必要があります。これはプロジェクト/スパイダー名です。だからあなたの場合、これは

LOG_FILE = "scrapy_%s_%s.log" % (BOT_NAME, datetime.now())

これは、Scrapyが内部で行うこととほとんど同じです

しかし、log.msgを使用してみませんか。ドキュメントには、これはスパイダー固有のものであると明確に記載されています。これを使用して、大きなログファイルからさまざまなスパイダーログメッセージを抽出/ grep/...する方が簡単な場合があります。

より複雑なアプローチは、スパイダーSPIDER_MODULESリストの場所を取得し、これらのパッケージ内のすべてのスパイダーをロードすることです。

于 2012-08-23T07:26:50.653 に答える