如果它返回一个 Response 对象, Scrapy 不会打扰调用任何其他 process_request() 或 process_exception() 方法,或相应的下载功能; 它将返回该响应。 process_response() 总是在每个响应上调用已安装中间件的方法。
如果返回一个 Request 对象, Scrapy 将停止调用 process_request 方法并重新计划返回的请求。一旦执行了新返回的请求,就会在下载的响应上调用适当的中间件链。
如果引发 IgnoreRequest 异常,则所有的下载器中间件的方法 process_exception() 会依次执行,如果没有一个方法处理该异常,那么 Request 的 errback() 方法就会回调,如果该异常还没处理,那么就会忽略。
process_response(request, response, spider)参数:
request (是一个 Request 对象)–发起响应的请求
response (response 对象)–正在处理的响应
spider (spider 对象)–此响应预期用于的蜘蛛
process_response() 应该:返回响应对象,返回请求对象或引发 IgnoreRequest 异常。
如果它返回一个 Response (它可以是相同的给定响应,也可以是全新的响应),那么该响应将继续使用链中下一个中间件的 process_response() 进行处理。
如果它返回一个 Request 对象,则中间件链将暂停,并将返回的请求重新安排为将来下载。 这与从 process_request() 返回请求的行为相同。
如果引发 IgnoreRequest 异常,则调用请求的 errback 函数(Request.errback)。 如果没有代码处理引发的异常,则将其忽略并且不记录(与其他异常不同)。
process_exception(request, exception, spider)参数:
request (是一个Request对象)–生成异常的请求
exception (Exception对象)–引发的异常
spider (spider对象)–此请求所针对的蜘蛛
当下载处理程序或 process_request() (从下载程序中间件中)引发异常(包括 IgnoreRequest 异常)时, Scrapy 会调用 process_exception() 。
process_exception() 应该返回:无,响应对象或请求对象。
如果返回 None ,则 Scrapy 将继续处理此异常,执行已安装中间件的任何其他 process_exception() 方法,直到没有中间件为止,并且默认异常处理开始。
如果返回 Response 对象,则会启动已安装中间件的 process_response() 方法链,并且 Scrapy 不会费心调用中间件的任何其他 process_exception() 方法。
如果它返回一个 Request 对象,则将返回的请求重新安排为将来下载。 这将停止执行中间件的 process_exception() 方法,就像返回响应一样。
from_crawler(cls, crawler)参数:
crawler(搜寻器对象)–使用此中间件的搜寻器
如果存在,则调用该类方法以从 Crawler 创建中间件实例。 它必须返回中间件的新实例。 搜寻器对象提供对所有 Scrapy 核心组件(如设置和信号)的访问; 它是中间件访问它们并将其功能连接到 Scrapy 中的一种方式。
示例首先,我们还是在前面的 Scrapy 的项目上新建一个 Spider ,具体代码如下:
# -*- coding: utf-8 -*- import scrapy class HttpbinSpider(scrapy.Spider): name = 'httpbin' allowed_domains = ['httpbin.org'] start_urls = ['https://httpbin.org/get'] def parse(self, response): self.logger.debug(response.text)使用如下命令运行一下:
scrapy crawl httpbin结果部分截取如下:
{ "args": {}, "headers": { "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Encoding": "gzip,deflate,br", "Accept-Language": "en", "Host": "httpbin.org", "User-Agent": "Scrapy/1.8.0 (+https://scrapy.org)" }, "origin": "183.195.68.215, 183.195.68.215", "url": "https://httpbin.org/get" }可以看到,这里的 UA 头是 Scrapy/1.8.0 (+https://scrapy.org) ,这个其实是由 Scrapy 内置的 UserAgentMiddleware 设置的。
这里我们通过修改一下 UA 头,当然修改 UA 头可以通过 settings 中的 USER_AGENT 进行设置,这里我们要演示下载器中间件嘛,所以就使用下载器中间件设置一下。
首先我们在 middlewares.py 中新增一个 UaDownLoaderMiddleware ,示例代码如下:
class UaDownLoaderMiddleware(object): def process_request(self, request, spider): request.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36'