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或爬虫中的异常发生情况
scrapy 基础组件专题(四):信号运用的更多相关文章
- scrapy 基础组件专题(八):scrapy-redis 框架分析
scrapy-redis简介 scrapy-redis是scrapy框架基于redis数据库的组件,用于scrapy项目的分布式开发和部署. 有如下特征: 分布式爬取 您可以启动多个spider工 ...
- scrapy 基础组件专题(十四):scrapy CookiesMiddleware源码
一 Scrapy框架--cookie的获取/传递/本地保存 1. 完成模拟登陆2. 登陆成功后提取出cookie,然后保存到本地cookie.txt文件中3. 再次使用时从本地的cookie.txt中 ...
- scrapy 基础组件专题(二):下载中间件
下载器中间件是介于Scrapy的request/response处理的钩子框架,是用于全局修改Scrapy request和response的一个轻量.底层的系统. 1.激活Downloader Mi ...
- scrapy 基础组件专题(一):scrapy框架中各组件的工作流程
Scrapy 使用了 Twisted 异步非阻塞网络库来处理网络通讯,整体架构大致如下(绿线是数据流向): Scrapy主要包括了以下组件: 引擎(Scrapy)用来处理整个系统的数据流处理, 触发事 ...
- scrapy 基础组件专题(九):scrapy-redis 源码分析
下面我们来看看,scrapy-redis的每一个源代码文件都实现了什么功能,最后如何实现分布式的爬虫系统: connection.py 连接得配置文件 defaults.py 默认得配置文件 dupe ...
- scrapy 基础组件专题(五):自定义扩展
通过scrapy提供的扩展功能, 我们可以编写一些自定义的功能, 插入到scrapy的机制中 一.编写一个简单的扩展 我们现在编写一个扩展, 统计一共获取到的item的条数我们可以新建一个extens ...
- scrapy 基础组件专题(十二):scrapy 模拟登录
1. scrapy有三种方法模拟登陆 1.1直接携带cookies 1.2找url地址,发送post请求存储cookie 1.3找到对应的form表单,自动解析input标签,自动解析post请求的u ...
- scrapy 基础组件专题(七):scrapy 调度器、调度器中间件、自定义调度器
一.调度器 配置 SCHEDULER = 'scrapy.core.scheduler.Scheduler' #表示scrapy包下core文件夹scheduler文件Scheduler类# 可以通过 ...
- scrapy 基础组件专题(六):自定义命令
写好自己的爬虫项目之后,可以自己定制爬虫运行的命令. 一.单爬虫 在项目的根目录下新建一个py文件,如命名为start.py,写入如下代码: from scrapy.cmdline import ex ...
随机推荐
- 淘宝官网css初始化
body, h1, h2, h3, h4, h5, h6, hr, p, blockquote, dl, dt, dd, ul, ol, li, pre, form, fieldset, legend ...
- jwt 工具类
public class TokenUtils { private Logger logger = LoggerFactory.getLogger(this.getClass()); /** * 签名 ...
- 学习ASP.NET Core(11)-解决跨域问题与程序部署
上一篇我们介绍了系统日志与测试相关的内容并添加了相关的功能:本章我们将介绍跨域与程序部署相关的内容 一.跨域 1.跨域的概念 1.什么是跨域? 一个请求的URL由协议,域名,端口号组成,以百度的htt ...
- C++_继承
C++支持单继承和多继承,并提供3类继承:public.private及protected.在public继承中,每个派生类对象都是基类对象,反之基类对象却不是派生类对象.派生类成员无法直接访问基本的 ...
- 初识MQ消息队列
MQ 消息队列 消息队列(Message Queue)简称MQ,是阿里巴巴集团中间件技术部自主研发的专业消息中间件. 产品基于高可用分布式集群技术,提供消息发布订阅.消息轨迹查询.定时(延时)消息.资 ...
- ElasticSearch中倒排索引和正向索引
ElasticSearch搜索使用的是倒排索引,但是排序.聚合等不适合倒排索引使用的是正向索引 倒排索引 倒排索引表以字或词为关键字进行索引,表中关键字所对应的记录项记录了出现这个字或词的所有文档,每 ...
- vue 组件传参及跨域传参
可以完成跨组件传参的四种方式 // 1) localStorage:永久存储数据 // 2) sessionStorage:临时存储数据(刷新页面数据不重置,关闭再重新开启标签页数据重置) // 3) ...
- C#数据结构与算法系列(十五):排序算法(SortAlgorithm)
1.介绍 排序是将一组数据,以指定的顺序进行排序的过程 2.分类 内部排序法:指将需要处理的所有数据都加载到内部存储器中进行排序 外部排序法:数据量过大,无法全部加载到内存中,需要借助外部存储进行排序
- Nginx基本知识,nginx安装使用方法
Nginx 是一款高性能的Web服务器软件. - 具有极高的并发性能 - 利用Nginx与Tomcat组合使用, 搭建反向代理集群 - Nginx 反向代理集群可以解决网站的高并发问题! 1.安装 Y ...
- Docker基本命令及工作原理
第一个Docker容器 1.首先确保Docker运行正常:docker info