我在一个项目中有多个蜘蛛,问题是我现在在SETTINGS中定义 LOG_FILE ,如
LOG_FILE = "scrapy_%s.log" % datetime.now()
我想要的是scrapy_SPIDERNAME_DATETIME
但我无法在log_file名称中提供spidername。
我找到了
scrapy.log.start(logfile=None, loglevel=None, logstdout=None)
并在每个蜘蛛 init 方法中调用它,但它不起作用..
任何帮助将不胜感激
答案 0 :(得分: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
答案 1 :(得分:1)
您的settings.py中应该有a BOT_NAME。这是项目/蜘蛛名称。所以在你的情况下,这将是
LOG_FILE = "scrapy_%s_%s.log" % (BOT_NAME, datetime.now())
这与Scrapy internally
几乎相同但为什么不使用log.msg。文档明确指出这是针对蜘蛛特定的东西。使用它可能更容易,只需从大日志文件中提取/ grep / ...不同的蜘蛛日志消息。
更复杂的方法是获取蜘蛛SPIDER_MODULES列表的位置,并将所有蜘蛛加载到这些包中。
答案 2 :(得分:1)
您可以在settings.py文件中使用Scrapy的 Storage URI parameters 获取 FEED URI 。
%(时间)类
例如:/ tmp / crawled /%(name)s /%(time)s.log