信号一般使用信号分发器dispatcher.connect(),来设置信号,和信号触发函数,当捕获到信号时执行一个函数

dispatcher.connect()信号分发器,第一个参数信号触发函数,第二个参数是触发信号,

以下是各种信号

signals.engine_started当Scrapy引擎启动爬取时发送该信号。该信号支持返回deferreds。
signals.engine_stopped当Scrapy引擎停止时发送该信号(例如,爬取结束)。该信号支持返回deferreds。

signals.item_scraped(item, response, spider)当item被爬取,并通过所有 Item Pipeline 后(没有被丢弃(dropped),发送该信号。该信号支持返回deferreds。
  参数:
  item (Item 对象) – 爬取到的item
  spider (Spider 对象) – 爬取item的spider
  response (Response 对象) – 提取item的response

signals.item_dropped(item, exception, spider)当item通过 Item Pipeline ,有些pipeline抛出 DropItem 异常,丢弃item时,该信号被发送。该信号支持返回deferreds。
  参数:
  item (Item 对象) – Item Pipeline 丢弃的item
  spider (Spider 对象) – 爬取item的spider
  exception (DropItem 异常) – 导致item被丢弃的异常(必须是 DropItem 的子类)

signals.spider_closed(spider, reason)当某个spider被关闭时,该信号被发送。该信号可以用来释放每个spider在 spider_opened 时占用的资源。该信号支持返回deferreds。
  参数:
  spider (Spider 对象) – 关闭的spider
  reason (str) – 描述spider被关闭的原因的字符串。如果spider是由于完成爬取而被关闭,则其为 'finished' 。否则,如果spider是被引擎的 close_spider 方法所关闭,则其为调用该方法时传入的   reason 参数(默认为 'cancelled')。如果引擎被关闭(例如, 输入Ctrl-C),则其为 'shutdown' 。

signals.spider_opened(spider)当spider开始爬取时发送该信号。该信号一般用来分配spider的资源,不过其也能做任何事。该信号支持返回deferreds。
  参数: spider (Spider 对象) – 开启的spider

signals.spider_idle(spider)当spider进入空闲(idle)状态时该信号被发送。空闲意味着:
  requests正在等待被下载
  requests被调度
  items正在item pipeline中被处理
当该信号的所有处理器(handler)被调用后,如果spider仍然保持空闲状态, 引擎将会关闭该spider。当spider被关闭后, spider_closed 信号将被发送。您可以,比如,在 spider_idle 处理器中调度某些请求来避免spider被关闭。该信号 不支持 返回deferreds。
  参数: spider (Spider 对象) – 空闲的spider

signals.spider_error(failure, response, spider)当spider的回调函数产生错误时(例如,抛出异常),该信号被发送
  参数:
  failure (Failure 对象) – 以Twisted Failure 对象抛出的异常
  response (Response 对象) – 当异常被抛出时被处理的response
  spider (Spider 对象) – 抛出异常的spider

signals.request_scheduled(request, spider)当引擎调度一个 Request 对象用于下载时,该信号被发送。该信号 不支持 返回deferreds。
  参数:
  request (Request 对象) – 到达调度器的request
  spider (Spider 对象) – 产生该request的spider

signals.response_received(response, request, spider)当引擎从downloader获取到一个新的 Response 时发送该信号。该信号 不支持 返回deferreds。
  参数:
  response (Response 对象) – 接收到的response
  request (Request 对象) – 生成response的request
  spider (Spider 对象) – response所对应的spider

signals.response_downloaded(response, request, spider)当一个 HTTPResponse 被下载时,由downloader发送该信号。该信号 不支持 返回deferreds。
  参数:
  response (Response 对象) – 下载的response
  request (Request 对象) – 生成response的request
  spider (Spider 对象) – response所对应的spider

我们以signals.spider_closed(spider, reason)信号举例其他信号同理:

# -*- coding: utf-8 -*-
import scrapy
from scrapy.http import Request,FormRequest
from scrapy.xlib.pydispatch import dispatcher # 信号分发器
from scrapy import signals # 信号 class PachSpider(scrapy.Spider): #定义爬虫类,必须继承scrapy.Spider
name = 'pach' #设置爬虫名称
allowed_domains = ['www.dict.cn'] #爬取域名 def start_requests(self): #起始url函数,会替换start_urls
return [Request(
url='http://www.dict.cn/9999998888',
callback=self.parse
)] # 利用数据收集器,收集所有404的url以及,404页面数量
handle_httpstatus_list = [404] # 设置不过滤404 def __init__(self):
self.fail_urls = [] # 创建一个变量来储存404URL
dispatcher.connect(self.spider_closed, signals.spider_closed) # dispatcher.connect()信号分发器,第一个参数信号触发函数,第二个参数是触发信号,signals.spider_closed是爬虫结束信号 def spider_closed(self, spider, reason): # 信号触发函数
print('爬虫结束 停止爬虫')
print(self.fail_urls) # 打印404URL列表
print(self.crawler.stats.get_value('failed_url')) # 打印数据收集值 def parse(self, response): # 回调函数
if response.status == 404: # 判断返回状态码如果是404
self.fail_urls.append(response.url) # 将URL追加到列表
self.crawler.stats.inc_value('failed_url') # 设置一个数据收集,值为自增,每执行一次自增1
else:
title = response.css('title::text').extract()
print(title)

三十四 Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy信号详解的更多相关文章

  1. 三十六 Python分布式爬虫打造搜索引擎Scrapy精讲—利用开源的scrapy-redis编写分布式爬虫代码

    scrapy-redis是一个可以scrapy结合redis搭建分布式爬虫的开源模块 scrapy-redis的依赖 Python 2.7, 3.4 or 3.5,Python支持版本 Redis & ...

  2. 四十四 Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的基本查询

    1.elasticsearch(搜索引擎)的查询 elasticsearch是功能非常强大的搜索引擎,使用它的目的就是为了快速的查询到需要的数据 查询分类: 基本查询:使用elasticsearch内 ...

  3. 三十五 Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy分布式爬虫要点

    1.分布式爬虫原理 2.分布式爬虫优点 3.分布式爬虫需要解决的问题

  4. 三十八 Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)介绍以及安装

    elasticsearch(搜索引擎)介绍 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticse ...

  5. 三十二 Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy的暂停与重启

    scrapy的每一个爬虫,暂停时可以记录暂停状态以及爬取了哪些url,重启时可以从暂停状态开始爬取过的URL不在爬取 实现暂停与重启记录状态 1.首先cd进入到scrapy项目里 2.在scrapy项 ...

  6. 二十四 Python分布式爬虫打造搜索引擎Scrapy精讲—爬虫和反爬的对抗过程以及策略—scrapy架构源码分析图

    1.基本概念 2.反爬虫的目的 3.爬虫和反爬的对抗过程以及策略 scrapy架构源码分析图

  7. 三十九 Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的基本概念

    elasticsearch的基本概念 1.集群:一个或者多个节点组织在一起 2.节点:一个节点是集群中的一个服务器,由一个名字来标识,默认是一个随机的漫微角色的名字 3.分片:将索引(相当于数据库)划 ...

  8. Python分布式爬虫打造搜索引擎完整版-基于Scrapy、Redis、elasticsearch和django打造一个完整的搜索引擎网站

    Python分布式爬虫打造搜索引擎 基于Scrapy.Redis.elasticsearch和django打造一个完整的搜索引擎网站 https://github.com/mtianyan/Artic ...

  9. 四十六 Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)scrapy写入数据到elasticsearch中

    前面我们讲到的elasticsearch(搜索引擎)操作,如:增.删.改.查等操作都是用的elasticsearch的语言命令,就像sql命令一样,当然elasticsearch官方也提供了一个pyt ...

随机推荐

  1. Web页面性能优化(YSlow)

    YSlow(解析为Why Slow)是雅虎基于网站优化规则推出的工具,帮助你分析并优化网站性能.旧版Yslow 有13条规则,新版Yslow有23项规则,YSlow会根据这些规则分析你的网站,并给出评 ...

  2. LinkedList基本用法

    https://blog.csdn.net/i_lovefish/article/details/8042883

  3. 6.Insert Documents-官方文档摘录

    总结 1.插入单文档 db.inventory.insertOne( { item: "canvas", qty: , tags: , w: 35.5, uom: "cm ...

  4. Linux network 资料链接

    1.iptables 基础 https://wiki.centos.org/HowTos/Network/IPTables 2.HOWTOs on netfilter site http://www. ...

  5. linux c编程:互斥锁条件变量

    条件变量:等待与信号发送 使用互斥锁虽然可以解决一些资源竞争的问题,但互斥锁只有两种状态(加锁和解锁),这限制了互斥锁的用途. 条件变量(条件锁)也可以解决线程同步和共享资源访问的问题,条件变量是对互 ...

  6. WEB安全验收参考文档——From Github

    文章https://xianzhi.aliyun.com/forum/read/793.html 里面涉及到了web安全验收参考文档: 其实github上老外对此也做过一些整理.详情参考:https: ...

  7. JavaScript-4.2函数,变量作用域---ShinePans

    <html> <head> <meta http-equiv="content-type" content="text/html;chars ...

  8. node.js---sails项目开发(2)

    1.安装mongoDB,这里用brew安装 brew install mongodb 2. 启动数据库 mongod 3.再打开一个终端,连接数据库 mongo 4.启动成功后,接下来就是新建一个数据 ...

  9. Delphi 正则表达式语法(10): 选项

    Delphi 正则表达式语法(10): 选项 // preCaseLess: 不区分大小写, 相当于其他语言中的 i var   reg: TPerlRegEx; begin   reg := TPe ...

  10. Codeforces Round #397 by Kaspersky Lab and Barcelona Bootcamp (Div. 1 + Div. 2 combined) B - Code obfuscation

    地址:http://codeforces.com/contest/765/problem/B 题目: B. Code obfuscation time limit per test 2 seconds ...