Downloader Middleware即下载中间件,它是处于Scrapy的Request和Response之间的处理模块。
Scheduler从队列中拿出一个Request发送给Downloader执行下载,这个过程会经过Downloader Middleware的处理。
另外,当Downloader将Request下载完成得到Response返回给Spider时会再次经过Downloader Middleware处理。
修改User-Agent、处理重定向、设置代理,失败重试、设置Cookies等功能都需要借助它来实现。
1.使用说明
Scrapy其实已经提供了许多Downloader Middleware,比如负责失败重试,自动重定向等功能的Middleware,它们被DOWNLOADER_MIDDLEWARES_BASE变量所定义。
数字越小越靠近Scrapy引擎,数字越大越靠近Downloader,数字越小的Downloader Middleware会被优先调用。
2.核心方法
process_request(request,spider)
process_response(request,response,spider)
process_exception(request,exception,spider)
实战练习:设置请求的user_agent,修改响应的返送码
第一步:
在middlewares.py里面添加一个RandomUserAgentMiddleware的类,如下所示
class RandomUserAgentMiddleware():
def __init__(self):
self.user_agents = [
'Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
'Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:15.0) Gecko/20100101 Firefox/15.0.1'
]
def process_request(self,request,spider):
request.headers['User-Agent'] = random.choice(self.user_agents)
第二步:
在settings.py中,将DOWNLOADER_MIDDLEWARES取消注释,并设置成如下内容:
DOWNLOADER_MIDDLEWARES = {
'scrapydownloadertest.middlewares.RandomUserAgentMiddleware': 543,
}
第三步:
在RandomUserAgentMiddleware添加如下代码:
def process_response(self,request,response,spider):
response.status = 201
return response