核心方法
每个Downloader Middleware都定义了一个或多个方法的类,核心的方法有如下三个。
- process_request(request, spider)
- process_response(request, response, spider)
- process_exception(request, exception, spider)
process_request
Request被Scrapy引擎调度给Downloader之前,process_request()方法就会被调用,也就是在Request从队列里调度出来到Downloader下载执行之前,我们都可以用process_request()方法对Request进行处理。方法的返回值必须为None、Response对象、Request对象之一,或者抛出IgnoreRequest异常。
process_request()方法的参数有如下两个。
- request,是Request对象,即被处理的Request。
- spider,是Spider对象,即此Request对应的Spider。
process_response
Downloader执行Request下载之后,会得到对应的Response。Scrapy引擎便会将Response发送给Spider进行解析。在发送之前,我们都可以用process_response()方法来对Response进行处理。方法的返回值必须为Request对象、Response对象之一,或者抛出IgnoreRequest异常。
process_response()方法的参数有如下三个。
- request,是Request对象,即此Response对应的Request。
- response,是Response对象,即此被处理的Response。
- spider,是Spider对象,即此Response对应的Spider。
process_exception
当Downloader或process_request()方法抛出异常时,例如抛出IgnoreRequest异常,process_exception()方法就会被调用。方法的返回值必须为None、Response对象、Request对象之一。
process_exception()方法的参数有如下三个。
- request,是Request对象,即产生异常的Request。
- exception,是Exception对象,即抛出的异常。
- spider,是Spider对象,即Request对应的Spider。
基本用法
利用process_request()方法设置随机的User-Agent,使用process_response()方法修改Response的状态码。
Httpbin.py
1 | import scrapy |
middlewares.py
1 | import random |
settings.py
1 | DOWNLOADER_MIDDLEWARES = { |
result
1 | { |