本文主要是介绍Scrapy中的Downloader Middleware,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
(一)Downloader Middleware 作用
- 在Scheduler调出队列的Request发送给Downloader下载之前,也就是我们可以在Request执行下载之前对其进行修改
- 在下载后生成的Response发送给Spider之前,也就是我们可以在生成Response被Spider解析之前进行修改
(二)核心方法
每个Downloader Middleware都定义了一个或多个方法的类,核心方法有如下三个:
- process_request(request,spider)
- process_response(request,response,spider)
- process_exception(request,execption,spider)
我们只需要实现其中一个方法,就可以定义一个Downloader Middleware。
1. process_request
Reuqest在被Scrapy引擎调度给Downloader之前,process_request,方法就会被调用,也就是在Request从队列调出来到Downloader下载之前,我们都可以用process_request对其进行修改。
方法的返回值必须是None,Request,Response之一,或者抛出异常IgnoreRequest
- 返回None:
Scrapy将会继续处理该Request,接着执行其他Downloader Middleware的process_request方法,其实就是修改Request的过程 - 返回Response对象时:
更低优先级的Downloader Middleware的process_request和process_exception方法都不会被调用,转而执行每个Downloader Middleware的process_response方法 - 返回Request对象时:
返回的Request对象会被重新添加到调度队列中,作为一个全新的Requet等待被调用 - 抛出IgnoreRequest异常时:
所有的Downloader Middleware的process_exception方法会被依次调用。如果没有一个方法处理异常,那么Request的errback方法会回调,如果该异常还没有被处理,就会被忽略
2.process_response
Downloader 执行下载之后,会得到对应的Response。Scrapy引擎变回讲Response发送给spider进行解析,在发送之前,我们都可以用process_response方法来对Response进行修改处理。
方法的返回值必须是Request,Response之一,或者抛出异常IgnoreRequest
- 当返回Request时:
更低优先级的Downloader Middleware的process_response方法不会被调用。Request会被添加进调度队列,等待被调度。 - 返回Response时:
每个Downloader Middleware的process_response方法会被继续调用,对该Response进行处理 - 抛出异常IgnoreRequest时
每个Request的errback方法会被回调,如果没有处理这个异常,就会被忽略
3.process_exception
当Downloader 或process_request 产生异常时,process_exception方法就会被调用
方法返回值必须是None,Request,Response对象之一
- 返回None:
更低优先级的process_exception方法会被继续调用,直到所有的方法都被调用完毕 - 返回Request时:
更低优先级的process_exception方法不会被调用。新的Request直接被放入调度队列等候调用 - 返回Response时:
更低优先级的process_exception方法不会被调用,每个Downloader Middleware的process_response方法会被依次调用
这篇关于Scrapy中的Downloader Middleware的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!