scrapy的信号(signal)以及对下载中间件的一些总结
直接往redis里记录一下,我今天爬了多少数据
是否和我预期一样
爬虫状态码异常,你怎么查
我的爬虫没任务了它就会退出了,我不想它退出怎么办
爬虫关闭了,我不想看进程,我希望给我来个邮件
怎么办
我现在给你一批url让你去爬,完了,我待会再给你一批。时间不确定
你怎么办?
以上,完美的阐述了scrapy信号的用途。
首先,信号的一些基本概念就不说了,可以直接百度 : scrapy signal的使用
直接上代码说用途
我将这段代码放到中间件里,本来应该是,再与setting同级的目录下创建一个py文件,然后来写的。
然后再在setting的 EXTENSIONS 里启用并给出等级,就像piplin和middleware一样。
class QianlongwangSpiderMiddleware(object):# Not all methods need to be defined. If a method is not defined,# scrapy acts as if the spider middleware does not modify the# passed objects.@classmethoddef from_crawler(cls, crawler):# This method is used by Scrapy to create your spiders.s = cls()crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)crawler.signals.connect(s.item_scraped, signal=signals.item_scraped)crawler.signals.connect(s.spider_closed, signal=signals.spider_closed)crawler.signals.connect(s.spider_error, signal=signals.spider_error)crawler.signals.connect(s.spider_idle, signal=signals.spider_idle)return s# 当spider开始爬取时发送该信号。该信号一般用来分配spider的资源,不过其也能做任何事。def spider_opened(self, spider):spider.logger.info('pa chong kai shi le: %s' % spider.name)print('start','1')def item_scraped(self,item, response, spider):global hahahahahaha += 1# 当某个spider被关闭时,该信号被发送。该信号可以用来释放每个spider在 spider_opened 时占用的资源。def spider_closed(self,spider, reason):print('-------------------------------all over------------------------------------------')global hahahaprnit(spider.name,' closed')# 当spider的回调函数产生错误时(例如,抛出异常),该信号被发送。def spider_error(self,failure, response, spider):code = response.statusprint('spider error')# 当spider进入空闲(idle)状态时该信号被发送。空闲意味着:# requests正在等待被下载# requests被调度# items正在item pipeline中被处理def spider_idle(self,spider):for i in range(10):print(spider.name)
主要是看代码。以后有这种需求了,最起码知道代码写在哪里了。
然后记录一下今天测试下载中间件的一些总结
首先需要明确:
- 请求是引擎发出来的,不是爬虫发出来的
- 引擎从爬虫拿url,给调度器去重,同时会从调度器的任务队列里取出一个任务,给下载器
- 下载器下载完以后,下载器把response返回给引擎
先说process_request(request, spider)
- 当设置了很多中间件的时候,会按照setting里的设置,按照从小到大执行
- 假如有两个中间件的等级一样,这两个中间都会被执行。(执行顺序没有得出有效结论)
- 即使某个中间件的设置时错的,比如,故意在代理中间件里给一个错误的ip,依然不会中断中间件的执行,也就是,scrapy无法检测代理中的操作是否合法。
- 经过中间件故意的错误的加代理,下载器仍然去执行这个任务了,只不过根据另一个中间件:RetryMiddleware 的设定去处理了这个请求(默认的是,请求连续失败三次退出任务)
- 当这个请求第一次失败时候,依然会再次经过设置的中间件。
- 第一个发出error信号的不是引擎,是scraper,它是连接引擎、爬虫、下载器的一个东西。。。。然后引擎才发出错误信号
- (重点)每一个任务,也就是每一个请求,不管在什么情况下,只要设置了中间件,就会孜孜不倦的去通过这些中间件,然后到达下载器
然后说process_response(request, response, spider)
- 因为获取的响应是从下载器到引擎的,所以response经过中间件的顺序刚好与request相反
- 是从大到小执行的
最后明确
第一个中间件是最靠近引擎的,最后一个中间件是最靠近下载器的
scrapy的信号(signal)以及对下载中间件的一些总结相关推荐
- 爬虫学习笔记(十)—— Scrapy框架(五):下载中间件、用户/IP代理池、settings文件
一.下载中间件 下载中间件是一个用来hooks进Scrapy的request/response处理过程的框架. 它是一个轻量级的底层系统,用来全局修改scrapy的request和response. ...
- python_爬虫 21 Scrapy框架之(七)下载中间件
目录 Downloader Middlewares(下载器中间件) 一.process_request(self, request, spider) 二.process_response(self, ...
- scrapy 下载中间件
文章目录 Downloader Middlewares(下载中间件) process_request(self,request,spider) process_response(self,reques ...
- scrapy框架之下载中间件
介绍 中间件是Scrapy里面的一个核心概念.使用中间件可以在爬虫的请求发起之前或者请求返回之后对数据进行定制化修改,从而开发出适应不同情况的爬虫. "中间件"这个中文名字和前面章 ...
- 三十八、Scrapy 下载中间件Middleware
@Author:Runsen 文章目录 1. Spider 下载中间件(Middleware) 2. 激活一个下载DOWNLOADER_MIDDLEWARES 3. 编写你自己的下载中间件 4 使用代 ...
- 17-爬虫之scrapy框架五大核心组件工作流程及下载中间件介绍04
scrapy的五大核心组件 引擎(Scrapy) 对整个系统的数据流进行处理, 触发事务(框架核心). 调度器(Scheduler) 用来接受引擎发过来的请求. 由过滤器过滤重复的url并将其压入队列 ...
- 框架下载_25. Scrapy 框架-下载中间件Middleware
1. Spider 下载中间件(Middleware) Spider 中间件(Middleware) 下载器中间件是介入到 Scrapy 的 spider 处理机制的钩子框架,您可以添加代码来处理发送 ...
- 纯纯的爬虫知识,python scrapy 下载中间件知多少
这篇博客咱们聊聊 scrapy 中的 Downloader Middleware ,即下载中间件相关知识. Downloader Middlerware 首先看一下中间件在 scrapy 数据流中的位 ...
- 爬虫系列---scrapy post请求、框架组件和下载中间件+boss直聘爬取
一 Post 请求 在爬虫文件中重写父类的start_requests(self)方法 父类方法源码(Request): def start_requests(self):for url in sel ...
最新文章
- Ubuntu 18.04时间同步
- 玩转正则之highlight高亮
- 腾讯云服务器部署FTP
- oracle 代码 字段映射,将ORACLE TIMESTAMP(9)字段映射到java.util.Date
- SVN报Previous operation has not finished; run 'cleanup' if it was interrupted错误的解决方法
- 5G的来龙去脉及未来
- 世上最杰出程序员,B 语言、Unix 之父为玩游戏,写了个操作系统
- Oralce 导入dpm 文件数据
- VIMrc 配置文件
- 一次搞懂清晰度、对比度以及锐化的区别
- 漫游流量 android,人在国外 怎么设置小米手机国际漫游指定app使用流量?
- CentOS 7.4 YUM 搭建LANP环境+WordPress
- Arcgis 地理配准步骤(底图校正)
- dreamweaver8_Dreamweaver 8符合标准!
- 移植安装ModBus到ARM开发板
- 两问表和三问表哪个更少_[三问三解]关于问表和三问表的区别
- springboot+vue+elementui校园运动会场地预约管理系统java
- 利用pearcmd.php本地文件包含(LFI)
- html语言div图片垂直居中,图文详解图片水平垂直居中的五种方法
- 网站被CC攻击如何有效防御?
热门文章
- php创建多页ppt,详解PPT中多个人物介绍页的设计思路
- On Equality-Generating Dependencies in Ontology Querying - Preliminary Report
- unity 3D 入门--SiKi学院课程之打砖块
- 地铁售票系统java代码_VHDL 地铁自动售票系统
- 一张图表上的多个指标(第 06 部分)
- 使用云服务器NAS搭建个人网盘
- redis过期策略和持久化
- 将与NetApp合资成立联想凌拓 联想AI、IoT战略终成闭环
- Android 12.0 根据包名授权悬浮窗权限
- 远离手机卡顿的正确做法!关闭这3个设置,让手机流畅如新