# 自定义opener
from urllib.request import ProxyHandler,build_opener
from urllib.error import URLError
#设置代理
Proxy_Handler = ProxyHandler({
'http': 'http://127.o.o .1:9743',
'https': 'https://127.0 .0.1:9743'
})
opener = build_opener(Proxy_Handler)
try:
response = opener.open('http://www.baidu.com')
print(response.read().decode('utf-8'))
except URLError as e:
print(e.reason)
#获取cookie
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)
#处理异常
URLError
from urllib import request,error
#打开一个不存在的网页
try:
respense = request.urlopen( 'https://cuiqingcai.com/index.htm')
except error.URLError as e:
print(e.reason)
#reason :同父类一样,用于返回错误的原因
因为 URLError 是 HTTP Error 的父类,所以可以先选择捕获子类的错误,再去捕获父类的错误,所
以上述代码更好的写法如下:
from urllib import request, error
try:
response = request.urlopen(’ https://cuiqingcai.com/index.htm’)
except error.HTTPError as e:
print(e.reason, e.code, e.headers, sep=’\n’)
except error.URLError as e:
print(e . reason)
else:
print(’ Request Successfully')
这样就可以做到先捕获 HTTP Error ,获取它的错误状态码 、原因、 headers 等信息 。 如果不是
HTTP Error 异常,就会捕获 URLError 异常,输出错误原因 。 最后,用 else 来处理正常的逻辑 。 这是一
个较好的异常处理写法 。
有时候, reason 属性返回的不一定是字符串,也可能是一个对象 。 再看下面的实例:
import socket
import urllib.request
import urllib .error
try:
response = urllib.request.urlopen(’ https://WvM.baidu.com’, tim
except l」rllib . err口r.URLError as e:
print(type(e.reason))
if isinstance(e .reason, socket .tir陀out):
print(' TIME OUT')
这里我们直接设置超时时间来强制抛出 timeout 异常 。
运行结果如下:
<class ’ socket .timeout ’>
TIME OUT
可以发现, reason 属性的结果是 socket.timeout 类。 所以,这里我们可以用 is instance ()方法来
判断它的类型,作出更详细的异常判断。
以上述代码更好的写法如下:
from urllib import request, error
try:
response = request.urlopen(’ https://cuiqingcai.com/index.htm’)
except error.HTTPError as e:
print(e.reason, e.code, e.headers, sep=’\n’)
except error.URLError as e:
print(e . reason)
else:
print(’ Request Successfully')
这样就可以做到先捕获 HTTP Error ,获取它的错误状态码 、原因、 headers 等信息 。 如果不是
HTTP Error 异常,就会捕获 URLError 异常,输出错误原因 。 最后,用 else 来处理正常的逻辑 。 这是一
个较好的异常处理写法 。
有时候, reason 属性返回的不一定是字符串,也可能是一个对象 。 再看下面的实例:
import socket
import urllib.request
import urllib .error
try:
response = urllib.request.urlopen(’ https://WvM.baidu.com’, tim
except l」rllib . err口r.URLError as e:
print(type(e.reason))
if isinstance(e .reason, socket .tir陀out):
print(' TIME OUT')
这里我们直接设置超时时间来强制抛出 timeout 异常 。
运行结果如下:
<class ’ socket .timeout ’>
TIME OUT
可以发现, reason 属性的结果是 socket.timeout 类。 所以,这里我们可以用 is instance ()方法来
判断它的类型,作出更详细的异常判断。
#urlparse()该函数实现url识别与分段
from urllib.parse import urlparse
res = urlparse('https://i.cnblogs.com/EditPosts.aspx?postid=9531564')
print(type(res), res)
结果:
<class 'urllib.parse.ParseResult'> ParseResult(scheme='https', netloc='i.cnblogs.com', path='/EditPosts.aspx', params='', query='postid=9531564', fragment='')
from urllib import parse
params = {
'name':'123',
'age':22
}
url = 'http://www.baidu.com?'
n_url = url + parse.urlencode(params)
print(n_url)
结果http://www.baidu.com?name=123&age=22
这个方法非常常用 。 有时为了更加方便地构造参数,我们会事先用字典来表示 。 要转化为 URL
的参数时,只需要调用该方法即可 。
的参数时,只需要调用该方法即可 。
# quote()
该方法可以将内容转化为 URL 编码的格式 。 URL 中带有中文参数时,有时可能会导致乱码的问
题,此时用这个方法可以将巾文字符转化为 URL 编码,示例如下:
from urllib.parse import quote
keyword =’壁纸’
url =’ https://www.baidu.com/s?wd=’+ quote(keyword)
print(url)
这里我们声明了一个中文的搜索文字,然后用 quote ()方法对其进行 URL 编码,最后得到的结果
如下:
https://www.baidu.com/s?wd=%81%E7%BA%B8
该方法可以将内容转化为 URL 编码的格式 。 URL 中带有中文参数时,有时可能会导致乱码的问
题,此时用这个方法可以将巾文字符转化为 URL 编码,示例如下:
from urllib.parse import quote
keyword =’壁纸’
url =’ https://www.baidu.com/s?wd=’+ quote(keyword)
print(url)
这里我们声明了一个中文的搜索文字,然后用 quote ()方法对其进行 URL 编码,最后得到的结果
如下:
https://www.baidu.com/s?wd=%81%E7%BA%B8
#有了 quote ()方法,当然还有 unquote ()方法,它可以进行 URL 解码,示例如下:
from urllib.parse import unquote
url = 'http://www.baidu.com/s?wd=%E5%A3%81%E7%BA%B'
print(unquote(url))