URLError
URLError是HTTPError的父类型:
出现URLError的错误原因:
- 没有网
- 服务器连接失败
- 找不到指定的服务器
import urllib.request
import urllib.error
url = 'http://www.basjdfkjgkfjgfjhd.com.cn'
try:
re = urllib.request.urlopen(url)
print('here')
except urllib.error.URLError as e:
print(e.reason)
# [Errno 11001] getaddrinfo failed
Handler处理器、自定义Opener
- 高级功能的处理:使用代理和cookie
#向百度发起一个请求
url='http://www.baidu.com/'
#1.创建一个Handler处理器对象
handler=urllib.request.HTTPHandler()
#2,通过处理器对象生成一个Opener对象
opener=urllib.request.build_opener(handler)
#opener作用:发起请求
request=urllib.request.Request(url)
response=opener.open(request)
print(response.read())
# <http.client.HTTPResponse at 0x7dbd780>
代理
- 生活:中介,代购
- 程序: 正向代理:代理客户端获取数据 反向代理:代理服务器提供数据
#使用代码的形式设置客户端代理
#创建处理器对象
handler=urllib.request.ProxyHandler(proxies={'http':'112.95.224.58:80'})
#2。创建opener对象,然后使用该对象发起一个请求
opener=urllib.request.build_opener(handler)
url='https://www.baidu.com/s?ie=utf-8&f=3&rsv_bp=1&rsv_idx=1&tn=baidu&wd=IP&oq=%25E8%25A5%25BF%25E5%2588%25BA%25E4%25BB%25A3%25E7%2590%2586&rsv_pq=fee3639900007be7&rsv_t=0d8cHJ8skuhEa3sCpORP%2FnTD7xO8gLUHq1Azm%2FXGJmqWlTIM3GuMWBSzjTg&rqlang=cn&rsv_enter=1&inputT=1271&rsv_sug3=12&rsv_sug1=6&rsv_sug7=100&rsv_sug2=0&rsv_sug4=1271'
response=opener.open(url)
with open('./daili.html','wb') as fp:
fp.write(response.read())
cookie
cookie是什么?
- http协议,无状态
- 网站登录时候的时候,用来记录用户身份的
#模拟登陆-cookie
#人人网案例:进入需要登录才可以访问的网页,则可以带着cookie值进行访问
url='http://www.renren.com/289676607/profile'
headers={
"Cookie": "anonymid=jl1x24dy-u0udsq; depovince=BJ; _r01_=1; __utma=151146938.1794929042.1534809369.1534809369.1534809369.1; __utmz=151146938.1534809369.1.1.utmcsr=renren.com|utmccn=(referral)|utmcmd=referral|utmcct=/; _de=0832477C7D3BDE6C8C7E21AC68FA766C7DE1374C26B60001; ln_uact=www.zhangbowudi@qq.com; ln_hurl=http://hdn.xnimg.cn/photos/hdn221/20120418/1315/h_main_0Rbs_563500058dec2f76.jpg; jebe_key=626a9db1-7655-44f4-a1f2-6f69b1e0e681%7C55b0a29313d4d905d984b3769dc164d4%7C1534809469266%7C1%7C1534809477953; jebecookies=56edc7c2-4deb-4e27-8742-b6393274dfc7|||||; JSESSIONID=abcH2ScyV4I-2baIjJBvw; ick_login=9fc272ea-6b5d-4898-ae49-9813f4d7331b; p=0c58e07ece2863c4a02deda63944262a7; first_login_flag=1; t=e39afe60de96d0a877661965f4b7bacf7; societyguester=e39afe60de96d0a877661965f4b7bacf7; id=289676607; loginfrom=syshome; wp_fold=0; xnsid=a47161ec"
}
request=urllib.request.Request(url,headers=headers)
response=urllib.request.urlopen(request)
with open('./renren.html','wb') as fp:
fp.write(response.read())
cookiejar对象
- 作用:
自动保存请求中的cookie数据信息 - 注意:
必须和handler和opener一起使用 创建一个cookiejar对象
- import http.cookiejar
- cj = http.cookiejar.CookieJar()
通过cookiejar创建一个handler
- handler = urllib.request.HTTPCookieProcessor(cj)
根据handler创建一个opener
- opener = urllib.request.build_opener(handler)
- 再往下所有的操作都是用opener.open方法去发送请求,因为这里面带着cookie过去了
代码:
#使用cookiejar实现人人网的登陆 import urllib.request import urllib.parse import http.cookiejar cj = http.cookiejar.CookieJar() #请求中的cookie会自动存储到cj对象中 #创建处理器对象(携带cookiejar对象的) handler=urllib.request.HTTPCookieProcessor(cj) #创建opener对象 (携带cookiejar对象) opener=urllib.request.build_opener(handler) #要让cookiejar获取请求中的cookie数据值 url='http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=201873958471' #自定义一个请求对象,让该对象作为opener的open函数中的参数 data={ "email":"www.zhangbowudi@qq.com", "icode":"", "origURL":"http://www.renren.com/home", "domain":"renren.com", "key_id":"1", "captcha_type":"web_login", "password":"40dc65b82edd06d064b54a0fc6d202d8a58c4cb3d2942062f0f7dd128511fb9b", "rkey":"41b44b0d062d3ca23119bc8b58983104", 'f':"https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DpPKf2680yRLbbZMVdntJpyPGwrSk2BtpKlEaAuKFTsW%26wd%3D%26eqid%3Deee20f380002988c000000025b7cbb80" } data=urllib.parse.urlencode(data).encode() request=urllib.request.Request(url,data=data) opener.open(request) #获取当前用户的二级子页面 s_url='http://www.renren.com/289676607/profile' resonse=opener.open(s_url) with open('./renren.html','wb') as fp: fp.write(resonse.read())
评论 (0)