scrapy框架中间件的调用规则
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
原文作者: 何阵运(HE)
原文链接: http://hezhenyun.github.io/2020/03/19/中间件的调用规则/
版权声明: 转载请注明出处(必须保留作者署名及链接)