python爬虫day-3
2019-04-08 本文已影响0人
南音木
个人学习笔记,方便自己查阅,仅供参考,欢迎交流
3.高级用法
更高级的操作(比如 Cookies 处理、代理理设置等)
工具Handler,可以把它理解为各种处理器,有专门处理登录验证,有处理 Cookies,有处理代理设置的。利用它们,我们几乎可以做到 HTTP请求中所有的事情。
urllib.reqest模块里的 BaseHandler 类
它是所有其他 Handler 的父类,它提供了最基本的方法,例如 default_ open()、 protocol_request ()等。
各种 Handler子类继承这个BaseHandler 类
- :用于处理响应错误,错误都会抛出 HTTPError 类型的异常。
- :用于处理重定向。
- :用于处理Cookies。
- :用于设置代理,默认代理为空。
- :用于管理密码,它维护了用户名和密码的表。
- : 用于管理认证,如果一个链接打开时需要认证,那么可以用它来解决认证问题。
比较重要类:OpenerDirector,可以称为 Opener
用法
1. 验证
有些网站在打开时就会弹出提示框,直接提示你输入用户名和密码,验证成功后才能查看页面。
from urllib.request import HTTPPasswordMgrWithDefaultRealm,HTTPBasicAuthHandler,build_opener
from urllib.error import URLError
username = 'username'
password = 'password'
url = 'http://localhost:5000/'
p = HTTPPasswordMgrWithDefaultRealm()
p.add_password(None,url,username,password)
auth_handler = HTTPBasicAuthHandler(p)
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)
2. 代理
from urllib.error import URLError
from urllib.request import ProxyHandler,build_opener
proxy_handler = ProxyHandler({
'http':'http://127.0.0.1:9743',
'https':'http://127.0.0.1:9743'
})
opener = build_opener(proxy_handler)
try:
response = opener.open('https://www.baidu.com')
print(response.read().decode('utf-8'))
except URLError as e:
print(e.reason)
3. Cookies
- 获取网站的 Cookies
import http.cookiejar,urllib.request
cookie = http.cookiejar.CookieJar()
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open('http://www.baidu.com')
for item in cookie:
print(item.name+"="+item.value)
- 文件格式输出
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)
- 保存成 LWP 格式
filename = 'cookies.txt'
cookie = http.cookiejar.LWPCookieJar(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)
- 文件读取并利用
cookie = http.cookiejar.LWPCookieJar()
cookie.load('cookies.txt',ignore_discard=True,ignore_expires=True)
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open('http://www.baidu.com')
print(response.read().decode('utf-8'))