0

我有一个小的scrapy 扩展,它查看爬虫的stats 对象,如果爬虫抛出了某种类型的日志消息(例如WARNING、CRITICAL、ERROR),它会向我发送一封电子邮件。

这些统计信息可以通过蜘蛛统计对象 (crawler.stats.get_stats()) 访问,例如:

crawler.stats.get_stats().items()
 [..]
 'log_count/DEBUG': 9,
 'log_count/ERROR': 2,
 'log_count/INFO': 4,
 [..]

如果我在 scrapinghub 上运行蜘蛛,日志统计信息不存在。还有很多其他方面(例如异常计数等),但缺少日志计数。有人知道如何将它们带到那里或如何在抓取中心上访问它们吗?

在蜘蛛关闭后,我还检查了“Dumping Scrapy stats”值。如果我在我的机器上运行它,日志计数就在那里,如果我在 scrapinghub 上运行它,日志计数就会丢失。

4

2 回答 2

1

这里的问题是,scrapy 在日志观察器中填充了这些统计信息;但是 Scrapinghub 没有使用默认的日志观察器。可能在他们的论坛上报告这个是最好的,你也可以在上面链接这个问题。

于 2014-12-02T22:27:57.577 回答
0

这也可能对其他人有所帮助。我编写了一个小插件来收集日志统计信息并将它们保存在带有自己前缀的 stats dict 中。

要激活它,请将其保存到文件(例如 loggerstats.py)并在爬虫 settings.py 中将其作为扩展名激活:

EXTENSIONS = {
    'loggerstats.LoggerStats': 10,
}

剧本:

from scrapy import log
from scrapy.log import level_names
from twisted.python import log as txlog


class LoggerStats(object):

    def __init__(self, crawler, prefix='stats_', level=log.INFO):
        self.level = level
        self.crawler = crawler
        self.prefix = prefix
        txlog.startLoggingWithObserver(self.emit, setStdout=False)

    @classmethod
    def from_crawler(cls, crawler):
        o = cls(crawler)
        return o

    def emit(self, ev):
        level = ev.get('logLevel')
        if level >= self.level:
            sname = '%slog_count/%s' % (self.prefix, level_names.get(level, level))
            self.crawler.stats.inc_value(sname)

然后它将计算日志并在爬虫统计信息中维护计数。例如:

stats_log_count/INFO: 10
stats_log_count/WARNING: 1
stats_log_count/CRITICAL: 5
于 2014-12-08T21:42:00.260 回答