【问题标题】:Scrapy - Get or flush stats while spider is runningScrapy - 在蜘蛛运行时获取或刷新统计信息
【发布时间】:2016-07-13 19:38:03
【问题描述】:

有没有办法刷新 当前运行 抓取的统计信息(抓取的页面/项目)?我进行了很长的爬网,偶尔会出现到目前为止的统计数据,但很快就会被更多信息推开。如果可能的话,我想定期检查这些统计数据 - 所以我大致知道需要多长时间,或者我是否应该过早完成。

作为一个子问题 - 有没有办法杀死蜘蛛,这样到目前为止已经抓取的内容仍然会输出到指定的输出文件? (-o 标志)

任何帮助将不胜感激。

【问题讨论】:

标签: python scrapy web-crawler scrapy-spider


【解决方案1】:

正如@kiran.koduru 所提到的,您可以使用扩展以及twistedLoopingCall 类在给定的时间间隔内保持统计数据。

例如:

from scrapy import signals
from twisted.internet.task import LoopingCall


class PersistStats(object):
    """An extension to persist stats on a given interval.

    Settings
    --------
    PERSIST_STATS_INTERVAL : integer (default: 60)
         Interval in seconds.

    """

    def __init__(self, interval):
        self.interval = interval
        self.tasks = {}

    @classmethod
    def from_crawler(cls, crawler):
        obj = cls(crawler.settings.getint('PERSIST_STATS_INTERVAL', 60))
        crawler.signals.connect(obj.spider_opened, signal=signals.spider_opened)
        crawler.signals.connect(obj.spider_closed, signal=signals.spider_closed)
        return obj

    def spider_opened(self, spider):
        task = self.tasks[spider.name] = LoopingCall(self.perist_stats, spider)
        task.start(self.interval)

    def spider_closed(self, spider):
        task = self.tasks.pop(spider.name)
        task.stop()

    def perist_stats(self, spider):
        # TODO: store stats somewhere.
        data = spider.crawler.stats.get_stats()
        spider.logger.info("Persisting stats:\n%s", data)

关于第二个问题,如果你优雅地杀死蜘蛛(一个 CTRL+C),它应该正确存储文件。否则,您将需要提供自己的 Feed 导出器或扩展程序以将项目直接写入目标文件,而不是在临时文件中缓冲。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    相关资源
    最近更新 更多