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

  1. import scrapy
  2. from scrapy import signals
  3. from ccidcom.items import CcidcomItem
  4.  
  5. class CcidcomSpider(scrapy.Spider):
  6. name = 'ccidcomSpider'
  7. start_urls = ['http://www.ccidcom.com/yaowen/index.html']
  8. item_count = 0
  9.  
  10. @classmethod
  11. def from_crawler(cls, crawler, *args, **kwargs):
  12. spider = super(CcidcomSpider,
  13. cls).from_crawler(crawler, *args, **kwargs)
  14. crawler.signals.connect(spider.item_scraped,
  15. signal=signals.item_scraped)
  16. crawler.signals.connect(spider.spider_closed, signal=signals.spider_closed)
  17. return spider
  18.  
  19. def parse(self, response):
  20. lists = response.css('div.article-item div.title a::attr("href")')
  21. for info in lists:
  22. item = CcidcomItem()
  23. item['url'] = info.get()
  24. yield item
  25.  
  26. def item_scraped(self, item, response, spider):
  27. if item:
  28. self.item_count += 1
  29. self.logger.info('--------item_scraped')
  30.  
  31. def spider_closed(self, spider, reason):
  32. spider.logger.info('一共抓取到了{}个item'.format(self.item_count))

运行爬虫scrapy crawl ccidcomSpider

  1. 2019-11-20 13:14:11 [ccidcomSpider] INFO: --------item_scraped
  2. 2019-11-20 13:14:11 [ccidcomSpider] INFO: --------item_scraped
  3. 2019-11-20 13:14:11 [ccidcomSpider] INFO: --------item_scraped
  4. 2019-11-20 13:14:11 [ccidcomSpider] INFO: --------item_scraped
  5. 2019-11-20 13:14:11 [ccidcomSpider] INFO: --------item_scraped
  6. 2019-11-20 13:14:11 [ccidcomSpider] INFO: --------item_scraped
  7. 2019-11-20 13:14:11 [ccidcomSpider] INFO: --------item_scraped
  8. 2019-11-20 13:14:11 [ccidcomSpider] INFO: --------item_scraped
  9. 2019-11-20 13:14:11 [ccidcomSpider] INFO: --------item_scraped
  10. 2019-11-20 13:14:11 [ccidcomSpider] INFO: --------item_scraped
  11. 2019-11-20 13:14:11 [scrapy.core.engine] INFO: Closing spider (finished)
  12. 2019-11-20 13:14:11 [ccidcomSpider] INFO: 一共抓取到了10item

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

 

 

scrapy 基础组件专题(四):信号运用的更多相关文章

  1. scrapy 基础组件专题(八):scrapy-redis 框架分析

    scrapy-redis简介 scrapy-redis是scrapy框架基于redis数据库的组件,用于scrapy项目的分布式开发和部署. 有如下特征:  分布式爬取 您可以启动多个spider工 ...

  2. scrapy 基础组件专题(十四):scrapy CookiesMiddleware源码

    一 Scrapy框架--cookie的获取/传递/本地保存 1. 完成模拟登陆2. 登陆成功后提取出cookie,然后保存到本地cookie.txt文件中3. 再次使用时从本地的cookie.txt中 ...

  3. scrapy 基础组件专题(二):下载中间件

    下载器中间件是介于Scrapy的request/response处理的钩子框架,是用于全局修改Scrapy request和response的一个轻量.底层的系统. 1.激活Downloader Mi ...

  4. scrapy 基础组件专题(一):scrapy框架中各组件的工作流程

    Scrapy 使用了 Twisted 异步非阻塞网络库来处理网络通讯,整体架构大致如下(绿线是数据流向): Scrapy主要包括了以下组件: 引擎(Scrapy)用来处理整个系统的数据流处理, 触发事 ...

  5. scrapy 基础组件专题(九):scrapy-redis 源码分析

    下面我们来看看,scrapy-redis的每一个源代码文件都实现了什么功能,最后如何实现分布式的爬虫系统: connection.py 连接得配置文件 defaults.py 默认得配置文件 dupe ...

  6. scrapy 基础组件专题(五):自定义扩展

    通过scrapy提供的扩展功能, 我们可以编写一些自定义的功能, 插入到scrapy的机制中 一.编写一个简单的扩展 我们现在编写一个扩展, 统计一共获取到的item的条数我们可以新建一个extens ...

  7. scrapy 基础组件专题(十二):scrapy 模拟登录

    1. scrapy有三种方法模拟登陆 1.1直接携带cookies 1.2找url地址,发送post请求存储cookie 1.3找到对应的form表单,自动解析input标签,自动解析post请求的u ...

  8. scrapy 基础组件专题(七):scrapy 调度器、调度器中间件、自定义调度器

    一.调度器 配置 SCHEDULER = 'scrapy.core.scheduler.Scheduler' #表示scrapy包下core文件夹scheduler文件Scheduler类# 可以通过 ...

  9. scrapy 基础组件专题(六):自定义命令

    写好自己的爬虫项目之后,可以自己定制爬虫运行的命令. 一.单爬虫 在项目的根目录下新建一个py文件,如命名为start.py,写入如下代码: from scrapy.cmdline import ex ...

随机推荐

  1. 淘宝官网css初始化

    body, h1, h2, h3, h4, h5, h6, hr, p, blockquote, dl, dt, dd, ul, ol, li, pre, form, fieldset, legend ...

  2. jwt 工具类

    public class TokenUtils { private Logger logger = LoggerFactory.getLogger(this.getClass()); /** * 签名 ...

  3. 学习ASP.NET Core(11)-解决跨域问题与程序部署

    上一篇我们介绍了系统日志与测试相关的内容并添加了相关的功能:本章我们将介绍跨域与程序部署相关的内容 一.跨域 1.跨域的概念 1.什么是跨域? 一个请求的URL由协议,域名,端口号组成,以百度的htt ...

  4. C++_继承

    C++支持单继承和多继承,并提供3类继承:public.private及protected.在public继承中,每个派生类对象都是基类对象,反之基类对象却不是派生类对象.派生类成员无法直接访问基本的 ...

  5. 初识MQ消息队列

    MQ 消息队列 消息队列(Message Queue)简称MQ,是阿里巴巴集团中间件技术部自主研发的专业消息中间件. 产品基于高可用分布式集群技术,提供消息发布订阅.消息轨迹查询.定时(延时)消息.资 ...

  6. ElasticSearch中倒排索引和正向索引

    ElasticSearch搜索使用的是倒排索引,但是排序.聚合等不适合倒排索引使用的是正向索引 倒排索引 倒排索引表以字或词为关键字进行索引,表中关键字所对应的记录项记录了出现这个字或词的所有文档,每 ...

  7. vue 组件传参及跨域传参

    可以完成跨组件传参的四种方式 // 1) localStorage:永久存储数据 // 2) sessionStorage:临时存储数据(刷新页面数据不重置,关闭再重新开启标签页数据重置) // 3) ...

  8. C#数据结构与算法系列(十五):排序算法(SortAlgorithm)

    1.介绍 排序是将一组数据,以指定的顺序进行排序的过程 2.分类 内部排序法:指将需要处理的所有数据都加载到内部存储器中进行排序 外部排序法:数据量过大,无法全部加载到内存中,需要借助外部存储进行排序

  9. Nginx基本知识,nginx安装使用方法

    Nginx 是一款高性能的Web服务器软件. - 具有极高的并发性能 - 利用Nginx与Tomcat组合使用, 搭建反向代理集群 - Nginx 反向代理集群可以解决网站的高并发问题! 1.安装 Y ...

  10. Docker基本命令及工作原理

    第一个Docker容器     1.首先确保Docker运行正常:docker info