要激活一个meddleware, 要在设置里面添加。例如:

DOWNLOADER_MIDDLEWARES = {
'myproject.middlewares.CustomDownloaderMiddleware': 543,
}

key是要激活的middleware的路径, value是它的value。其实scrapy本身就已经内置了很多middleware,所以在激活一个自己编写的middleware的时候,要在文档中查找默认的middleware的序号,以便把自己的middleware插入到正确的位置。

默认的middleware如下:

{
'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,
}

序号越小的middleware越接近engine,越大的越靠近downloader。

每一个downloader最多只能有四个methods。分别是:process_requests, process_response,process_exception和from_crawler。我们编写的downloader至少要有其中一个。

在engine发送requests给downloader这条路上,对于这个request,会依次调用所有middlware对它进行处理。(序号由小到大)

在downloader发送response给engine这条路上,对于这个response,会依次调用所有middleware对它进行处理。(序号由大到小)

下面是对这四个方法的介绍:

process_request(request, spider)

Parameters
request (Request object) – the request being processed spider (Spider object) – the spider for which this request is intended

process_resquest可以 return None, return a Response object, return a Request object, or raise IgnoreRequest.

  1. 返回None:把这个修改过的request继续传递下去。
  2. 返回Response对象:会依次调用所有middleware的process_response对它进行处理。(序号由大到小)(不再进入downloader)
  3. 返回Requests对象:把这个新的request放到调度队列的开头,即放到engine到downloader这条路的开头,会依次调用所有middlware的process_request对它进行处理。(序号由小到大)
  4. 返回IgnoreRequest:会依次调用所有middleware的process_exception对它进行处理。(序号由大到小)。如果一个process_exception都没有,就会回调Request的errorback函数。如果又没有,这个错误就会被忽略。
process_response(request, response, spider)

Parameters
request (is a Request object) – the request that originated the response response (Response object) – the response being processed spider (Spider object) – the spider for which this response is intended

process_response可以 return a Response object, return a Request object or raise a IgnoreRequest exception.

  1. 返回Response对象: 这个修改或没有修改过的response会依次被剩下的middleware的process_response调用,继续走向engine.
  2. 返回Request对象:把这个request放到engine中执行调度,走向downloader。
  3. 返回IgnoreRequest:回调Request的errorback函数。如果没有,这个错误就会被忽略。
process_exception(request, exception, spider)

Parameters
request (is a Request object) – the request that generated the exception exception (an Exception object) – the raised exception spider (Spider object) – the spider for which this request is intended

process_exception可以return: either None, a Response object, or a Request object.

  1. 返回None: 继续在剩下的middleware中传递这个exception、执行process_exception方法。
  2. 返回Response对象:把这个response放到downloader中执行调度,走向engine。
  3. 返回Request对象:把这个request放到engine中执行调度,走向downloader。
from_crawler(cls, crawler)
If present, this classmethod is called to create a middleware instance from a Crawler. It must return a new instance of the middleware. Crawler object provides access to all Scrapy core components like settings and signals; it is a way for middleware to access them and hook its functionality into Scrapy. Parameters
crawler (Crawler object) – crawler that uses this middleware

downloader middleware的三个methods不同返回的情况的更多相关文章

  1. Scrapy框架学习(三)Spider、Downloader Middleware、Spider Middleware、Item Pipeline的用法

    Spider有以下属性: Spider属性 name 爬虫名称,定义Spider名字的字符串,必须是唯一的.常见的命名方法是以爬取网站的域名来命名,比如爬取baidu.com,那就将Spider的名字 ...

  2. scrapy之 downloader middleware

    一. 功能说明 Downloader Middleware有三个核心的方法 process_request(request, spider) process_response(request, res ...

  3. Scrapy框架——介绍、安装、命令行创建,启动、项目目录结构介绍、Spiders文件夹详解(包括去重规则)、Selectors解析页面、Items、pipelines(自定义pipeline)、下载中间件(Downloader Middleware)、爬虫中间件、信号

    一 介绍 Scrapy一个开源和协作的框架,其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的,使用它可以以快速.简单.可扩展的方式从网站中提取所需的数据.但目前Scrapy的用途十分广泛,可 ...

  4. Downloader Middleware

    downloader middleware作用:改写请求,如加入代理,加入头部等:处理异常等. # downloadMiddleware举例, 加代理 # 这里的类如果已经重新设置名称,记得在sett ...

  5. 小白学 Python 爬虫(36):爬虫框架 Scrapy 入门基础(四) Downloader Middleware

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  6. 爬虫(十五):Scrapy框架(二) Selector、Spider、Downloader Middleware

    1. Scrapy框架 1.1 Selector的用法 我们之前介绍了利用Beautiful Soup.正则表达式来提取网页数据,这确实非常方便.而Scrapy还提供了自己的数据提取方法,即Selec ...

  7. Scrapy学习篇(十)之下载器中间件(Downloader Middleware)

    下载器中间件是介于Scrapy的request/response处理的钩子框架,是用于全局修改Scrapy request和response的一个轻量.底层的系统. 激活Downloader Midd ...

  8. 爬虫--Scrapy之Downloader Middleware

    下载器中间件(Downloader Middleware) 下载器中间件是介于Scrapy的request/response处理的钩子框架. 是用于全局修改Scrapy request和respons ...

  9. Python爬虫从入门到放弃(二十三)之 Scrapy的中间件Downloader Middleware实现User-Agent随机切换

    总架构理解Middleware 通过scrapy官网最新的架构图来理解: 这个图较之前的图顺序更加清晰,从图中我们可以看出,在spiders和ENGINE提及ENGINE和DOWNLOADER之间都可 ...

随机推荐

  1. 7. Centos7 yum 出现could not retrieve mirrorlist 最终解决方案

    Step 1: sudo vi /etc/sysconfig/network-scripts/ifcfg-ens33 Step 2:  将ONBOOT改为yes,wq!保存退出 Step 3:重启ne ...

  2. 现代操作系统原书第3版.mobi

    电子书资源:现代操作系统原书第3版 书籍简介   本书是操作系统领域的经典之作,与第2版相比,增加了关于Linux.Windows Vista和Symbian操作系统的详细介绍.书中集中讨论了操作系统 ...

  3. Day16_94_IO_循环读取文件字节流read()方法(二)

    循环读取文件字节流read()方法 通过read()循环读取数据,但是read()每次都只能读取一个字节,频繁读取磁盘对磁盘有伤害,且效率低. import java.io.FileInputStre ...

  4. 牛客练习赛14B 区间的连续段

    题目链接 点我跳转 题目大意 给定一个长度为 \(N\) 的序列 \(A\) 和一个常数 \(K\) 有 \(M\) 次询问 每次询问查询一个区间 \([L , R]\) 内所有数最少分成多少个连续段 ...

  5. POJ3762 时间段用k次

    题意:       有n个任务,每个任务有自己的开始时间和结束时间,还有完成这个任务能获得的价值,然后每一天的同一个时刻只能执行一个任务,每个任务必须连续执行完成,最多可以工作m天,问这m天能获得的最 ...

  6. Windows Pe 第三章 PE头文件(中)

    这一章的上半部分大体介绍了下PE文件头,下半部分是详细介绍里面的内容,这一章一定要多读几遍,好好记记基础概念和知识,方便之后的学习. 简单回忆一下: 3.4  PE文件头部解析 3.4.1 DOS M ...

  7. Andrew Ng机器学习算法入门(四):阶梯下降算法

    梯度降级算法简介 之前如果需要求出最佳的线性回归模型,就需要求出代价函数的最小值.在上一篇文章中,求解的问题比较简单,只有一个简单的参数.梯度降级算法就可以用来求出代价函数最小值. 梯度降级算法的在维 ...

  8. 使用乌龟Git连接github

    之前自己是在Gitee+乌龟Git来进行管理项目,因为特殊的需求,需要再Github+乌龟Git来进行管理项目,这盘博客主要讲解的就是这个. 安装环境 Git 安装参考链接:https://www.c ...

  9. (二)SQL语句

    语法规则 不区分大小写,但是建议关键字大写,表名.列名小写 SELECT * FROM user; 支持多行编写sql语言(在SQLyog中可以用F12来快速格式化语句) # 查询cno=20201/ ...

  10. 手写一个最简单的IOC容器,从而了解spring的核心原理

    从事开发工作多年,spring源码没有特意去看过.但是相关技术原理倒是背了不少,毕竟面试的那关还是得过啊! 正所谓面试造火箭,工作拧螺丝.下面实现一个最简单的ioc容器,供大家参考. 1.最终结果 2 ...