Python scrapy 0.18的单个日志文件*
我已将scrapy升级到0.18.4版,但我发现以前为每个爬行器设置单独日志文件的脚本现在不起作用:Python scrapy 0.18的单个日志文件*,python,scrapy,Python,Scrapy,我已将scrapy升级到0.18.4版,但我发现以前为每个爬行器设置单独日志文件的脚本现在不起作用: #spider/toy_spider.py def __init__(self,name=None,**kwargs): LOG_FILE = "log/production_%s.log" % (self.name) log.log.defaultObserver = log.log.DefaultObserver() log.log.defaultObser
#spider/toy_spider.py
def __init__(self,name=None,**kwargs):
LOG_FILE = "log/production_%s.log" % (self.name)
log.log.defaultObserver = log.log.DefaultObserver()
log.log.defaultObserver.start()
log.started = False
log.start(LOG_FILE)
super(MySpider, self).__init__(name, **kwargs)
它适用于scrapy 0.14.4,但不适用于0.18.4。当我运行“scrapy crawl toy_spider”时,它似乎处于某种无限循环中,消息如下所示:
2013-10-12 19:14:49-0500 [-] ERROR: 2013-10-12 19:14:49-0500 [-] ERROR: 2013-10-12 19:14:49-0500 [-] ERROR: 2013-10-12 19:14:49-0500 [-] ERROR: 2013-10-12 19:14:49-0500 [-] ERROR: 2013-10-12 19:14:49-0500 [PopAppAnnie4Itune] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
我必须手动终止该过程 该错误很可能是由于双重执行了
log.start()
。使用扩展插件连接spider\u opened
信号,并在那里执行日志设置
比如:
from twisted.python.log import FileLogObserver
from scrapy import signals
class SpiderLog(object):
@classmethod
def from_crawler(cls, crawler):
obj = cls()
crawler.signals.connect(obj.setup_logfile, signal=signals.spider_opened)
return obj
def setup_logfile(self, spider):
logfile = 'log/production_%s.log' % spider.name
fl = FileLogObserver(open(logfile, 'w+'))
fl.start()
如果项目名为mybot
,则将此代码保存在文件mybot/extensions.py
中。要启用扩展,请将此行添加到设置.py
:
EXTENSIONS = {
'mybot.extensions.SpiderLog': 100,
}
但是你会在蜘蛛打开后收到消息。如果每个爬行器只使用一个爬虫实例,则可以将日志文件设置为参数:
scrapy crawl myspider --set LOG_FILE=log/production_myspider.log
这样,您将获得所有日志消息,不需要分机。谢谢您的回复。”--set LOG_FILE='将暂时执行此任务。出于好奇,我如何才能让扩展正常工作?好的,我已经用相关设置更新了答案以启用扩展。