Scrapy中的Downloader Middleware

(一)Downloader Middleware 作用

  1. 在Scheduler调出队列的Request发送给Downloader下载之前,也就是我们可以在Request执行下载之前对其进行修改
  2. 在下载后生成的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方法会被依次调用

猜你喜欢

转载自blog.csdn.net/Tony10010/article/details/87893482