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或爬虫中的异常发生情况

     

     
  • 相关阅读:
    highcharts参数详解
    文件上传与下载的前后端处理
    jQuery中,$.extend,$obj.extend和$.fn.extend三者的区别
    JS二维数据处理逻辑封装探究
    HTML5-WebSocket-初探
    关于CKEditor.NET的安全性错误
    SpringMVC源码从入门到放弃-DispatcherServlet
    Spring源码从入门到放弃-Controller注册
    一、dubbo源码从入门到放弃-SPI
    新人伤不起
  • 原文地址:https://www.cnblogs.com/qiu-hua/p/12638683.html
Copyright © 2011-2022 走看看