中间件Middleware
在Scrapy框架中,使用中间件可以在爬虫的请求发起之前或者请求返回之后对数据进行定制化修改,从而开发出适应不同情况的爬虫。
在Scrapy中有两种类型:下载器中间件(Downloader Middleware)和爬虫中间件(Spider Middleware)。
官方文档:https://docs.scrapy.org/en/latest/
中文文档:https://scrapy-chs.readthedocs.io/zh_CN/1.0/intro/overview.html
一、下载器中间件(Downloader Middleware)
下载器中间件是介于Scrapy的request/response处理的钩子框架。 是用于全局修改Scrapy request和response的一个轻量、底层的系统。
主要用法:更换代理,更换Cookie,随机UA,自动重试
激活中间件:在settings中加入到 DOWNLOADER_MIDDLEWARES设置中,该设置是一个字典。 键为中间件类型的路径,值为其中间件的顺序。值数值越小越先执行。
自定义下载器中间件
-
process_request(request, spider):
每当scrapy进行一个request请求时,这个方法被调用. -
process_response(request, response, spider):
process_request() 必须返回以下之一: 返回一个 Response 对象、 返回一个 Request 对象或raise一个 IgnoreRequest 异常。如果其返回一个 Response (可以与传入的response相同,也可以是全新的对象), 该response会被在链中的其他中间件的 process_response() 方法处理。
如果其返回一个 Request 对象,则中间件链停止, 返回的request会被重新调度下载。处理类似于 process_request() 返回request所做的那样。
如果其抛出一个 IgnoreRequest 异常,则调用request的errback(Request.errback)。 如果没有代码处理抛出的异常,则该异常被忽略且不记录(不同于其他异常那样)。
-
process_exception(request, exception, spider):
当下载处理器(download handler)或 process_request() (下载中间件)抛出异常(包括 IgnoreRequest 异常)时, Scrapy调用 process_exception() 。
二、爬虫中间件(Spider Middleware)
爬虫中间件的用法与下载器中间件非常相似,只是他们的作用对象不同。下载器中间件的作用对象是请求request和响应response,爬虫中间件的作用对象是爬虫。
核心方法有四个:
- process_spider_input(response,spider):
当爬虫里面的某一个回调函数parse()被调用之前,调用process_spider_input()方法;
- process_spider_output(response,result,spider):
当运行到yield scrapy.Request() 或者 yield item的时候,被调用;
- process_start_requests(start_requests,spider):
当运行到start_requests()的时候,被调用;
- process_spider_exception(response,exception,spider):
当爬虫本身的代码出现了Exception的时候,爬虫中间件的process_spider_exception()方法被调用。
爬虫中间件的使用频率不如下载中间件,在必要的情况下他可以用来方便数据的处理和爬虫本身异常的处理。