一、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 基础组件专题(四):信号运用的更多相关文章

  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. Centos7下源编译安装Postgresql 并设置开机自动启动postgresql.serivce 服务相关研究

    编写开机自动启动服务脚本: # cat >> /usr/lib/systemd/system/postgresql.service >> EOF [Unit] Descript ...

  2. 如何控制excel单元格录入相同内容的次数?

    我们知道如果要用Excel制作让人规范填写的模板,数据有效性,Excel2013版本及以上叫数据验证是必学的技能,正好这个案例可以讲讲数据有效性的一种“高级”设置方法. 加入我们需要实现下面的要求,价 ...

  3. 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'.

  4. [源码解析] GroupReduce,GroupCombine 和 Flink SQL group by

    [源码解析] GroupReduce,GroupCombine和Flink SQL group by 目录 [源码解析] GroupReduce,GroupCombine和Flink SQL grou ...

  5. 图解MySQL索引(三)—如何正确使用索引?

    MySQL使用了B+Tree作为底层数据结构,能够实现快速高效的数据查询功能.工作中可怕的是没有建立索引,比这更可怕的是建好了索引又没有使用到.本文将围绕着如何优雅的使用索引,图文并茂地和大家一起探讨 ...

  6. 深入理解Java虚拟机学习笔记(一)-----Java内存区域

    一 概述 对于 Java 程序员来说,在虚拟机自动内存管理机制下,不再需要像C/C++程序开发程序员这样为内一个 new 操作去写对应的 delete/free 操作,不容易出现内存泄漏和内存溢出问题 ...

  7. cb21a_c++_string对象的比较

    *cb21a_c++_string对象的比较s.compare(s2)--区分大小的s.compare(pos1,n1,s2)s.compare(pos1,n1,s2,pos2,n2)s.compar ...

  8. Appium 自动化实例代码

    自动化连接 B站 开始 如果下载node.js 的话 可以检查一下appium环境 命令行: appium-doctor 如果没有 可以安装   appium-doctor :npm install ...

  9. 【Spring注解驱动开发】如何使用@Bean注解指定初始化和销毁的方法?看这一篇就够了!!

    写在前面 在[String注解驱动开发专题]中,前面的文章我们主要讲了有关于如何向Spring容器中注册bean的知识,大家可以到[String注解驱动开发专题]中系统学习.接下来,我们继续肝Spri ...

  10. Laravel 中自定义 手机号和身份证号验证

    首先在 Providers\AppServiceProvider.php 文件中自定义 手机号和身份证号验证 // AppServiceProvider.php 文件 <?php namespa ...