美文网首页
scrapy信号(Signals)和数据收集(Stats Col

scrapy信号(Signals)和数据收集(Stats Col

作者: 俊采星驰_87e0 | 来源:发表于2018-06-28 17:50 被阅读0次

    信号(Signals)

    记录运行时间主要用的的就是scrapy的singal信号管理,点击查看详情

    根据各种信号记录数量和时间。

    数据收集(Stats Collection)

    Scrapy 提供了方便的收集数据的机制。数据以 key/value 方式存储,值大多是计数值。该机制叫做数据收集器(Stats Collector),可以通过 Crawler API 的属性 stats来使用。

    无论数据收集(stats collection)开启或者关闭,数据收集器永远都是可用的。因此可以 import 进自己的模块并使用其 API(增加值或者设置新的状态键(stats keys))。该做法是为了简化数据收集的方法:不应该使用超过一行代码来收集你的 spider,Scrapy 扩展或者任何你使用数据收集器代码里头的状态。

    数据收集器的另一个特性是(在启用状态下)很高效,(在关闭情况下)非常高效(几乎察觉不到)。

    数据收集器对每个 spider 保持一个状态。当 spider 启动时,该表自动打开,当 spider 关闭时,自动关闭。

    常见数据收集器使用方法:

    通过 stats 属性来使用数据收集器。下面是在扩展中使用的例子:

    class ExtensionThatAccessStats(object):
    
        def __init__(self, stats):
            self.stats = stats
    
        @classmethod
        def from_crawler(cls, crawler):
            return cls(crawler.stats)
    
    #设置数据:
    stats.set_value('hostname', socket.gethostname())
    
    #增加数据值:
    stats.inc_value('pages_crawled')
    
    #当新的值比原来的值大时设置数据:
    stats.max_value('max_items_scraped', value)
    
    #当新的值比原来的值小时设置数据:
    stats.min_value('min_free_memory_percent', value)
    
    #获取数据:
    >>> stats.get_value('pages_crawled')
    8
    
    #获取所有数据:
    >>> stats.get_stats()
    {'pages_crawled': 1238, 'start_time': datetime.datetime(2009, 7, 14, 21, 47, 28, 977139)}
    

    结合信号使用

    import datetime
    
    from scrapy import signals
    
    class CoreStats(object):
    
        def __init__(self, stats):
            self.stats = stats
    
        @classmethod
        def from_crawler(cls, crawler):
            o = cls(crawler.stats)
            crawler.signals.connect(o.spider_opened, signal=signals.spider_opened)
            crawler.signals.connect(o.spider_closed, signal=signals.spider_closed)
            crawler.signals.connect(o.item_scraped, signal=signals.item_scraped)
            crawler.signals.connect(o.item_dropped, signal=signals.item_dropped)
            crawler.signals.connect(o.response_received, signal=signals.response_received)
            return o
    
        def spider_opened(self, spider):
            self.stats.set_value('start_time', datetime.datetime.utcnow(), spider=spider)
    
        def spider_closed(self, spider, reason):
            self.stats.set_value('finish_time', datetime.datetime.utcnow(), spider=spider)
            self.stats.set_value('finish_reason', reason, spider=spider)
    
        def item_scraped(self, item, spider):
            self.stats.inc_value('item_scraped_count', spider=spider)
    
        def response_received(self, spider):
            self.stats.inc_value('response_received_count', spider=spider)
    
        def item_dropped(self, item, spider, exception):
            reason = exception.__class__.__name__
            self.stats.inc_value('item_dropped_count', spider=spider)
            self.stats.inc_value('item_dropped_reasons_count/%s' % reason, spider=spider)
    

    相关文章

      网友评论

          本文标题:scrapy信号(Signals)和数据收集(Stats Col

          本文链接:https://www.haomeiwen.com/subject/ibknyftx.html