BaseHandler类:
在urllib.request模块中,为所有其他Handler的父类。提供了最基本的方法。例:default_open()、protocol_reques()等
各种Handle子类继承了BaseHandler类,例:
HTTPDefaultErrorHandler:用于处理HTTP响应错误,错误都会抛出HTTPError:类型的异常。
HTTPRedirectHandler:用于处理重定向。
HTTPCookieProcessor:用于处理Cookies。
ProxyHandler:用于设置代理,默认代理为空。
HTTPPasswordMgr :用于管理密码,它维护了用户名和密码的表。
HTTPBasicAuthHandler:用于管理认证,如果一个链接打开时需要认证,那么可以用它来解决认证问题。
OpenerDirector 类:
称为Opener
可使用open()方法,返回的类型和urlopen()一样。
利用Handler来构建Opener
-
验证
有些网站打开会提示登录,例
借助HTTPBasicAuthHandler可成功登录
代码如下:
from urllib.request import HTTPPasswordMgrWithDefaultRealm,HTTPBasicAuthHandler,build_opener
from urllib.error import URLError
username = 'username'
password = 'password'
url = 'http://localhost:5000/'
p = HTTPPasswordMgrWithDefaultRealm()
# 利用add_password()添加进去用户名和密码。建立一个处理验证的Handler
p.add_password(None, url, username, password)
auth_handler = HTTPBasicAuthHandler(p)
# 利用auth_handler并使用build_opener()方法构建了一个Opener,这个Opener在发送请求时就相当于验证成功了
opener = build_opener(auth_handler)
try:
result = opener.open(url)
html = result.read().decode('utf-8')
print(html)
except URLError as e:
print(e.reason)
-
代理
添加代理
from urllib.error import URLError
from urllib.request import ProxyHandler,build_opener
# 使用ProxyHandler,其参数是一个字典。健名是协议类型,健值是代理连接,可以添加多个代理。
proxy_handler = ProxyHandler({'http':'http://127.0.0.1:9743',
'https':'https://127.0.0.1:9743'})
oprner = build_opener(proxy_handler)
# 利用handler及build_opener()方法构造一个Opener,发送请求即可
try:
response = opener.open('https://www.baidu.com')
print(response.read().decode('utf-8'))
except URLError as e:
print(e.reason)
-
Cookies
import http.cookiejar,urllib.request
# 声明一个CookieJar对象
cookie = http.cookiejar.CookieJar()
# 利用HTTPCookieProcessor构造一个Handler
handler = urllib.request.HTTPCookieProcessor(cookie)
# 利用build_opener()方法构造出Opener
opener = urllib.request.build_opener(handler)
# 折行open()函数
response = opener.open('http://www.baidu.com')
for item in cookie:
print(item.name+"="+item.value)
输出了每条Cookie的名称和值
Cookies是以文本形式保存的。
可输出成文本格式
filename = 'cookies.txt'
cookie = http.cookiejar.MozillaCookieJar(filename)
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open('http://www.baidu.com')
cookie.save(ignore_discard=True, ignore_expires=True)