2.6 高级用法
处理更高级操作时(Cookies处理,代理设置),需要一个强大的工具Handler,可以理解成各种处理器,有处理登录认证的、有处理Cookies的、有处理代理设置的。利用这些几乎可以做到HTTP请求中所有事情。当中urllib.request模块里的 BaseHandler类是所有其他Handler的父类,提供了最基本的方法。如default_open()、protocol_request()等。
HTTPdefaultErrorHandler: 用于处理HTTP响应错误,错误会抛出HTTPError类型异常
HTTPRedirectHandler: 用于处理重定向
HTTPCookieProcessor: 用于处理Cookies
ProxyHandler: 用于设置代理,默认为空
HTTPPasswordMgr: 用于管理密码,维护了用户名和密码的表
HTTPBacisAuthHandler: 用于管理认证,弱一个链接打开需要认证,可以用它解决认证问题
官方文档还有其他Handler类:urllib.request — Extensible library for opening URLs — Python 3.10.2 documentation
另一个常用类OpenerDirector也叫Opener,urlopen()就可以看做是urllib提供的一个Opener。前面的Rquest和urlopen相当于类库封装好的常用的请求方法,可以完成基本的请求,但要实现更高级操作需要深入一层配置。所以需要用到Opener。
还是以百度为栗子
import urllib.request
url = 'http://www.baidu.com'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1'
}
request = urllib.request.Request(url=url, headers=headers)
# 获取handler对象
handler = urllib.request.HTTPHandler()
# 获取opener对象
opener = urllib.request.build_opener(handler)
# 调用open方法
response = opener.open(