1、scrapy中间件的分类和作用
1.1 scrapy中间件的分类
根据scrapy运行流程中所在位置不同分为:
-
下载中间件
-
爬虫中间件
1.2 scrapy中间的作用
-
主要功能是在爬虫运行过程中进行一些处理,如对非200响应的重试(重新构造Request对象yield给引擎)
-
也可以对header以及cookie进行更换和处理
-
其他根据业务需求实现响应的功能
但在scrapy默认的情况下 两种中间件都在middlewares.py一个文件中
爬虫中间件使用方法和下载中间件相同,常用下载中间件
2、下载中间件的使用方法:
接下来我们对爬虫进行修改完善,通过下载中间件来学习如何使用中间件 编写一个Downloader Middlewares和我们编写一个pipeline一样,定义一个类,然后在setting中开启
Downloader Middlewares默认的方法:在中间件类中,有时需要重写处理请求或者响应的方法】
-
process_request(self, request, spider):【此方法是用的最多的】
-
当每个request通过下载中间件时,该方法被调用。
-
返回None值:继续请求 没有return也是返回None,该request对象传递给下载器,或通过引擎传递给其他权重低的process_request方法 【如果所有的下载器中间件都返回为None,则请求最终被交给下载器处理】
-
返回Response对象:不再请求,把response返回给引擎【如果返回为请求,则将请求交给调度器】
-
返回Request对象:把request对象交给调度器进行后续的请求
-
-
process_response(self, request, response, spider):
-
当下载器完成http请求,传递响应给引擎的时候调用
-
返回Resposne:通过引擎交给爬虫处理或交给权重更低的其他下载中间件的process_response方法 【如果返回为请求,则将请求交给调度器】
-
返回Request对象:交给调取器继续请求,此时将不通过其他权重低的process_request方法 【将响应对象交给spider进行解析】
-
-
process_exception(self, request, exception, spider):
-
请求出现异常的时候进行调用
-
比如当前请求被识别为爬虫 可以使用代理
def process_exception(self, request, exception, spider): request.meta['proxy'] = 'http://ip地址' request.dont_filter = True # 因为默认请求是去除重复的,因为当前已经请求过,所以需要设置当前为不去重 return request # 将修正后的对象重新进行请求
-
-
在settings.py中配置开启中间件,权重值越小越优先执行 【同管道的注册使用】
-
spider参数:为爬虫中类的实例化可以在这里进行调用爬虫中的属性
如:spider.name