Spider_Man_6 の Scrapy_Downloader Middleware(针对一下🐷🐷🐷)
下载器中间件(Downloader Middleware)
下载器中间件是介于Scrapy的request/response处理的钩子框架。是用于全局修改Scrapy request和response的一个轻量、底层的系统。
它处于 引擎(crawler.engine) 和 下载器(crawler.engine.download())之间的一层组件,支持多个下载中间件被加载运行。
我们要这个骚东西有何用?
首先不能否定的是,可以干。 1. 当引擎传递请求给下载器的过程中,下载中间件可以对请求进行处理(例如增加http header信息,增加proxy信息等); 2. 当下载器完成http请求,传递响应给引擎的过程中,下载中间件可以对响应进行处理(例如进行gzip的解压等)。 关于自定义中间件的意义: 1. 在process_request内,自定义下载不用scrapy的下载。 2. 对请求进行二次加工,例如: 设置请求头 设置cookie 添加代理:scrapy自带的代理组件 from scrapy.downloadermiddlewares.httpproxy import HttpProxyMiddleware from urllib.request import getproxies
下载器中间件你到底能干嘛?
激活下载器中间件:
要激活下载器中间件,将其加入到DOWNLOAD设置中。该设置是一个字典(dict),键为中间件类的路径,值为其中间件的顺序(order)。
看例子:在你的settings文件里面
DOWNLOADER_MIDDLEWARES = { 'Baidu.middlewares.BaiduDownloaderMiddleware': 543, }
注意了宝宝们,downloader_middlewares设置会与Scrapy定义的downloader_middlewares_base设置合并(非覆盖),然后根据顺序(order)进行怕徐,最后得到启用中间件的有序列表:第一个中间件是最靠近引擎的,最后一个是最靠近下载器的。
附:
DOWNLOADER_MIDDLEWARES_BASE = { # Engine side 'scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware': 100, 'scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware': 300, 'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware': 350, 'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware': 400, 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': 500, 'scrapy.downloadermiddlewares.retry.RetryMiddleware': 550, 'scrapy.downloadermiddlewares.ajaxcrawl.AjaxCrawlMiddleware': 560, 'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware': 580, 'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 590, 'scrapy.downloadermiddlewares.redirect.RedirectMiddleware': 600, 'scrapy.downloadermiddlewares.cookies.CookiesMiddleware': 700, 'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 750, 'scrapy.downloadermiddlewares.stats.DownloaderStats': 850, 'scrapy.downloadermiddlewares.httpcache.HttpCacheMiddleware': 900, # Downloader side }
DOWNLOADER_MIDDLEWARES_BASE
补充:
如果你想充分利用好你的中间件,请注意一下中间件顺序。
在setting中,可以自定义中间件,接受各种request、response、 exception消息 比如有的人想在请求超时时 做一些处理, 有的人想为request设置代理 DOWNLOADER_MIDDLEWARES = { 'discountSpider.middlewares.ProcessMiddleware':90, 'discountSpider.middlewares.ProxyMiddleware': 750, 'scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware': 751, 'discountSpider.middlewares.RandomUserAgent': 400, 'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware': None, } 然而,中间件的顺序是很重要的 如果是想截取process_request,则越前面越早收到通知,然后顺着向后依次通知,没什么意外的话是这样。 但是如果是截取process_response,获得request请求完成后,返回response的消息,如果是正常下载完成的话,是第一个中间件收到通知,然后顺序向后通知。 但是往往会发生很多意外,比如请求超时,比如请求被retry,那么是不会发送通知到第一个的,而是根据scrapy默认中间件的位置发送, 分配中间件的顺序请查看 DOWNLOADER_MIDDLEWARES_BASE 设置,而后根据您想要放置中间件的位置选择一个值。由于每个中间件执行不同的动作,您的中间件可能会依赖于之前(或者之后)执行的中间件,因此顺序是很重要的。 比如DOWNLOADER_MIDDLEWARES_BASE中 'scrapy.contrib.downloadermiddleware.retry.RetryMiddleware': 500, 如果你把自定义的中间件序号设为100,那么当下载器发生错误504 500错误,需要retry,则会将response状态为retry的消息通知后面中间件,你的中间件的process_response将无法收到消息,因为他是从500序号开始向后通知,所需你将自己的中间件序号改为500以后,则可以收到消息。 又比如 'scrapy.contrib.downloadermiddleware.downloadtimeout.DownloadTimeoutMiddleware': 350,如果你想收到下载页面超时的消息,请将中间件放到350以后,process_response才能收到消息。因为下载发生超时后,scrapy会直接找到scrapy.contrib.downloadermiddleware.downloadtimeout.DownloadTimeoutMiddleware模块的位置350,通知他,然后消息依次通知后面的比如400,500,550,700等位置的中间件。如果你的中间件位置在100之类的,那是收不到消息的。 参考链接:https://www.jianshu.com/p/3b7507e7fc65
中间件注意事项
关于如何分配中间件的顺序请查看 DOWNLOADER_MIDDLEWARES_BASE
设置,而后根据您想要放置中间件的位置选择一个值。由于每个中间件执行不同的动作,您的中间件可能会依赖于之前(或者之后)执行的中间件,因此顺序是很重要的。
如果您想禁止内置的(在 DOWNLOADER_MIDDLEWARES_BASE
中设置并默认启用的)中间件,您必须在项目的 DOWNLOADER_MIDDLEWARES 设置中定义该中间件,并将其值赋为 None。例如,如果您想要关闭 user-agent 中间件:
DOWNLOADER_MIDDLEWARES = { 'myproject.middlewares.CustomDownloaderMiddleware': 543, 'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware': None, } # 这里有疑问,我直接注掉和赋值为None,区别在哪?
最后,请注意,有些中间件需要通过特定的设置来启用。更多内容请查看相关中间件文档。
好了,既然我们已经学会了激活它,现在就到此为止吧。你已经可以下山了!!!
Spider_Man_6 の Scrapy_Downloader Middleware(针对一下🐷🐷🐷)的更多相关文章
- Spider_Man_6 の Scrapy(未完待续)
一:自我介绍 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取 (更确切来说, 网络抓取 )所 ...
- 使用node+mysql进行后端开发
使用koa: koa2是一个类,所以引入koa后,要创建实例化“对象”,才能使用koa内部封装的方法. 设置监听端口: 处理http请求: 1.http请求处理链 A.通过app.use()注册asy ...
- 解读ASP.NET 5 & MVC6系列(6):Middleware详解
在第1章项目结构分析中,我们提到Startup.cs作为整个程序的入口点,等同于传统的Global.asax文件,即:用于初始化系统级的信息(例如,MVC中的路由配置).本章我们就来一一分析,在这里如 ...
- GoldenGate针对OEM 13.1的版本发布
OGG 针对OEM(Oracle Enterprise Manager) 13.1的插件已经可以从这里下载: http://www.oracle.com/technetwork/middleware/ ...
- Middleware详解
Middleware详解 在第1章项目结构分析中,我们提到Startup.cs作为整个程序的入口点,等同于传统的Global.asax文件,即:用于初始化系统级的信息(例如,MVC中的路由配置).本章 ...
- 【转】Django Middleware
Django 处理一个 Request 的过程是首先通过中间件,然后再通过默认的 URL 方式进行的.我们可以在 Middleware 这个地方把所有Request 拦截住,用我们自己的方式完成处理以 ...
- ASP.NET Core 中间件(Middleware)详解
什么是中间件(Middleware)? 中间件是组装到应用程序管道中以处理请求和响应的软件. 每个组件: 选择是否将请求传递给管道中的下一个组件. 可以在调用管道中的下一个组件之前和之后执行工作. 请 ...
- Django中Middleware中间件
Django中Middleware中间件 1 Middleware中间件概述 django中间middleware实质就是一个类,django会根据自己的规则在合适的时机执行中间件相应的方法.实际上当 ...
- 针对 Ocelot 网关的性能测试
一.背景 目前我们项目是采用的 Ocelot 作为 API 网关,并且在其基础上结合 IdentityServer4 开发了一套 API 开放平台.由于部分项目是基于 ABP 框架进行开发的,接口的平 ...
随机推荐
- P1424 小鱼的航程(改进版)
题目背景 原来的题目太简单,现改进让小鱼周末也休息,请已经做过重做该题. 题目描述 有一只小鱼,它上午游泳150公里,下午游泳100公里,晚上和周末都休息(实行双休日),假设从周x(1<=x&l ...
- apache单ip配置多端口多站点
1.修改 /etc/httpd/conf/httpd.conf 添加一个Listen,如: Listen 80 Listen 8001 Listen 8002 2.添加一个VirtualHost #v ...
- ADO.NET 之断开连接层
定义: 使用ADO.NET断开连接层,就会使用System.Data命名空间的许多成员(主要是DataTable.DataTable.DataRow.DataColumn.DataView和DataR ...
- Ext4.2 select 和 query 区别与联系
Ext.query和Ext.select的作用是一致的,同是根据CSS选择符查找出一个或多个元素.区别在于返回类型上.分别是:query方法返回的是JavaScript标准的数组类型:select方法 ...
- redis 过期回调通知
redis 过期回调通知 背景 在使用redis的过程中,有时我们会遇到这种情景,当key过期的时候,我们需要去重新做一些操作,比如重新生成value等.之前,一直用的是添加一个celery定时任务, ...
- 记一次EBS正式环境补丁安装的过程
因菏泽能源上线需求,需要在8009上修复集团8000环境上已经修复的所有补丁程序,修复前做应用及数据库层备份,完成修复后解决并发管理器无法启动的问题.此为概述. 应用层备份 应用层的备份采用直接压缩备 ...
- Linux 安装Oracle11g完整安装图文教程另附基本操作 (分享)
一.修改操作系统核心参数 在Root用户下执行以下步骤: 1)修改用户的SHELL的限制,修改/etc/security/limits.conf文件 输入命令:vi /etc/security/lim ...
- 关于 ReactNative 环境搭建之 error: invalid developer directory '/Library/Developer/CommandLineTools' - RN
简要说明,此次尝试安装 ReactNative 时当前 MacPro 版本为 10.13.6.Xcode 版本为 Version 9.4.1 (9F2000),按照官方的完整原生环境搭建流程一步步执行 ...
- DCMTK读取DICOM文件头信息的三种方法
Howto: Load File Meta-Header Here's an example that shows how to load the File Meta Information Head ...
- JS - 简单的下载图片至本地
<iframe id="saveImg" src="图片路径" style="display:none;"></ifram ...