zoukankan      html  css  js  c++  java
  • scrapy 基础组件专题(四):信号运用

    一、scrapy信号使用的简单实例

    import scrapy
    from scrapy import signals
    from ccidcom.items import CcidcomItem
    
    
    class CcidcomSpider(scrapy.Spider):
        name = 'ccidcomSpider'
        start_urls = ['http://www.ccidcom.com/yaowen/index.html']
        item_count = 0
    
        @classmethod
        def from_crawler(cls, crawler, *args, **kwargs):
            spider = super(CcidcomSpider,
                           cls).from_crawler(crawler, *args, **kwargs)
            crawler.signals.connect(spider.item_scraped,
                                    signal=signals.item_scraped)
            crawler.signals.connect(spider.spider_closed, signal=signals.spider_closed)
            return spider
    
        def parse(self, response):
            lists = response.css('div.article-item div.title a::attr("href")')
            for info in lists:
                item = CcidcomItem()
                item['url'] = info.get()
                yield item
    
        def item_scraped(self, item, response, spider):
            if item:
                self.item_count += 1
                self.logger.info('--------item_scraped')
    
        def spider_closed(self, spider, reason):
            spider.logger.info('一共抓取到了{}个item'.format(self.item_count))

    运行爬虫scrapy crawl ccidcomSpider

    2019-11-20 13:14:11 [ccidcomSpider] INFO: --------item_scraped
    2019-11-20 13:14:11 [ccidcomSpider] INFO: --------item_scraped
    2019-11-20 13:14:11 [ccidcomSpider] INFO: --------item_scraped
    2019-11-20 13:14:11 [ccidcomSpider] INFO: --------item_scraped
    2019-11-20 13:14:11 [ccidcomSpider] INFO: --------item_scraped
    2019-11-20 13:14:11 [ccidcomSpider] INFO: --------item_scraped
    2019-11-20 13:14:11 [ccidcomSpider] INFO: --------item_scraped
    2019-11-20 13:14:11 [ccidcomSpider] INFO: --------item_scraped
    2019-11-20 13:14:11 [ccidcomSpider] INFO: --------item_scraped
    2019-11-20 13:14:11 [ccidcomSpider] INFO: --------item_scraped
    2019-11-20 13:14:11 [scrapy.core.engine] INFO: Closing spider (finished)
    2019-11-20 13:14:11 [ccidcomSpider] INFO: 一共抓取到了10个item

    from_crawler是在爬虫被初始化时执行的入口方法 spider = super(CcidcomSpider, cls).from_crawler(crawler, *args, **kwargs) 是调用父类的方法, 获取到实例化的爬虫 crawler.signals.connect(spider.item_scraped, signal=signals.item_scraped)是将爬虫的spider.item_scraped方法注入到signals.item_scraped信号的位置上 当我们yield返回一个item时, 就会调用我们自己写的item_scraped方法, 将item的数量+1

    我们也注册了一个spider_closed的信号, 在爬虫结束以后, 输出我们一共抓取到了多少个item

    这就是scrapy信号的简单的例子, 而且这个例子可以写在很多地方(扩展、中间件、pipeline...)

    二、scrapy内置的信号

    以上就是scrapy所有内置的信号列表, 这些信号的最大功能就是用来做统计, 或者别的一些处理

    1. 统计被Drop的item

    2. 统计被Drop的请求

    3. 监控爬虫的空闲状态(实现调试爬虫)

    4. 统计pipeline或爬虫中的异常发生情况

     

     
  • 相关阅读:
    appium连接夜游神的方法
    selenium自动化测试配置工具整理
    appium+Python 启动app(三)登录
    appium+Python 启动app(二)
    appium+Python 启动app(一)
    appium滑动操作(向上、向下、向左、向右)
    【Prometheus专题】4. Prometheus通过webhook集成Slack或Mattermost发送告警
    【Prometheus专题】3. Prometheus监控组件的配置
    【Prometheus专题】2. Prometheus监控组件安装
    【Prometheus专题】1. Prometheus介绍(何为Prometheus)
  • 原文地址:https://www.cnblogs.com/qiu-hua/p/12638683.html
Copyright © 2011-2022 走看看