这是我参与8月更文挑战的第22天,活动详情查看:8月更文挑战
1.下载中间件:
(官方文档:在这里!
)
(1)什么是下载中间件:
下载中间件是一个用来hooks(钩子)进Scrapy的request/response处理过程的框架。
它是一个轻量级的底层系统,用来全局修改scrapy的request和response。
scrapy框架中的下载中间件,是实现了特殊方法的类。
scrapy系统自带的中间件被放在DOWNLOADER_MIDDLEWARES_BASE设置中
用户自定义的中间件需要在DOWNLOADER_MIDDLEWARES中进行设置
改设置是一个dict,键是中间件类路径,期值是中间件的顺序,是一个正整数0-1000.越小越靠近引擎。
(1)终端获取下载中间件状态信息的命令:
scrapy settings --get=DOWNLOADER_MIDDLEWARES_BASE
复制代码
'''下载器中间件详解:
"scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware": 100, #机器人协议
"scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware": 300, #http身份验证中间件
"scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware": 350, #下载超时中间件
"scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware": 400, #默认请求头中间件
"scrapy.downloadermiddlewares.useragent.UserAgentMiddleware": 500, #用户代理中间件
"scrapy.downloadermiddlewares.retry.RetryMiddleware": 550, #重新尝试中间件
"scrapy.downloadermiddlewares.ajaxcrawl.AjaxCrawlMiddleware": 560, #基于元片段html标签找到“AJAX可抓取”页面变体的中间件
"scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware": 580, #处理字段,为RedirectMiddleware这个中间件的重定向做准备
"scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware": 590, #允许从网站发送/接收压缩流量
"scrapy.downloadermiddlewares.redirect.RedirectMiddleware": 600, #根据响应状态处理请求的重定向
"scrapy.downloadermiddlewares.cookies.CookiesMiddleware": 700, #cookie中间件
"scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware": 750, #IP代理中间件
"scrapy.downloadermiddlewares.stats.DownloaderStats": 850, #用于存储通过它的所有请求,响应和异常的统计信息
"scrapy.downloadermiddlewares.httpcache.HttpCacheMiddleware": 900 #缓存中间件
后面的数字是控制中间件的优先级!
'''
复制代码
(2)下载中间件的API:
每个中间件都是Python的一个类,它定义了以下一个或多个方法:
①process_request()方法:
1.功能: 处理请求,对于通过中间件的每个请求调用此方法
2.参数:request对象;spider对象。
3.重要:返回值(包含着处理逻辑)
Must either:(要么) 以下必选其一!
return None: continue processing this request #返回None:request会被继续交给下个中间件的process_request处理。(默认是None)
or return a Response object #返回response对象:不再给其他中间件,直接给到下载器。
or return a Request object #返回request对象:会直接交给引擎处理。
or raise IgnoreRequest: process_exception() methods of #抛出异常,使用process_exception处理。
②process_response()方法:
1.功能:处理响应,对于通过中间件的每个响应,调用此方法
2.参数:requesst对象;response对象;spider对象。
3.返回值:
Must either;
return a Response object #返回一个response对象:继续交给其他中间件的process_response处理
return a Request object #返回一个request对象:直接交给引擎
or raise IgnoreRequest #抛出异常 使用process_exception处理
③process_exception()方法:
1.功能:处理请求时发生了异常调用
2.参数:requesst对象;response对象;spider对象。
3.返回值:
Must either:
return None: continue processing this exception #返回None:无异常,继续调用其他中间件的process_exception()
return a Response object: stops process_exception() chain #返回Response对象:停止调用其他中间件的process_exception(),交给下载器
return a Request object: stops process_exception() chain #返回request对象:停止调用其他中间件的process_exception(),直接交给引擎。
(3)中间件的实际应用:通过添加中间件设置UA代理及IP代理
1.在middlewares.py中间件文件中添加UA:
(user_agent_list以及ip_pool数据在settings.py文件中)
#UA池
from fake_useragent import UserAgent
import random
class User_AgentDownloaderMiddleware(object):
def process_request(self, request, spider):
#在Request中添加请求头 中间件中设置UA和在settings.py中设置UA的区别:settings.py中设置的UA是全局变量的UA,框架中所有requests的UA都是同一个;而中间件中设置的UA是针对每一个requests的,也就是说可以每个requests都有不同的UA。
request.headers["User-Agent"]=UserAgent().random #随机选择一个UA
return None
#IP池
from .settings import ip_pool
class MyproxyDownloaderMiddleware(object):
def process_request(self, request, spider):
#目的:设置多个代理
#使用meta参数设置代理
thisip = random.choice(ip_pool) #{"ipaddr":"61.129.70.131:8080"},
request.meta["proxy"]="http://"+thisip["ipaddr"]
return None
# 在settings.py中添加:
ip_pool=[
{"ipaddr": ""},
{"ipaddr": ""},
{"ipaddr": ""},
{"ipaddr": ""},
{"ipaddr": ""},
]
复制代码
2.在settings.py配置文件中打开相应的中间件:
# Enable or disable downloader middlewares #是否打开下载器中间件(类)的封印
# See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html
DOWNLOADER_MIDDLEWARES = {
# 'douban.middlewares.DoubanDownloaderMiddleware': 543,
'douban.middlewares.User_AgentDownloaderMiddleware': 500,
'douban.middlewares.MyproxyDownloaderMiddleware': 300,
"scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware": None, #通过设置中间件优先级为None,可以关闭相应的中间件。
}
复制代码
🔆In The End!
| 从现在做起,坚持下去,一天进步一小点,不久的将来,你会感谢曾经努力的你! |
|---|
本博主会持续更新爬虫基础分栏及爬虫实战分栏,认真仔细看完本文的小伙伴们,可以点赞收藏并评论出你们的读后感。并可关注本博主,在今后的日子里阅读更多爬虫文!
如有错误或者言语不恰当的地方可在评论区指出,谢谢!
如转载此文请联系我征得本人同意,并标注出处及本博主名,谢谢 !




近期评论