一、urllib.requet
- urllib.request
用來發(fā)送請求獲取響應(yīng)
response_obj =urllib.request.urlopen(url) 獲得HTTPResponse object 響應(yīng)對象
response_obj.read() # 獲取的是二進(jìn)制數(shù)據(jù)
response_obj.read().decode() # 將數(shù)據(jù)轉(zhuǎn)化為字符串(默認(rèn)utf8編碼)
response_obj.readline() # 按行讀取
response_obj.readlines() # 獲取多行 裝入列表
response_obj.getcode() # 服務(wù)器響應(yīng)的狀態(tài)碼
response_obj.geturl() # 響應(yīng)的來源
response_obj.getheaders() # 獲取響應(yīng)頭
# 傳入 url路徑 和 本地的路徑(將來獲取數(shù)據(jù)存到哪里)
# 圖片
urllib.request.urlretrieve(img_url,'./download/pengyou.jpg')
# 文本
text_url = 'http://www.baidu.com/'
urllib.request.urlretrieve(text_url,'./download/baidu.html')
# 視頻
video_url = 'http://mvvideo11.meitudata.com/5bcc0c5280f832321.mp4?k=15493c77ef25f5e2995eb033f6addc48&t=5bd168a3'
urllib.request.urlretrieve(video_url,'./download/cole.mp4')
- urllib.parse
import urllib.parse
# 對url 中文進(jìn)行編碼
code = urllib.parse.quote('狗子')
print(code)
# 對url 中文進(jìn)行解碼
code1 = urllib.parse.unquote('%E7%8B%97%E5%AD%90')
print(code1)
url = 'https://image.baidu.com/search/index?tn=baiduimage&'
date = {
'id':'班助',
'sex':'男',
'age':'十八'
}
# urlencode傳入請求的數(shù)據(jù)對象 返回url編碼后的字符串
query_string = urllib.parse.urlencode(date)
# print(query_string)
print(url+query_string)
結(jié)果:https://image.baidu.com/search/index?tn=baiduimage&id=%E7%8F%AD%E5%8A%A9&sex=%E7%94%B7&age=%E5%8D%81%E5%85%AB
# 創(chuàng)建請求對象
# 使用Request 傳入 url(必選參數(shù)) data(請求參數(shù)璃赡,需要字節(jié)流) headers(請求頭)
request_obj = urllib.request.Request(url,headers=headers)
# urlopen的參數(shù) 可以是簡單的字符串 也可以是請求對象
# 如果傳入的請求對象 則可以進(jìn)行更高級的設(shè)置(比如設(shè)置headers)
# 獲得相應(yīng)對象
response_obj = urllib.request.urlopen(request_obj)
表單數(shù)據(jù)處理
# 處理表單數(shù)據(jù) 先變成符合url規(guī)則的字符串 然后再把字符串轉(zhuǎn)換成字節(jié)碼
bytes_data = urllib.parse.urlencode(form_data).encode()
response = urllib.request.urlopen(request, data=bytes_data)
- urllib.error
異常處理:Exception 官方的異呈硇基類
URLError\HTTPError是Exception的子類遥倦,在向url發(fā)送請求的時(shí)候,會(huì)出現(xiàn)的一些異常情況
HTTPError是URLError的子類
所以 如果兩個(gè)異常都要捕獲 要把http放上面 否則都會(huì)被URL捕獲
import urllib.request
import urllib.error
url = 'http://www.baidu.com'
try:
response = urllib.request.urlopen(url)
print(response)
except urllib.error.HTTPError as e:
print("HTTP錯(cuò)誤")
except urllib.error.URLError as e:
print("URL地址有誤")
- Handler處理器占锯、自定義Opener
urllib.request.urlopen() 函數(shù)實(shí)現(xiàn)簡單的發(fā)送請求袒哥,不能定制請求頭
引入了構(gòu)建請求對象
urllib.request.Request() 創(chuàng)建的request對象可以定制頭部,但不能實(shí)現(xiàn)設(shè)置代理烟央、攜帶cookie等更高級的功能
引入了 Handler和Opener
可以實(shí)現(xiàn)代理统诺、攜帶cookie等高級功能
import urllib.request
import urllib.error
# 1. 創(chuàng)建handler對象
handler = urllib.request.HTTPHandler() # 用于保存http的cookie
# 2. 將handler傳入函數(shù)獲取opener
opener = urllib.request.build_opener(handler)
url = "http://www.baidu.com/"
# 3. 通過open()函數(shù)來發(fā)送請求
# response = opener.open(url) # 可以傳url字符串 也可以傳request對象
user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 " \
"(KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36"
headers = {"User-Agent": user_agent}
request = urllib.request.Request(url, headers=headers)
response = opener.open(request)
print(response)
- 設(shè)置代理
代理:作為中間人,幫助客戶端(瀏覽器)訪問其他服務(wù)器的服務(wù)器
代碼請求中設(shè)置代理
import urllib.request
proxy = {"http": "114.226.65.220:6666"} # {"協(xié)議":"地址:端口"}
# 1. 設(shè)置代理使用 ProxyHandler
handler = urllib.request.ProxyHandler(proxy)
# 2. 把創(chuàng)建的handler傳入build函數(shù) 創(chuàng)建出opener
opener = urllib.request.build_opener(handler)
url = "http://www.baidu.com/s?wd=ip" # 請求字符串
# 客戶端信息
user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 " \
"(KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36"
headers = {"User-Agent": user_agent}
request = urllib.request.Request(url, headers=headers)
# 3. 使用opener打開
response = opener.open(request)
# 4. 寫入本地文件 以便查看效果
with open("ip.html", "wb") as fp:
fp.write(response.read())