下载器中间件(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(针对一下🐷🐷🐷)的更多相关文章

  1. Spider_Man_6 の Scrapy(未完待续)

    一:自我介绍 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取 (更确切来说, 网络抓取 )所 ...

  2. 使用node+mysql进行后端开发

    使用koa: koa2是一个类,所以引入koa后,要创建实例化“对象”,才能使用koa内部封装的方法. 设置监听端口: 处理http请求: 1.http请求处理链 A.通过app.use()注册asy ...

  3. 解读ASP.NET 5 & MVC6系列(6):Middleware详解

    在第1章项目结构分析中,我们提到Startup.cs作为整个程序的入口点,等同于传统的Global.asax文件,即:用于初始化系统级的信息(例如,MVC中的路由配置).本章我们就来一一分析,在这里如 ...

  4. GoldenGate针对OEM 13.1的版本发布

    OGG 针对OEM(Oracle Enterprise Manager) 13.1的插件已经可以从这里下载: http://www.oracle.com/technetwork/middleware/ ...

  5. Middleware详解

    Middleware详解 在第1章项目结构分析中,我们提到Startup.cs作为整个程序的入口点,等同于传统的Global.asax文件,即:用于初始化系统级的信息(例如,MVC中的路由配置).本章 ...

  6. 【转】Django Middleware

    Django 处理一个 Request 的过程是首先通过中间件,然后再通过默认的 URL 方式进行的.我们可以在 Middleware 这个地方把所有Request 拦截住,用我们自己的方式完成处理以 ...

  7. ASP.NET Core 中间件(Middleware)详解

    什么是中间件(Middleware)? 中间件是组装到应用程序管道中以处理请求和响应的软件. 每个组件: 选择是否将请求传递给管道中的下一个组件. 可以在调用管道中的下一个组件之前和之后执行工作. 请 ...

  8. Django中Middleware中间件

    Django中Middleware中间件 1 Middleware中间件概述 django中间middleware实质就是一个类,django会根据自己的规则在合适的时机执行中间件相应的方法.实际上当 ...

  9. 针对 Ocelot 网关的性能测试

    一.背景 目前我们项目是采用的 Ocelot 作为 API 网关,并且在其基础上结合 IdentityServer4 开发了一套 API 开放平台.由于部分项目是基于 ABP 框架进行开发的,接口的平 ...

随机推荐

  1. [pytorch] 官网教程+注释

    pytorch官网教程+注释 Classifier import torch import torchvision import torchvision.transforms as transform ...

  2. C++之string基本字符系列容器

    string基本字符系列容器 C语言只提供了一个插入类型用来处理字符, 而对于字符串, 只能通过字符串数组来处理, 显得十分不便. C++STL提供了string基本字符系列容器来处理字符串, 可以把 ...

  3. 2017.11.1 微型计算机原理与接口技术-----第七章 中断系统与8237A DMA控制器

    第七章 微型计算机原理与接口技术-----中断系统与8237A DMA控制器 (1)数据传送的两种方式:中断方式和直接存储器存取方式(DMA):中断是微处理器与外部设备交换信息的一种方式:DMA是存储 ...

  4. python剑指offer最小的K个数

    题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 思路: 使用快排中的partition思想. ①我们设定part ...

  5. js 实现序列号效果实现

    前端的朋友可能遇到过这样的需求,要求在页面输入一串序列号,或激活码(就像在PC正版软件中的序列号),可是HTML中并没有为我们提供类似的组件,我们来自己实现一个: 大体的思路是在表单里有一个隐藏的in ...

  6. Bootstarp学习教程(7) 表单

    基本案例:“form-control”修饰的<input>.<textarea>和<select>元素都将被默认设置为width: 100%;表单控件包裹在&quo ...

  7. React后台管理系统-品类选择器二级联动组件

    1.页面大致是这个样子 2.页面结构 <div className="col-md-10">            <select name="&quo ...

  8. C#基础学习笔记(个人整理)

    学习笔记 第一章:c#基础 一.程序设计语言的发展及历史 1.程序设计语言? 通俗也叫编程语言,实现人与机器交互的工具 2.历史 1)机器语言 : 0,1 2)汇编语言 : 包含一些机器语言,同时增加 ...

  9. 用python写一个类似于linux中的tree

    import os filePath = 'g:/File' j = 0 # 查找的深度计数 def tree(filePath,j): dir_now = os.listdir(filePath) ...

  10. Lucene简单总结

    Lucene API Document Document:文档对象,是一条原始数据 文档编号 文档内容 1 谷歌地图之父跳槽FaceBook 2 谷歌地图之父加盟FaceBook 3 谷歌地图创始人拉 ...