scrapy的下载中间件都有三个函数:
函数 | 返回对象 |
---|---|
process_request | 1.None 2.Response 3.Request 4.Raise IgnoreRequest |
process_response | A.Response B.Request C.Raise IgnoreRequest |
process_exception | i.None ii.Response iii.Request |
process_request(self, request, spider)
以图中的下载中间件2为例说明:
- 返回None:将请求传给后面的中间件的process_request函数继续处理
- 返回Response:请求不再传给后面的中间件,而是直接进入最后一个中间件的process_response函数里来处理Response对象
- 返回Request:重新开始处理请求,即进入第一个中间件的process_request函数
- 抛出异常的处理流程:如果异常链中有process_exception则按顺序调用,没有或者链中的process_exception函数调完了,则调用Request中定义的errback方法。两者都没有定义,则异常将被忽略。
- 进入process_exception异常处理链,从最后一个中间件开始
- Request.errback
- 异常被忽略
process_response(self, request, response,spider)
以图中的下载中间件3为例说明:
- 返回Response:将响应交由下一个中间件的process_response函数继续处理
- 返回Request:请求将重新开始,即进入第一个中间件的process_request函数
- 抛出异常的处理流程:
- Request.errback
- 异常将被忽略
process_exception(self, request, exception, spider)
以图中的下载中间件3为例说明:
- 返回None:将异常交给下一个中间件的process_exception函数处理
- 返回Response: 将该响应交由最后一个中间件的process_response函数处理
- 返回Request:重新开始处理请求,即进入第一个中间件的process_request函数
- 抛出异常的处理流程:
- Request.errback
- 异常将被忽略
注意:抛出scrapy中定义的异常可能与自定义异常有所区别,比如:IgnoreRequest异常不会记录异常统计次数;在errback中抛出CloseSpider将关闭爬虫程序。
备注:
- 中间件需要安装才能处理,请记得安装配置中间件的优先级。
- 中间件的优先级:数字越小越靠近引擎,数字越大越靠近下载器。请求最先从引擎处开始传递,逐次经过优先级数字越来越大的中间件;相反,下载器返回响应时,则逐次经过优先级数字越来越小的中间件处理。因此,以上图为例:不要认为一个请求最先是中间件1处理的,那么响应也会最先由中间件1来处理,这是错误的。请求最先由优先级数字最小的中间件来处理,而响应最先由优先级数字最大的中间件处理