Downloader Middleware和Spider Middleware

Downloader Middleware 用法

  • Downloader Middleware是处于Scrapy获得Request和Response之间的处理模块

Scheduler从队列中拿出一个Request发给Downloader执行下载,这个过程会经过Downloader Middleware的处理。

当Downloader将Request下载完成得到Response返回给Spider时会再次经过Downloader Middleware处理

所以Downloader Middleware起作用的位置有两个:

  1. 在Scheduler调度出队列的Request发送给Downloader下载之前对其进行修改
  2. 在下载后生成的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 = 
{
'scrapy.spidermiddlewares.httperror.HttpErrorMiddlewareapos':50
'scrapy.spidermiddlewares.offsite.0ffsiteMiddleware':500,
'scrapy.spidermiddlewares.referer.RefererMiddleware':700,
'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware':800,
'scrapy.spidermiddlewares.depth.DepthMiddleware':900,
}

和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)。