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 ...
随机推荐
- Centos7下源编译安装Postgresql 并设置开机自动启动postgresql.serivce 服务相关研究
编写开机自动启动服务脚本: # cat >> /usr/lib/systemd/system/postgresql.service >> EOF [Unit] Descript ...
- 如何控制excel单元格录入相同内容的次数?
我们知道如果要用Excel制作让人规范填写的模板,数据有效性,Excel2013版本及以上叫数据验证是必学的技能,正好这个案例可以讲讲数据有效性的一种“高级”设置方法. 加入我们需要实现下面的要求,价 ...
- Tensorflow报错:OMP: Error #15: Initializing libiomp5.dylib, but found libiomp5.dylib already initialized.
参考: https://github.com/dmlc/xgboost/issues/1715 解决方法: I solved it with 'conda install nomkl'.
- [源码解析] GroupReduce,GroupCombine 和 Flink SQL group by
[源码解析] GroupReduce,GroupCombine和Flink SQL group by 目录 [源码解析] GroupReduce,GroupCombine和Flink SQL grou ...
- 图解MySQL索引(三)—如何正确使用索引?
MySQL使用了B+Tree作为底层数据结构,能够实现快速高效的数据查询功能.工作中可怕的是没有建立索引,比这更可怕的是建好了索引又没有使用到.本文将围绕着如何优雅的使用索引,图文并茂地和大家一起探讨 ...
- 深入理解Java虚拟机学习笔记(一)-----Java内存区域
一 概述 对于 Java 程序员来说,在虚拟机自动内存管理机制下,不再需要像C/C++程序开发程序员这样为内一个 new 操作去写对应的 delete/free 操作,不容易出现内存泄漏和内存溢出问题 ...
- cb21a_c++_string对象的比较
*cb21a_c++_string对象的比较s.compare(s2)--区分大小的s.compare(pos1,n1,s2)s.compare(pos1,n1,s2,pos2,n2)s.compar ...
- Appium 自动化实例代码
自动化连接 B站 开始 如果下载node.js 的话 可以检查一下appium环境 命令行: appium-doctor 如果没有 可以安装 appium-doctor :npm install ...
- 【Spring注解驱动开发】如何使用@Bean注解指定初始化和销毁的方法?看这一篇就够了!!
写在前面 在[String注解驱动开发专题]中,前面的文章我们主要讲了有关于如何向Spring容器中注册bean的知识,大家可以到[String注解驱动开发专题]中系统学习.接下来,我们继续肝Spri ...
- Laravel 中自定义 手机号和身份证号验证
首先在 Providers\AppServiceProvider.php 文件中自定义 手机号和身份证号验证 // AppServiceProvider.php 文件 <?php namespa ...