|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 Stubborn 于 2020-1-7 01:08 编辑
middlewares(下载中间件介绍)
[/b]
中间件是Scrapy里面的一个核心概念。使用中间件可以在爬虫的请求发起之前或者请求返回之后对数据进行定制化修改,从而开发出适应不同情况的爬虫。
中间件能在中途劫持数据,做一些修改再把数据传递出去。不同点在于,中间件是开发者主动加进去的组件。中间件主要用来辅助开发。
在Scrapy中有两种中间件:下载器中间件(Downloader Middleware)和爬虫中间件(Spider Middleware)。
下载中间键DownloaderMiddleware(上图4,5号标记处为下载中间件)
Scrapy的官方文档中,对下载器中间件的解释如下。
下载器中间件是介于Scrapy的request/response处理的钩子框架,是用于全局修改Scrapy request和response的一个轻量、底层的系统。
下载中间键(DownloaderMiddleware)位于Scrapy引擎和下载器之间的框架,主要是处理Scrapy引擎与下载器之间的请求及响应。下载中间件处理的过程主要在调度器经引擎(engine)发送request请求的时候以及网页将response结果返回给spiders的时候,所以-----下载中间件是介于scrapy的request/response处理的钩子,用于修改request和response.
也许上面的介绍非常绕口:说白说开了,就是中间件可以干这些事情:更换代理IP,更换Cookies,更换User-Agent,自动重试。
下面是假如没有中间件,和有中间件的情况,可能会更方便理解。大概的意思是,当爬虫文件发出一个请求:yield scrapy.Request(url=url,callback=self.parse_one,meta={'item': copy.deepcopy(item)})
这个请求,并不会直接向服务器请求资源,而是Scrapy拿着它,丢给下载中间件,看看程序猿是不是要加点"料",或者说额外"加工","加工"完成之后,才会真正的向服务器去请求资源。
这说下中间键里面的三个函数,因为里面函数乱定义的不会执行,需要对应的名字,来处理对应的请求(request)、爬虫(spdier)、响应(response)。
- def process_request(self, request, spider):
参数介绍:
- request (Request 对象) – 处理的request
- spider (Spider 对象) – 该request对应的spider
注意事项:
- 当每个request通过下载中间件时,该方法被调用:
- process_request() 必须返回其中之一: 返回 None 、返回一个 Response 对象、返回一个 Request 对象或raise IgnoreRequest
- 返回None: Scrapy继续处理该request,执行其他的中间件的相应方法,直到合适的下载器处理函数(download handler)被调用,该request被执行;
- 返回response对象:Scrapy将不会调用任何其他的process_request或process_exception方法,或相应的下载函数,返回该response,已安装的中间件的process_response方法会在每个response返回时被调用;
- 返回request对象:Scrapy会停止调用process_request方法并重新调度返回的request,也就是把request重新返回,进入调度器;
- 返回raise IgnoreRequest异常:下载中间件的process_exception方法被调用,如果没有任何一个方法处理该异常,则request的errback(Request.errback)方法被调用;如果没有代码处理抛出的异常,则该异常被忽略且不记录.
- def process_response(self, request, response, spider):
参数介绍:
- request (Request 对象) – response所对应的request
- response (Response 对象) – 被处理的response
- spider (Spider 对象) – response所对应的spider
注意事项:
- 当下载器完成http请求,传递response给engine时,该方法被调用:
- process_response() 必须返回以下之一: 返回一个 Response 对象、 返回一个 Request 对象或raise一个 IgnoreRequest 异常。
- 返回一个response对象:该response会被在链中的其他中间件的process_response方法处理;
- 返回一个request对象:中间件链停止,返回的request会被重新调度下载.
- 抛出一个IgnoreRequest异常:调用request的errback(Request.errback).如果没有代码处理抛出的异常,则该异常被忽略且不记录.
- def process_exception(self, request, exception, spider):
参数介绍:
- request (是 Request 对象) – 产生异常的request
- exception (Exception 对象) – 抛出的异常
- spider (Spider 对象) – request对应的spider
注意事项:
- 当下载处理器(download handler)或 process_request() (下载中间件)抛出异常(包括 IgnoreRequest 异常)时, Scrapy调用 process_exception() 。
- 当下载处理器(download handler)或process_request抛出异常时,Scrapy调用process_exception函数处理,但是不处理process_response返回的异常。
- process_exception() 应该返回以下之一: 返回 None 、 一个 Response 对象、或者一个 Request 对象。
- 返回None:Scrapy将会继续处理该异常,调用已安装的其他中间件的process_exception方法,直到所有中间件都调用完毕,则调用默认的异常处理;
- 返回一个Response对象:异常被纠正,已安装的中间件链的process_response方法则调用.Scrapy将不会调用任何其他中间件的process_exception方法;
- 返回一个request对象:返回的request对象会重新调用下载,将停止中间件的process_exception方法执行;
示例代码
|
评分
-
参与人数 3 | 荣誉 +11 |
鱼币 +10 |
贡献 +7 |
收起
理由
|
H原子
| + 1 |
|
+ 1 |
|
这是她
| + 5 |
+ 5 |
+ 3 |
楼主真是太厉害了 |
maogo
| + 5 |
+ 5 |
+ 3 |
无条件支持楼主! |
查看全部评分
|