Python爬虫学习笔记 2-3:Scrapy中间件
Published On 2019/12/25 Wedesday, Singapore
上一节我们讲解scrapy的项目管道的使用, 这一节介绍中间件的使用。
本文为Datacatsle Python爬虫(入门+进阶)课程学习笔记。
Scrapy框架中的中间件主要分两类:蜘蛛中间件和下载中间件。 蜘蛛中间件是介入到Scrapy的spider处理机制的钩子框架,可以添加代码来处理发送给 Spiders 的response及spider产生的item和request。当蜘蛛传递请求和items给引擎的过程中,蜘蛛中间件可以对其进行处理(过滤出 URL 长度比 URLLENGTH_LIMIT 的 request。)当引擎传递响应给蜘蛛的过程中,蜘蛛中间件可以对响应进行过滤(例如过滤出所有失败(错误)的 HTTP response)
下载中间件是处于引擎(Engine)和下载器(Downloader)之间的一层组件,可以有多个下载中间件被加载运行。当引擎传递请求给下载器的过程中,下载中间件可以对请求进行处理 (例如增加http header信息,增加proxy信息等);在下载器完成http请求,传递响应给引擎的过程中, 下载中间件可以对响应进行处理(例如进行gzip的解压等)
下载中间件的主要函数
process_request(request, spider)
: 当每个request通过下载中间件时,该方法被调用。需要传入的参数为:
- request (Request 对象) – 处理的request
- spider (Spider 对象) – 该request对应的spider
其必须返回其中之一:
- None:scrapy将继续处理该request,执行其他的中间件的相应方法,直到合适的下载器处理函数(download handler)被调用, 该request被执行(其response被下载)
- Response对象: scrapy将不会调用任何其他的process_request()或 process_exception()方法,或相应的下载函数。其将返回该response,已安装的中间件的 process_response() 方法则会在每个response返回时被调用
-
Request对象 :scrapy则会停止调用 process_request方法并重新调度返回的request,也就是把request重新返回,进入调度器重新入队列
- Raise IgnoreRequest异常 :安装的下载中间件的 process_exception()方法会被调用。如果没有任何一个方法处理该异常,则request的errback(Request.errback)方法会被调用。如果没有代码处理抛出的异常,则该异常被忽略且不记录(不同于其他异常那样).
process_response(request, response, spider): 当下载器完成http请求,传递response给引擎的时候,该方法被调用。需要传入的参数为:
- request (Request 对象) – response所对应的request
- response (Response 对象) – 被处理的response
- spider (Spider 对象) – response所对应的spider
其必须返回其中之一:
- 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()函数处理,但不处理process_response返回的异常。
需要传入的参数为:
- request (是 Request 对象) – 产生异常的request
- exception (Exception 对象) – 抛出的异常
- spider (Spider 对象) – request对应的spider
其必须返回其中之一:
- None :Scrapy将会继续处理该异常,接着调用已安装的其他中间件的 process_exception()方法,直到所有中间件都被调用完毕,则调用默认的异常处理
- Response 对象:相当于异常被纠正了,则已安装的中间件链的 process_response()方法被调用。Scrapy将不会调用任何其他中间件的 process_exception()方法
- Request 对象:则返回的request将会被重新调用下载。这将停止中间件的 process_exception() 方法执行,就如返回一个response的那样