实例化处理器
当我们请求一个带有弹出窗口验证的网页,例如http://httpbin.org/basic-auth/user/passwd
HTTPPasswordMgrWithDefaultRealm函数可以加入用户名和密码信息。
使用HTTPBasicAuthHandler函数实例化处理器。
使用build_opener函数可以实例化一个opener,是上节学习的urlopen()的一般性方法。urlopen()相当于封装了最常用的请求方法,而为了实现更高级的功能,我们需要更深层的配置,更底层的实例来操作。
from urllib.request import HTTPBasicAuthHandler,HTTPPasswordMgrWithDefaultRealm,build_opener
from urllib.error import URLError
username='Tom'
password='123'
url='http://httpbin.org/basic-auth/user/passwd'
p=HTTPPasswordMgrWithDefaultRealm()
p.add_password(None,url,username,password)
handler=HTTPBasicAuthHandler(p)
opener=build_opener(handler)#这里build_opener的参数是处理器对象
try:
response=opener.open(url)
print(response.read().decode('utf-8'))
except URLError as e:
print(e.reason)
使用代理
在网上随便找了个免费代理,发送请求到http://httpbin.org/get
from urllib.error import URLError
from urllib.request import ProxyHandler,build_opener,Request
proxy_server=ProxyHandler({
'http':'http://115.48.205.33:20798',
'https':'http://115.48.205.33:20798'
})
opener=build_opener(proxy_server)
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36'
}
url='http://httpbin.org/get'
#url='http://www.baidu.com'
req=Request(url,headers=headers)
try:
response=opener.open(req)
print(response.read().decode('utf-8'))
except URLError as e:
print(e.reason)
可以看到响应
origin那一项是代理IP.
若代理不可用,则会抛出异常。
[WinError 10061] 由于目标计算机积极拒绝,无法连接。
使用Cookies
cookie和session均是用户登陆的凭证。其中cookie保存在客户端,即浏览器里;session保存在服务器端。
登录服务器时,会产生cookie数据保存用户的登陆信息。将cookie加入请求一并发送至服务器,识别通过后可以进入用户登陆状态,返回只有登录才能访问的内容。通过保存cookie在本地文件,需要的时候载入,便可以实现免登录操作。
获取Cookies
使用http.cookiejar模块的CookieJar()函数可以实例化一个cookie对象,
cookie=http.cookiejar.CookieJar()
使用urllib.request模块的HTTPCookieProcessor()函数可以实例化一个带有cookie的处理器。
handler=urllib.request.HTTPCookieProcessor(cookie)
import http.cookiejar,urllib.request
cookie=http.cookiejar.CookieJar()
handler=urllib.request.HTTPCookieProcessor(cookie)
opener=urllib.request.build_opener(handler)
url='http://www.baidu.com'
response=opener.open(url)
for item in cookie:
print(item.name+'='+item.value)
print(cookie)
返回了cookie数据,格式为name:value.
保存Cookies
为了将cookie保存到本地,方便随时载入,要用到http.cookiejar模块的MozillaCookieProcessor()函数,
cookie=http.cookiejar.LWPCookieJar(filename)
cookie.save(ignore_discard=True,ignore_expires=True)
这里ignore_discard意为忽视被丢弃,ignore_expires意为忽视过期,均设置为True可以让被丢弃的,过期的cookie仍能被保存下来。
import http.cookiejar,urllib.request
file='LWP_cookie.txt'
cookie=http.cookiejar.LWPCookieJar(file)
handler=urllib.request.HTTPCookieProcessor(cookie)
url='http://www.baidu.com'
opener=urllib.request.build_opener(handler)
response=opener.open(url)
cookie.save(ignore_discard=True,ignore_expires=True)
使用MozillCookieJar()函数保存的cookie就是下图的Mozilla格式。
而使用LWPCookieJar()函数保存的cookie就是下图的LWP格式。
载入Cookies
什么格式保存的cookie就用什么方法实例化的cookie对象载入。
cookie.load(file)
可以看到MozillaCookieJar()函数在保存cookie时,应传入文件名作为参数;在载入cookie时,是不传参数。LWPCookieJar()类似。
import http.cookiejar,urllib.request
file='cookie.txt'
cookie=http.cookiejar.MozillaCookieJar()
cookie.load(file)
handler=urllib.request.HTTPCookieProcessor(cookie)
url='http://www.baidu.com'
opener=urllib.request.build_opener(handler)
response=opener.open(url)
print(response.read().decode('utf-8'))
可以返回目标网站的源码。