第三百五十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy信号详解

信号一般使用信号分发器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精讲—elasticsearch(搜索引擎)用Django实现搜索的自动补全功能

    第三百六十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—用Django实现搜索的自动补全功能 elasticsearch(搜索引擎)提供了自动补全接口 官方说明:https://www.e ...

  2. 第三百六十三节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的mget和bulk批量操作

    第三百六十三节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的mget和bulk批量操作 注意:前面讲到的各种操作都是一次http请求操作一条数据,如果想 ...

  3. 第三百五十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—将bloomfilter(布隆过滤器)集成到scrapy-redis中

    第三百五十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—将bloomfilter(布隆过滤器)集成到scrapy-redis中,判断URL是否重复 布隆过滤器(Bloom Filter)详 ...

  4. 第三百五十三节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy的暂停与重启

    第三百五十三节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy的暂停与重启 scrapy的每一个爬虫,暂停时可以记录暂停状态以及爬取了哪些url,重启时可以从暂停状态开始爬取过的UR ...

  5. 第三百三十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—深度优先与广度优先原理

    第三百三十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—深度优先与广度优先原理 网站树形结构 深度优先 是从左到右深度进行爬取的,以深度为准则从左到右的执行(递归方式实现)Scrapy默认 ...

  6. 第三百四十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—通过自定义中间件全局随机更换代理IP

    第三百四十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—通过自定义中间件全局随机更换代理IP 设置代理ip只需要,自定义一个中间件,重写process_request方法, request ...

  7. 第三百四十三节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy模拟登陆和知乎倒立文字验证码识别

    第三百四十三节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy模拟登陆和知乎倒立文字验证码识别 第一步.首先下载,大神者也的倒立文字验证码识别程序 下载地址:https://gith ...

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

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

  9. 第三百六十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的基本查询

    第三百六十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的基本查询 1.elasticsearch(搜索引擎)的查询 elasticsearch是功能 ...

  10. 第三百五十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)介绍以及安装

    第三百五十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)介绍以及安装 elasticsearch(搜索引擎)介绍 ElasticSearch是一个基于 ...

随机推荐

  1. linux netstat 统计连接数查看

    服务器上的一些统计数据 1)统计80端口连接数netstat -nat|grep -i "80"|wc -l 2)统计httpd协议连接数ps -ef|grep httpd|wc ...

  2. 每天一个linux命令(7):whereis 命令

    whereis命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b).man说明文件(参数-m)和源代码文件(参数-s).如果省略参数,则返回所有信息. 和find相比,whereis查找的速度非 ...

  3. spark读取hdfs数据本地性异常【转】

    在分布式计算中,为了提高计算速度,数据本地性是其中重要的一环. 不过有时候它同样也会带来一些问题. 一.问题描述 在分布式计算中,大多数情况下要做到移动计算而非移动数据,所以数据本地性尤其重要,因此我 ...

  4. RIFF格式简介

    Resource Interchange File Format(简称RIFF),资源交换文件格式,是一种按照标记区块存储数据(tagged chunks)的通用文件存储格式,多用于存储音频.视频等多 ...

  5. js获取iframe中的元素以及在iframe中获取父级的元素(包括iframe中不存在name和id的情况)

      第一种情况:iframe中不存在name和id的方法:(通过contentWindow获取) var iframe = document.getElementsByTagName('iframe' ...

  6. Mac在Finder中显示/usr、/tmp、/var等隐藏目录

    Finder中默认是不显示/usr./tmp./var等隐藏目录的,通过在终端中输入一下命令来另其显示: #开启 defaults write com.apple.Finder AppleShowAl ...

  7. MBCS与Unicode的转换

    一.绪 其实刚开始编程的时候我不太喜欢用Unicode编码,所以比较喜欢 VC6.0,即使使用VS2010,也会设置为未设置模式. 后来,没办法的接触了些Unicode的编程的东西,必须得研究字符集的 ...

  8. hashCode()方法与equals()方法的说明

    1,一般我们自己用时,只使用equals()方法,用于判断两个对象是否是业务上等价的.2,在重写equals()方法时,强烈推荐也要重写hashCode()方法,因为有的集合用到了hashCode() ...

  9. [转]bootstrap的table插件动态加载表头

    原文地址:https://blog.csdn.net/abubu123/article/details/78060321 bootstrap的table属性已经很熟悉了,最近遇到一个问题,犹豫每个列表 ...

  10. [转]Teleport Ultra/Teleport Pro的冗余代码批量清理方法

    原文地址:http://www.abcd9.com/?post=402 Teleport Pro 是款优秀的网站离线浏览工具(即网站整站下载工具),Teleport Ultra是其增强版,但使用此系列 ...