Python--urllib3庫詳解
Python--urllib3庫詳解
Urllib3是一個功能強大,條理清晰,用於HTTP客戶端的Python庫,許多Python的原生系統已經開始使用urllib3。Urllib3提供了很多python標準庫裡所沒有的重要特性:
1、 執行緒安全
2、 連線池
3、 客戶端SSL/TLS驗證
4、 檔案分部編碼上傳
5、 協助處理重複請求和HTTP重定位
6、 支援壓縮編碼
7、 支援HTTP和SOCKS代理
8、 100%測試覆蓋率
Urllib3功能非常強大,但是用起來卻十分簡單:
安裝:
Urllib3 能通過pip來安裝:
$pip install urllib3
你也可以在github上下載最新的原始碼,解壓之後進行安裝:
$git clone git://github.com/shazow/urllib3.git
$python setup.py install
urllib3的使用:
生成請求(request):
首先,你必須匯入urllib3模組:
然後你需要一個PoolManager例項來生成請求,由該例項物件處理與執行緒池的連線以及執行緒安全的所有細節,不需要任何人為操作:
通過request()方法建立一個請求:
request()方法返回一個
你還可以通過request()方法向請求(request)中新增一些其他資訊,如:
請求(request)中的資料項(request data)可包括:
Headers:
在request()方法中,可以定義一個字典型別(dictionary),並作為headers引數傳入:
Query parameters:
對於GET、HEAD和DELETE請求,可以簡單的通過定義一個字典型別作為fields引數傳入即可:
對於POST和PUT請求(request),需要手動對傳入資料進行編碼,然後加在URL之後:
Form data:
對於PUT和POST請求(request),urllib3會自動將字典型別的field引數編碼成表格型別.
JSON:
在發起請求時,可以通過定義body 引數並定義headers的Content-Type引數來發送一個已經過編譯的JSON資料:
Files & binary data:
使用multipart/form-data編碼方式上傳檔案,可以使用和傳入Form data資料一樣的方法進行,並將檔案定義為一個元組的形式 (file_name,file_data):
檔名(filename)的定義不是嚴格要求的,但是推薦使用,以使得表現得更像瀏覽器。同時,還可以向元組中再增加一個數據來定義檔案的 MIME型別:
如果是傳送原始二進位制資料,只要將其定義為body引數即可。同時,建議對header的Content-Type引數進行設定:
Timeout :
使用timeout,可以控制請求的執行時間。在一些簡單的應用中,可以將timeout引數設定為一個浮點數:
要進行更精細的控制,可以使用Timeout例項,將連線的timeout和讀的timeout分開設定:
如果想讓所有的request都遵循一個timeout,可以將timeout引數定義在PoolManager中:
或者
當在具體的request中再次定義timeout時,會覆蓋PoolManager層面上的timeout。
請求重試(retrying requests):
Urllib3 可以自動重試冪等請求,原理和handles redirect一樣。可以通過設定retries引數對重試進行控制。Urllib3預設進行3次請求重 試,並進行3次方向改變。
給retries引數定義一個整型來改變請求重試的次數:
關閉請求重試(retrying request)及重定向(redirect)只要將retries定義為False即可:
關閉重定向(redirect)但保持重試(retrying request),將redirect引數定義為False即可:
要進行更精細的控制,可以使用retry例項,通過該例項可以對請求的重試進行更精細的控制。
例如,進行3次請求重試,但是隻進行2次重定向:
如果想讓所有請求都遵循一個retry策略,可以在PoolManager中定義retry引數:
或者
當在具體的request中再次定義retry時,會覆蓋 PoolManager層面上的retry。