Scrapy中间件
Downloader Middleware和Spider Middleware
Downloader Middleware 用法
- Downloader Middleware是处于Scrapy获得Request和Response之间的处理模块
Scheduler从队列中拿出一个Request发给Downloader执行下载,这个过程会经过Downloader Middleware的处理。
当Downloader将Request下载完成得到Response返回给Spider时会再次经过Downloader Middleware处理
所以Downloader Middleware起作用的位置有两个:
- 在Scheduler调度出队列的Request发送给Downloader下载之前对其进行修改
- 在下载后生成的Response发送给Spider之前对其进行修改
作用:
修改User-Agent、处理重定向、设置代理、失败重试、设置Cookies等功能
Scrapy提供了大量的Downloader Middleware
键值越小代表越靠近Scrapy引擎,键值越大代表越靠近Downloader,数字越小的Downloader Middleware调用优先级越高
⚠️如果要添加自己定义的Downloader Middleware到项目里,不能直接修改上面这个D0WNLOADER_MIDDLEWARES_BASE
,要修改Scrapy提供的另一个变量D0WNLOADER_MIDDLEWARES
并禁用D0WNLOADER_MIDDLEWARES_BASE
里的变量
核心方法
Scrapy内置的Downloader Middleware为Scrapy提供了基础的功能,但在项目中我们往往需要单独定义Downloader Middleware。这个过程非常简单,只需要实现某几个方法即可。每个Downloader Middleware都定义了一个或多个方法的类,核心的方法有如下三个。
middleware.py中的class TutorialDownloaderMiddleware的三个方法:
- process_request(request,spider)
- process_response(request,response,spider)
- process_exception(request,exception,spider)
只需要实现至少一个方法,就可以定义一个Downloader Middleware
process_request(request,spider)
process_response(request,response,spider)
process_exception(request,exception,spider)
Spider Middleware 用法
- Spider Middleware是介入到Scrapy的Spider处理机制的框架
作用位置
当Downloader生成Response之后,Response会被发送给Spider,在发送给Spider之前,Response会首先经过Spider Middleware处理,当Spider处理生成Item和Request之后,Item和Request还会经过Spider Middleware的处理。
作用
Spider Middleware有如下三个作用:
- 在Downloader生成的Response发送给Spider之前,也就是在Response发送给Spider之前对Response进行处理。
- 在Spider生成的Request发送给Scheduler之前,也就是在Request发送给Scheduler之前对Request进行处理。
- 在Spider生成的Item发送给Item Pipeline之前,也就是在Item发送给Item Pipeline之前对Item进行处理。
使用说明
Scrapy其实已经提供了许多Spider Middleware,它们被SPIDER_MIDDLEWARES_BASE这个变量所定义。
SPIDER_MIDDLEWARES_BASE = |
和Downloader Middleware一样,Spider Middleware首先加入到SPIDER_MIDDLEWARES设置中,该设置会和Scrapy中SPIDER_MIDDLEWARES_BASE定义的Spider Middleware合并。然后根据键值的数字优先级排序,得到一个有序列表。第一个Middleware是最靠近引擎的,最后一个Middleware是最靠近Spider的。
核心方法
Scrapy内置的Spider Middleware为Scrapy提供了基础的功能。如果我们想要扩展其功能,只需要实现某几个方法即可。
每个Spider Middleware都定义了以下一个或多个方法的类,核心方法有如下4个。
- process_spider_input(response,spider)。
- process_spider_output(response,result,spider)。
- process_spider_exception(response,exception,spider)。
- process_start_requests(start_requests,spider)。