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()方法返回一個HTTPResponse對象。

   你還可以通過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參數進行

     stream流式響應的處理

>>> import urllib3
>>> http = urllib3.PoolManager()
>>> r = http.request('GET', 'http://httpbin.org/bytes/1024', preload_content=False)
>>> for chunk in r.stream(32):
... print(chunk)
...
>>> r.release_conn()
注意:preload_content=False表示流式處理響應數據。

處理stream()方法讀取響應數據之外,還可以使用read()方法,示例如下:

>>> import urllib3
>>> http = urllib3.PoolManager()
>>> r = http.request('GET', 'http://httpbin.org/bytes/1024', preload_content=False)
>>> r.read(4)
b'\x88\x1f\x8b\xe5'	
>>> r.release_conn()

  

設置:

   

   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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM