昆明網(wǎng)站建設(shè)哪家好網(wǎng)絡(luò)推廣入門教程
標(biāo)題 | 詳情 |
---|---|
作者簡(jiǎn)介 | 愚公搬代碼 |
頭銜 | 華為云特約編輯,華為云云享專家,華為開(kāi)發(fā)者專家,華為產(chǎn)品云測(cè)專家,CSDN博客專家,CSDN商業(yè)化專家,阿里云專家博主,阿里云簽約作者,騰訊云優(yōu)秀博主,騰訊云內(nèi)容共創(chuàng)官,掘金優(yōu)秀博主,亞馬遜技領(lǐng)云博主,51CTO博客專家等。 |
近期榮譽(yù) | 2022年度博客之星TOP2,2023年度博客之星TOP2,2022年華為云十佳博主,2023年華為云十佳博主,2024年華為云十佳博主等。 |
博客內(nèi)容 | .NET、Java、Python、Go、Node、前端、IOS、Android、鴻蒙、Linux、物聯(lián)網(wǎng)、網(wǎng)絡(luò)安全、大數(shù)據(jù)、人工智能、U3D游戲、小程序等相關(guān)領(lǐng)域知識(shí)。 |
歡迎 | 👍點(diǎn)贊、?評(píng)論、?收藏 |
文章目錄
- 🚀前言
- 🚀一、請(qǐng)求模塊urllib3
- 🔎1. urllib3 簡(jiǎn)介
- 🔎2. 安裝 urllib3
- 🔎3. 發(fā)送網(wǎng)絡(luò)請(qǐng)求
- 🦋3.1 GET 請(qǐng)求
- 🦋3.2 POST 請(qǐng)求
- 🦋3.3 請(qǐng)求重試
- 🔎4. 處理響應(yīng)內(nèi)容
- 🦋4.1 獲取響應(yīng)頭
- 🦋4.2 處理 JSON 響應(yīng)
- 🦋4.3 處理二進(jìn)制數(shù)據(jù)(如圖片)
- 🔎5.復(fù)雜請(qǐng)求的發(fā)送
- 🦋5.1 設(shè)置請(qǐng)求頭
- 🦋5.2 設(shè)置超時(shí)
- 🦋5.3 設(shè)置代理
- 🔎6.上傳文件
🚀前言
在現(xiàn)代編程中,網(wǎng)絡(luò)請(qǐng)求是一個(gè)不可或缺的環(huán)節(jié),無(wú)論是數(shù)據(jù)抓取、API調(diào)用還是后端服務(wù)的交互,都會(huì)涉及到網(wǎng)絡(luò)通訊。而在眾多網(wǎng)絡(luò)請(qǐng)求庫(kù)中,urllib3因其強(qiáng)大的功能和易用性,成為了許多開(kāi)發(fā)者的首選。它不僅提供了對(duì)HTTP協(xié)議的全面支持,還具備連接池、重試機(jī)制和SSL/TLS驗(yàn)證等多種實(shí)用特性。
在本文中,我們將深入探討urllib3模塊的基本用法,幫助你更好地理解如何利用這個(gè)庫(kù)進(jìn)行高效的網(wǎng)絡(luò)請(qǐng)求。不論你是初學(xué)者還是有經(jīng)驗(yàn)的開(kāi)發(fā)者,掌握urllib3都將為你的項(xiàng)目帶來(lái)極大的便利。
🚀一、請(qǐng)求模塊urllib3
🔎1. urllib3 簡(jiǎn)介
- 定義:urllib3 是一個(gè)功能強(qiáng)大、結(jié)構(gòu)清晰的 Python HTTP 客戶端庫(kù),被許多原生 Python 系統(tǒng)采用。
- 核心特性:
- 線程安全
- 連接池管理
- 客戶端 SSL/TLS 驗(yàn)證
- 多部分編碼文件上傳
- 請(qǐng)求重試與 HTTP 重定向處理
- 支持 gzip/deflate 編碼
- 支持 HTTP/SOCKS 代理
- 100% 測(cè)試覆蓋率
🔎2. 安裝 urllib3
- 通過(guò)
pip
安裝(非 Anaconda 環(huán)境):pip install urllib3
🔎3. 發(fā)送網(wǎng)絡(luò)請(qǐng)求
🦋3.1 GET 請(qǐng)求
- 步驟:
- 創(chuàng)建
PoolManager
對(duì)象管理連接池。 - 調(diào)用
request()
方法發(fā)送請(qǐng)求。
- 創(chuàng)建
- 語(yǔ)法:
request(method, url, fields=None, headers=None, urlopen_kw)
method
: 請(qǐng)求方法(如GET
、POST
)。url
: 目標(biāo) URL。fields
: 請(qǐng)求參數(shù)(字典形式)。headers
: 請(qǐng)求頭(字典形式)。
示例 1:基礎(chǔ) GET 請(qǐng)求
import urllib3 # 導(dǎo)入urllib3模塊
url = "http://httpbin.org/get"
http = urllib3.PoolManager() # 創(chuàng)建連接池管理對(duì)象
r = http.request('GET',url) # 發(fā)送GET請(qǐng)求
print(r.status) # 打印請(qǐng)求狀態(tài)碼
示例 2:多服務(wù)器請(qǐng)求
import urllib3 # 導(dǎo)入urllib3模塊
urllib3.disable_warnings() # 關(guān)閉ssl警告
jingdong_url = 'https://www.jd.com/' # 京東url地址
python_url = 'https://www.python.org/' # Python url地址
baidu_url = 'https://www.baidu.com/' # 百度url地址
http = urllib3.PoolManager() # 創(chuàng)建連接池管理對(duì)象
r1 = http.request('GET',jingdong_url) # 向京東地址發(fā)送GET請(qǐng)求
r2 = http.request('GET',python_url) # 向python地址發(fā)送GET請(qǐng)求
r3 = http.request('GET',baidu_url) # 向百度地址發(fā)送GET請(qǐng)求
print('京東請(qǐng)求狀態(tài)碼:',r1.status)
print('python請(qǐng)求狀態(tài)碼:',r2.status)
print('百度請(qǐng)求狀態(tài)碼:',r3.status)
🦋3.2 POST 請(qǐng)求
- 關(guān)鍵:設(shè)置
method='POST'
并通過(guò)fields
傳遞表單數(shù)據(jù)。
示例 3:發(fā)送 POST 請(qǐng)求
import urllib3 # 導(dǎo)入urllib3模塊
urllib3.disable_warnings() # 關(guān)閉ssl警告
url = 'https://www.httpbin.org/post' # post請(qǐng)求測(cè)試地址
params = {'name':'Jack','country':'中國(guó)','age':30} # 定義字典類型的請(qǐng)求參數(shù)
http = urllib3.PoolManager() # 創(chuàng)建連接池管理對(duì)象
r = http.request('POST',url,fields=params) # 發(fā)送POST請(qǐng)求
print('返回結(jié)果:',r.data.decode('utf-8'))
🦋3.3 請(qǐng)求重試
- 參數(shù):
retries
控制重試次數(shù)(默認(rèn) 3 次,False
禁用重試)。
示例 4:設(shè)置重試策略
import urllib3 # 導(dǎo)入urllib3模塊
urllib3.disable_warnings() # 關(guān)閉ssl警告
url = 'https://www.httpbin.org/get' # get請(qǐng)求測(cè)試地址
http = urllib3.PoolManager() # 創(chuàng)建連接池管理對(duì)象
r = http.request('GET',url) # 發(fā)送GET請(qǐng)求,默認(rèn)重試請(qǐng)求
r1 = http.request('GET',url,retries=5) # 發(fā)送GET請(qǐng)求,設(shè)置5次重試請(qǐng)求
r2 = http.request('GET',url,retries=False) # 發(fā)送GET請(qǐng)求,關(guān)閉重試請(qǐng)求
print('默認(rèn)重試請(qǐng)求次數(shù):',r.retries.total)
print('設(shè)置重試請(qǐng)求次數(shù):',r1.retries.total)
print('關(guān)閉重試請(qǐng)求次數(shù):',r2.retries.total)
🔎4. 處理響應(yīng)內(nèi)容
🦋4.1 獲取響應(yīng)頭
import urllib3 # 導(dǎo)入urllib3模塊
urllib3.disable_warnings() # 關(guān)閉ssl警告
url = 'https://www.httpbin.org/get' # get請(qǐng)求測(cè)試地址
http = urllib3.PoolManager() # 創(chuàng)建連接池管理對(duì)象
r = http.request('GET',url) # 發(fā)送GET請(qǐng)求,默認(rèn)重試請(qǐng)求
response_header = r.info() # 獲取響應(yīng)頭
for key in response_header.keys(): # 循環(huán)遍歷打印響應(yīng)頭信息print(key,':',response_header.get(key))
🦋4.2 處理 JSON 響應(yīng)
import urllib3 # 導(dǎo)入urllib3模塊
import json # 導(dǎo)入json模塊
urllib3.disable_warnings() # 關(guān)閉ssl警告
url = 'https://www.httpbin.org/post' # post請(qǐng)求測(cè)試地址
params = {'name':'Jack','country':'中國(guó)','age':30} # 定義字典類型的請(qǐng)求參數(shù)
http = urllib3.PoolManager() # 創(chuàng)建連接池管理對(duì)象
r = http.request('POST',url,fields=params) # 發(fā)送POST請(qǐng)求
j = json.loads(r.data.decode('unicode_escape')) # 將響應(yīng)數(shù)據(jù)轉(zhuǎn)換為字典類型
print('數(shù)據(jù)類型:',type(j))
print('獲取form對(duì)應(yīng)的數(shù)據(jù):',j.get('form'))
print('獲取country對(duì)應(yīng)的數(shù)據(jù):',j.get('form').get('country'))
🦋4.3 處理二進(jìn)制數(shù)據(jù)(如圖片)
import urllib3 # 導(dǎo)入urllib3模塊
urllib3.disable_warnings() # 關(guān)閉ssl警告
url = 'https://search-operate.cdn.bcebos.com/4466f881476a1ee804b4a32aee790675.gif' # 圖片請(qǐng)求地址
http = urllib3.PoolManager() # 創(chuàng)建連接池管理對(duì)象
r = http.request('GET',url) # 發(fā)送網(wǎng)絡(luò)請(qǐng)求
print(r.data) # 打印二進(jìn)制數(shù)據(jù)
f = open('python.png','wb+') # 創(chuàng)建open對(duì)象
f.write(r.data) # 寫入數(shù)據(jù)
f.close() # 關(guān)閉
🔎5.復(fù)雜請(qǐng)求的發(fā)送
🦋5.1 設(shè)置請(qǐng)求頭
- 目的:模擬瀏覽器請(qǐng)求,避免被服務(wù)器識(shí)別為爬蟲。
- 實(shí)現(xiàn)步驟:
- 獲取請(qǐng)求頭信息:
- 在瀏覽器(如 Firefox)中按
F12
打開(kāi)開(kāi)發(fā)者工具。 - 訪問(wèn)目標(biāo)網(wǎng)頁(yè)(如
https://www.baidu.com
)。 - 在“網(wǎng)絡(luò)”選項(xiàng)卡中選擇一個(gè)請(qǐng)求,復(fù)制其
User-Agent
值。
- 在瀏覽器(如 Firefox)中按
- 設(shè)置請(qǐng)求頭:將
User-Agent
作為字典鍵,瀏覽器信息作為值。
- 獲取請(qǐng)求頭信息:
示例:設(shè)置請(qǐng)求頭
import urllib3 # 導(dǎo)入urllib3模塊
urllib3.disable_warnings() # 關(guān)閉ssl警告
url = 'https://www.httpbin.org/get' # get請(qǐng)求測(cè)試地址
# 定義火狐瀏覽器請(qǐng)求頭信息
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0'}
http = urllib3.PoolManager() # 創(chuàng)建連接池管理對(duì)象
r = http.request('GET',url,headers=headers) # 發(fā)送GET請(qǐng)求
print(r.data.decode('utf-8')) # 打印返回內(nèi)容
🦋5.2 設(shè)置超時(shí)
- 兩種設(shè)置方式:
- 全局設(shè)置:在
PoolManager
對(duì)象初始化時(shí)指定timeout
。 - 單次請(qǐng)求設(shè)置:在
request()
方法中直接傳遞timeout
。
- 全局設(shè)置:在
- 精確控制:使用
Timeout
類分別設(shè)置連接超時(shí)和讀取超時(shí)。
示例:基礎(chǔ)超時(shí)設(shè)置
import urllib3 # 導(dǎo)入urllib3模塊
urllib3.disable_warnings() # 關(guān)閉ssl警告
baidu_url = 'https://www.baidu.com/' # 百度超時(shí)請(qǐng)求測(cè)試地址
python_url = 'https://www.python.org/' # Python超時(shí)請(qǐng)求測(cè)試地址
http = urllib3.PoolManager() # 創(chuàng)建連接池管理對(duì)象
try:r = http.request('GET',baidu_url,timeout=0.01)# 發(fā)送GET請(qǐng)求,并設(shè)置超時(shí)時(shí)間為0.01秒
except Exception as error:print('百度超時(shí):',error)
http2 = urllib3.PoolManager(timeout=0.1) # 創(chuàng)建連接池管理對(duì)象,并設(shè)置超時(shí)時(shí)間為0.1秒
try:r = http2.request('GET', python_url) # 發(fā)送GET請(qǐng)求
except Exception as error:print('Python超時(shí):',error)
示例:精確超時(shí)控制
from urllib3 import Timeout
import urllib3 # 導(dǎo)入urllib3模塊
urllib3.disable_warnings()
# 設(shè)置連接超時(shí) 0.5秒,讀取超時(shí) 0.1秒
timeout = Timeout(connect=0.5, read=0.1)# 方式1:全局設(shè)置
http = urllib3.PoolManager(timeout=timeout)
http.request("GET", "https://www.python.org")# 方式2:單次請(qǐng)求設(shè)置
http = urllib3.PoolManager()
http.request("GET", "https://www.python.org", timeout=timeout)
🦋5.3 設(shè)置代理
- 核心類:
ProxyManager
,需指定代理地址和請(qǐng)求頭。 - 作用:隱藏真實(shí) IP 或訪問(wèn)受限制資源。
示例:通過(guò)代理發(fā)送請(qǐng)求
import urllib3 # 導(dǎo)入urllib3模塊
url = "http://httpbin.org/ip" # 代理IP請(qǐng)求測(cè)試地址
# 定義火狐瀏覽器請(qǐng)求頭信息
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0'}
# 創(chuàng)建代理管理對(duì)象
proxy = urllib3.ProxyManager('http://120.27.110.143:80',headers = headers)
r = proxy.request('get',url,timeout=2.0) # 發(fā)送請(qǐng)求
print(r.data.decode()) # 打印返回結(jié)果
輸出:
{"origin": "120.27.110.143"
}
🔎6.上傳文件
- 兩種方式:
- 文本文件:通過(guò)
fields
參數(shù)以元組形式傳遞。 - 二進(jìn)制文件:通過(guò)
body
參數(shù)直接傳遞數(shù)據(jù),并指定Content-Type
。
- 文本文件:通過(guò)
示例:上傳文本文件
import urllib3 # 導(dǎo)入urllib3模塊
import json # 導(dǎo)入json模塊
with open('test.txt') as f: # 打開(kāi)文本文件data = f.read() # 讀取文件
http = urllib3.PoolManager() # 創(chuàng)建連接池管理對(duì)象
# 發(fā)送網(wǎng)絡(luò)請(qǐng)求
r = http.request( 'POST','http://httpbin.org/post',fields={'filefield': ('example.txt', data),})
files = json.loads(r.data.decode('utf-8'))['files'] # 獲取上傳文件內(nèi)容
print(files) # 打印上傳文本信息
輸出:
{"filefield": "在學(xué)習(xí)中尋找快樂(lè)!"
}
示例:上傳圖片文件
import urllib3 # 導(dǎo)入urllib3模塊
with open('python.jpg','rb') as f: # 打開(kāi)圖片文件data = f.read() # 讀取文件
http = urllib3.PoolManager() # 創(chuàng)建連接池管理對(duì)象
# 發(fā)送請(qǐng)求
r = http.request('POST','http://httpbin.org/post',body = data,headers={'Content-Type':'image/jpeg'})
print(r.data.decode()) # 打印返回結(jié)果