美文网首页
Scrapy扩展

Scrapy扩展

作者: _张旭 | 来源:发表于2018-07-14 17:15 被阅读0次

先看一个例子

class MyCustomStatsExtension(object):
    """
    这个extension专门用来定期搜集一次stats
    """
    def __init__(self, stats):
        self.stats = stats
        self.time = 60.0

    @classmethod
    def from_crawler(cls, crawler, *args, **kwargs):
        instance = cls(crawler.stats)
        crawler.signals.connect(instance.spider_opened, signal=signals.spider_opened)
        crawler.signals.connect(instance.spider_closed, signal=signals.spider_closed)
        return instance

    def spider_opened(self):
        self.tsk = task.LoopingCall(self.collect)
        self.tsk.start(self.time, now=True)

    def spider_closed(self):        
        if self.tsk.running:
            self.tsk.stop()

    def collect(self):
        #这里收集stats并写入相关的储存。
        #目前展示是输出到终端
        print u'将展示收集到的数据'
        print self.stats.get_stats()

解释

Scrapy API的主要入口是 Crawler 的实例对象, 通过类方法 from_crawler 将它传递给扩展(extensions),详细解释参见这里

所以第一步通过from_crawler类方法获取到Crawler对象。

@classmethod
def from_crawler(cls, crawler, *args, **kwargs):
    instance = cls(crawler.stats)
    crawler.signals.connect(instance.spider_opened, signal=signals.spider_opened)
    crawler.signals.connect(instance.spider_closed, signal=signals.spider_closed)
    return instance
  • 我的理解是当项目启动后就开启了一个抓取的行为这个行为通过Crawler对象来管理,表现为对spider的控制和状态指示。

之后通过from_crawler类方法获取的crawler注册信号处理方法:

crawler.signals.connect(instance.spider_opened, signal=signals.spider_opened)
crawler.signals.connect(instance.spider_closed, signal=signals.spider_closed)

这里对应的信号spider_opened注册为instancespider_opened方法,信号spider_closed注册为instancespider_closed方法。

  • spider_opened 信号在爬虫开启时由spider发送。
  • spider_closed 信号在爬虫结束时由spider发送。

而 instance 是通过instance = cls(crawler.stats)实例化的本扩展的一个实例。作用在于将crawler.stats传递给本扩展,并暴露自己的方法用于crawler信号的注册。

这样启动项目后spider发送spider_opened信号,本扩展会接收到这个信号执行绑定的spider_opened方法:

def spider_opened(self):
    self.tsk = task.LoopingCall(self.collect)
    self.tsk.start(self.time, now=True)

通过这个方法打开一个定时任务,间隔60秒执行一次本扩展的collect方法打印spider的状态:

def collect(self):
    #这里收集stats并写入相关的储存。
    #目前展示是输出到终端
    print u'将展示收集到的数据'
    print self.stats.get_stats()

同理,spider关闭后,扩展接收到spider_closed信号,执行本扩展的spider_closed方法关闭这个定时任务。

def spider_closed(self):        
    if self.tsk.running:
        self.tsk.stop()

相关文章

  • scrapy 爬虫

    scrapy 官方文档 scrapy的信号量文档使用 scrapy的扩展文档使用 scrapy统计数据收集 安装:...

  • Scrapy扩展

    先看一个例子 解释 Scrapy API的主要入口是 Crawler 的实例对象, 通过类方法 from_craw...

  • Scrapy扩展

    Scrapy CrawlSpider了解 scrapy通用爬虫 CrawlSpider它是Spider的派生类,S...

  • Scrapy流程及模块介绍

    参考资料:python网络爬虫开发实战 1.scrapy的优势 Scrapy框架具有高效爬取速率,相关扩展组件多,...

  • Scrapy爬虫入门教程 Settings(设置)

    设置 Scrapy设置允许您自定义所有Scrapy组件的行为,包括核心,扩展,管道和爬虫本身。 设置的基础结构提供...

  • scrapy信号signals

    Scrapy广泛使用信号来通知特定事件发生的时间。 可以在Scrapy项目中捕获一些这些信号(例如,使用扩展名)来...

  • Scrapy(二)- 自定义扩展,配置文件详解

    Scrapy 自定义扩展 自定义扩展时,利用信号在指定位置注册指定操作。 最后需要在settings.py里的修改...

  • (2018-05-22.Python从Zero到One)6、(爬

    scheduler.py 此扩展是对scrapy中自带的scheduler的替代(在settings的SCHEDU...

  • scrapy实战笔记

    一,基础 scrapy优势:异步IO,性能强;内置功能丰富(css,xpath);易扩展爬虫简要步骤:URL分析,...

  • Scrapy 扩展:解决scrapy-redis 调度空跑问题

    一:前言 正常情况下使用scrapy-redis 做分布式使用,这个比较方便简单,但是有个问题:当redis调度队...

网友评论

      本文标题:Scrapy扩展

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