urllib库 高级用法

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

  • 验证

有些网站打开会提示登录,例

urllib库 高级用法_第1张图片
image.png

借助 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的名称和值

urllib库 高级用法_第2张图片
image.png

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)

你可能感兴趣的:(urllib库 高级用法)