**
urllib.request.Handler模块的介绍
**
首先介绍下 urllib.request.BaseHandler ,它是所有其他 Handler 的父类,它提供了最基本的 Handler 的方法,例
如 default_open() 、 protocol_request() 等。
接下来就有各种 Handler 类继承这个 BaseHandler ,列举如下:
- HTTPDefaultErrorHandler 用于处理HTTP响应错误,错误都会抛出 HTTPError 类型的异常。
- HTTPRedirectHandler 用于处理重定向。
- HTTPCookieProcessor 用于处理 Cookie 。
- ProxyHandler 用于设置代理,默认代理为空。
- HTTPPasswordMgr 用于管理密码,它维护了用户名密码的表。
- HTTPBasicAuthHandler 用于管理认证,如果一个链接打开时需要认证,那么可以用它来解决认证问题。
它们怎么来使用,不用着急,下面会有实例为你演示。
另外一个比较重要的就是 OpenerDirector ,我们可以称之为 Opener ,我们之前用过 urllib.request.urlopen() 这个方法,实际上它就是一个 Opener 。
那么为什么要引入 Opener 呢?因为我们需要实现更高级的功能,之前我们使用的 Request 、 urlopen() 相当于类库为你封装好了极其常用的请求方法,利用它们两个我们就可以完成基本的请求,但是现在不一样了,我们需要实现更高级的功能,所以我们需要深入一层,使用更上层的实例来完成我们的操作。所以,在这里我们就用到了比调用 urlopen() 的对象的更普遍的对象,也就是 Opener 。
Opener 可以使用 open() 方法,返回的类型和 urlopen() 如出一辙。那么它和 Handler 有什么关系?简而言之,就是利用 Handler 来构建 Opener 。
管理认证模块HTTPBasicAuthHandler
from urllib import request
auth_handler = request.HTTPBasicAuthHandler() # 实例化了一个HTTPBasicAuthHandler对象
auth_handler.add_password(realm='PDQ Application', # 调用add_password方法添加用户名和密码
uri='https://mahler:8092/site-updates.py',
user='Ze1al',
passwd='wshichunhuo')
opener = request.build_opener(auth_handler) # 使用它构建一个链接
request.install_opener(opener) # 安装
request.urlopen('http://www.example.com/login.html')
设置代理模块ProxyHandler
from urllib import request
proxy_handler = request.ProxyHandler({ # 设置代理
'http': 'http://218.202.111.10:80', # ProxyHandler的参数是一个字典,key是协议类型,比如http
'https': 'https://180.250.163.34:8888'} # 或者https,value是代理链接,可以添加多个代理
)
opener = request.build_opener(proxy_handler) #构建一个Opener
response = opener.open('https://www.baidu.com')
print(response.read())
处理 Cookie模块HTTPCookieProcessor
# 显示cookie的名称和值
from http import cookiejar
from urllib import request
cookie = cookiejar.CookieJar() # 构建一个cookieJar对象
handler = request.HTTPCookieProcessor(cookie) # 再创建一个handler
opener = request.build_opener(handler)
response = opener.open('http://www.baidu.com')
for item in cookie:
print(item.name+'='+item.value)
如何保存cookie
from http import cookiejar
from urllib import request
filename = 'cookie.txt'
cookie = cookiejar.MozillaCookieJar(filename) # cookiejar的子类,用来处理Cookie与文件相关的事件
handler = request.HTTPCookieProcessor(cookie)
opener = request.build_opener(handler)
response = opener.open('http://www.baidu.com')
cookie.save(ignore_discard=True, ignore_expires=True)