0

我已将我的 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.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)

我必须手动终止该过程。

4

1 回答 1

1

该错误很可能是由于log.start(). 使用扩展来连接spider_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。要启用扩展,请将此行添加到您的settings.py

EXTENSIONS = {
    'mybot.extensions.SpiderLog': 100,
}

但是你会在蜘蛛打开后收到消息。如果每个蜘蛛只使用一个爬虫实例,则可以将日志文件设置为参数:

scrapy crawl myspider --set LOG_FILE=log/production_myspider.log

这样,您将获得所有日志消息并且不需要扩展。

于 2013-10-14T13:12:00.720 回答