Python中的urllib3是一個功能強大、高度模塊化的HTTP請求庫。它為開發者提供了使用HTTP進行高級交互的各種工具和能力,包括連接復用、線程安全、HTTPS支持、連接超時等。在本文中,我們將深入了解並探討urllib3庫。
一、快速上手
首先,我們通過快速的示例介紹urllib3的主要用法和功能。以下代碼演示如何使用urllib3發送HTTP GET請求:
import urllib3 http = urllib3.PoolManager() r = http.request('GET', 'http://httpbin.org/get') print(r.status) # 打印狀態碼 print(r.data) # 打印響應內容
在上面的代碼中,首先導入urllib3模塊。然後使用urllib3.PoolManager()創建一個HTTP連接池,該池管理與服務器的所有連接。然後通過http.request()方法發送HTTP GET請求。這個方法接受兩個參數:HTTP方法(GET、POST等)和請求URL。執行該方法將返回一個Response對象,它包含響應狀態、響應頭和響應正文等信息。最後,我們打印出響應狀態碼和響應內容。
二、連接池
連接復用是urllib3的一大特色,它可以在一個HTTP/1.1連接上發送多個請求,從而節省了時間和資源。連接池可以讓多個請求同時共享一個連接,從而提高了性能。以下是連接池的使用示例代碼:
import urllib3 http = urllib3.PoolManager() r1 = http.request('GET', 'http://httpbin.org/get') print(r1.status) # 打印狀態碼 r2 = http.request('GET', 'http://httpbin.org/get') print(r2.status) # 再次打印狀態碼
在上面的代碼中,我們創建一個連接池並發送兩個GET請求。由於這兩個請求都是使用同一個連接池進行發送的,因此第二個請求將重用第一個請求使用的連接,從而提高了效率。
三、超時控制
在網絡應用中,超時是一個非常重要的問題。過長的超時可能導致客戶端的請求一直無法得到響應,而過短的超時則可能導致客戶端無法完整地接收到響應。urllib3支持通過timeout參數控制請求超時時間。以下是超時控制的使用示例代碼:
import urllib3 http = urllib3.PoolManager(timeout=urllib3.Timeout(connect=2.0, read=4.0)) r = http.request('GET', 'http://httpbin.org/delay/5') print(r.status) # 打印狀態碼 print(r.data) # 打印響應內容
在上面的代碼中,我們通過在創建連接池時指定timeout參數來控制請求超時時間。timeout參數是一個Timeout對象,該對象有2個屬性:connect和read。connect屬性設置連接的超時時間,read屬性設置讀取響應內容的超時時間。如果超時,程序會拋出timeout錯誤。
四、HTTPS支持
HTTP是一個不安全的協議,因為所有的數據都是明文傳輸的。HTTPS通過使用SSL/TLS協議來對數據進行加密和認證,從而提供了安全的數據傳輸方式。以下代碼演示如何使用urllib3發送HTTPS請求:
import urllib3 http = urllib3.PoolManager() r = http.request('GET', 'https://www.baidu.com') print(r.status) # 打印狀態碼 print(r.data) # 打印響應內容
在上面的代碼中,我們發送一個HTTPS請求並打印出響應狀態碼和響應內容。urllib3會自動處理SSL握手和證書驗證過程,從而簡化了HTTPS請求的過程。
五、塊式上傳和下載
有時候我們需要傳輸大文件或者一些數據流,這時候如果使用一次性上傳或者下載會導致帶寬佔用過多,進而造成性能瓶頸。在這種情況下,我們可以採用塊式上傳和下載的方式。以下是塊式上傳和下載的使用示例代碼:
import urllib3 http = urllib3.PoolManager() # 塊式下載 r = http.request('GET', 'http://download.thinkbroadband.com/50MB.zip', preload_content=False) with open('50MB.zip', 'wb') as out: while True: data = r.read(1024) if not data: break out.write(data) r.release_conn() print('Download finished.') # 塊式上傳 with open('50MB.zip', 'rb') as f: r = http.request('POST', 'http://httpbin.org/post', body=f, headers={'Content-Type': 'application/octet-stream'}) print(r.status) print(r.data)
在上面的代碼中,我們使用urllib3發送塊式請求。在塊式下載中,我們首先發送一個GET請求獲取待下載文件的元數據,其中preload_content=False表示下載數據塊不會在返回Response時自動加載。然後使用r.read(1024)從響應流中讀取1024個位元組的數據流,並寫入本地文件。直到響應流中沒有數據可讀,下載過程才結束。在塊式上傳中,我們使用urllib3發送一個POST請求,並在body參數中指定要上傳的文件,headers參數指定要上傳文件的類型。
六、總結
在本文中,我們深入介紹了Python中的urllib3庫的主要功能和用法。我們探討了連接池、超時控制、HTTPS支持和塊式上傳和下載等方面的內容。代碼示例為大家介紹了各種用法,希望能夠通過本文幫助大家更好地使用和了解urllib3庫。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/239099.html