process_request

在request对象传往downloader的过程中调用。当返回不同类型的值的时候,行为也不一样:

返回值 行为
None 一切正常,继续执行其他的中间件链
Response 停止调用其他process_request和process_exception函数,也不再继续下载该请求,然后走调用process_response的流程
Request 不再继续调用其他process_request函数,交由调度器重新安排下载。
IgnoreRequest process_exception函数会被调用,如果没有此方法,则request.errback会被调用,如果errback也没有,则此异常会被忽略,甚至连日志都没有。

process_response

在将下载结果返回给engine过程中被调用

返回值 行为
Response 续续调用其他中间件的process_response
Request 不再继续调用其他process_request函数,交由调度器重新安排下载。
IgnoreRequest 则request.errback会被调用,如果errback也没有,则此异常会被忽略,甚至连日志都没有。

process_exception

在下载过程中出现异常,或者在process_request中抛出IgnoreRequest异常的时候调用。

返回值 行为
Response 开始中间件链的process_response处理流程
Request 不再继续调用其他process_request函数,交由调度器重新安排下载。
None 继续调用其他中间件里的process_exception函数

from_crawler(cls, crawler)

如果存在该函数,则调用该函数创建中间件的实例。如果要写这个函数,一定要返回一个中间件的对象。

内置中间件

请求robots.txt文件,并解析其中的规则。

scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware

执行带Basic-auth验证的请求

scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware

下载请求超时最大时长

scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware

设置默认的请求头信息

scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware

设置请求头信息里的User-Agent

scrapy.downloadermiddlewares.useragent.UserAgentMiddleware

如果下载失败,是否重试,重试几次

scrapy.downloadermiddlewares.retry.RetryMiddleware

实现Meta标签重定向

scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware

实现压缩内容的解析(比如gzip)

scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware

实现30x的HTTP code的重定向

scrapy.downloadermiddlewares.redirect.RedirectMiddleware

实现对cookies的设置管理

scrapy.downloadermiddlewares.cookies.CookiesMiddleware

实现IP代理

scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware

下载信息的统计

scrapy.downloadermiddlewares.stats.DownloaderStats

下载结果的缓存

scrapy.downloadermiddlewares.httpcache.HttpCacheMiddleware