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 框架进行开发的,接口的平 ...
随机推荐
- JS判断手机横竖屏
在移动端开发时,有时候需要判断手机的横竖屏,那么就需要用到window.orientation这个参数,通过这个参数可以判断出手机是处在横屏还是竖屏状态. 屏幕方向对应的window.orientat ...
- Kubernetes解决了Docker使用中的哪些问题?
kubernetes是谷歌开源的容器集群管理系统,是Google多年大规模容器管理技术Borg的开源版本 (1)基于容器的应用部署.维护和滚动升级 (2)网络,建立容器之间的通信子网如隧道.路由等,解 ...
- 2017.11.29 JSP+Servlet 中功能验证码及验证的实现
源代码如下: validate.jsp <%@ page language="java" import="java.util.*" pageEncodin ...
- Mac安装protobuf 流程
下载 https://github.com/google/protobuf/releases 找到对应版本下载 编译 cd protobuf./autogen.sh./configuremake 安装 ...
- 统一项目中编码风格(Eclipse Java code format、codetemplate)
在公司内的日常开发过程中,除了需要遵守统一的编码规范之外,还需要对编写的代码做统一的格式化,Eclipse提供了格式化编码的工具,快捷键是:Ctrl+Shift+F. 为了统一项目组的代码风格,建议使 ...
- mask r-cnn
mask R-cnn, kaiming he的新作.可以同时完成object detection和segmentation,还可以做pose estimation,简直就是功能多多啊.在coco上测试 ...
- wgan pytorch,pyvision, py-faster-rcnn等的安装使用
因为最近在读gan的相关工作,wgan的工作不得不赞.于是直接去跑了一下wgan的代码. 原作者的wgan是在lsun上测试的,而且是基于pytorch和pyvision的,于是要装,但是由于我们一直 ...
- JavaServlet 路径书写总结
在写javaweb项目的时候,总会遇到路径书写的问题,现在将其作个总结. 在javaweb中需要书写路径的地方主要有这四大类: 客服端路径 超链接 表单 重定向 服务器端路径 转发 包含 资源获取路径 ...
- 使用免费公开的api接口示例(iOS)
做项目难免需要测试,要测试就需要一些接口,现在网上的很多接口都是需要收费的. 以下是目前找到的免费 JSON API免费接口 云聚数据 网吧数据 其中选取了一个百度百科的接口 百度接口 百度百科接口: ...
- Python 初始—(项目 目录结构)
在os 包下,给出 import os ,os.path.abspath(__file__)获取当前文件的相对路径,os.path.dirname 获取当前文件所在的文件夹目录 print(os.pa ...