3

我在一个项目中有多个蜘蛛,问题是现在我在 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)

并在每个蜘蛛初始化方法中调用它,但它不起作用..

任何帮助,将不胜感激

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 回答
1

您可以在 settings.py 文件中为FEED URI使用 Scrapy 的Storage URI 参数

  1. %(姓名)s
  2. %(时间)s

    例如:/tmp/crawled/%(name)s/%(time)s.log

于 2013-06-13T08:55:41.433 回答