日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python-urllib3

發(fā)布時間:2024/3/13 python 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python-urllib3 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

urllib3

urllib3 的文檔
urllib3 是 python 的 HTTP 客戶端,它提供了很多 python 標準庫中沒有的關(guān)鍵特性:線程安全、連接池、客戶端 SSL/TLS 驗證、用分段編碼上傳文件、重試請求和處理HTTP重定向的助手、支持gzip和deflate編碼、HTTP和SOCKS的代理支持、100%的測試覆蓋率。

1.用戶指南

1.1 發(fā)出請求

import urllib3 # 先實例化PoolManager的對象,該對象能自動處理線程安全和連接池的細節(jié) http = urllib3.PoolManager() # 用 request() 發(fā)請求 r = http.request('GET', 'http://httpbin.org/robots.txt')

‘GET’ 可替換成其它的 HTTP 請求。

1.2 響應(yīng)內(nèi)容

request() 方法返回 HTTPResponse 對象,該對象有 status、data、headers 等屬性。
status:響應(yīng)的狀態(tài)碼;
headers:HTTP的請求頭,是 HTTPHeaderDict 對象;
data:響應(yīng)的內(nèi)容,bytes 對象。data 是 JSON 內(nèi)容時能通過解碼和反序列化來加載。

1.3 請求數(shù)據(jù)

請求頭

能以字典的形式在 request() 的 headers 參數(shù)中指定請求頭。

查詢的參數(shù)

對于 GET、HEAD、DELETE 請求,能把參數(shù)以字典的格式放到 fields 參數(shù)里傳給 request()。

r = http.request('GET', 'http://httpbin.org/get', fields={'key1': 'value1', 'key2': 'value2'})

而 POST 和 PUT 請求需要把參數(shù)手動編碼到 url 上。

from urllib.parse import urlencode encoded_arg = urlencode({'key1': 'value1', 'key2': 'value2'}) url = url + '?' + encoded_arg r = http.request('POST', url)

urlencode 函數(shù)也能接收雙元素元組的序列:

encoded_arg = urlencode([('key1', 'value1'), ('key2', 'value2')])

表單數(shù)據(jù)

POST 和 PUT 請求中,放在 fields 中的參數(shù)會被 urllib3 自動編碼為表單格式。

JSON

發(fā)送 JSON 請求要通過 body 參數(shù)指定 JSON 數(shù)據(jù),并設(shè)置請求頭中的 Content-Type 項。

import json data = {'key': 'value'} encoded_data = json.dumps(data).encode('utf-8') r = http.request('POST', url, body=encoded_data, headers={'Content-Type': 'application/json'})

文件和二進制數(shù)據(jù)

上傳文件把 fields 中的文件字段設(shè)置為形如 (文件名,數(shù)據(jù)) 的元組。

with open('test.txt') as f:file_data = f.read() r = http.request('POST', url,fields = {'filefield': ('test.txt', file_data),})

指定文件名不是必須的,能用來匹配瀏覽器的行為。也能在元組中傳遞第三項來顯示指定文件的 MIME1 類型:(文件名,數(shù)據(jù),MIME類型)。
用 body 參數(shù)能直接傳輸二進制數(shù)據(jù),Content-Type 最好同時改一下。

1.4 證書驗證

1.25 版本后的 urllib3 會在默認情況下驗證 HTTPS 連接 (cert_reqs = ‘CERT_REQUIRED’)。
除非另外指定,否則 urllib3 會自動加載默認的系統(tǒng)證書庫。最可靠的跨平臺方式是使用能提供 Mozilla 根證書捆綁的 certifi 模塊。
使用 pip 直接安裝或者用 urllib3 的額外命令 secure 安裝。
獲得證書后,您可以創(chuàng)建一個在發(fā)出請求時驗證證書的 PoolManager。

import certifi http = urllib3.PoolManager(cert_reqs='CERT_REQUIRED',ca_certs=certifi.where())

PoolManager 會自動處理證書驗證,驗證失敗時會拋出 SSLError。

1.5 使用超時參數(shù)

使用超時參數(shù)能控制請求中止前允許運行的最大時長。

r = http.request('GET', url, timeout=2.5)

使用一個 Timeout 實例能進行更細的控制:連接和讀取分別設(shè)置時長。

r = http.request('GET', url, timeout=urllib3.Timeout(connect=1.0, read=2.0))

可以在創(chuàng)建池的時候指定超時,使所有的請求都是相同的超時。該設(shè)置 會被 request() 中的超時設(shè)置所覆蓋。

http = urllib3.PoolManager(timeout=3.0)

1.6 重試請求

默認情況下,urllib3將重試請求3次,并最多進行3次重定向。能通過 retries 參數(shù)來控制重試請求。

r = http.request('GET', url, retries=10)

retries 設(shè)置為 False 時,禁用所有重試和重定向請求。要禁用重定向但保留重試邏輯,設(shè)置 redirect 為 False。使用 Retry 實例能進行更精細的控制。
在創(chuàng)建池的時候指定重試,會為所有請求都配置該策略。

2. 高級用法

2.1 自定義池行為

PoolManager 類會根據(jù)需要自動為每個主機創(chuàng)建 ConnectionPool 實例。默認情況下最多創(chuàng)建 10 個實例。如果想請求很多不同的主機,增加該數(shù)值有助于提高性能。

http = urllib3.PoolManager(num_pools=50)

這么做同時也會增加內(nèi)存和套接字的花銷。
與上述情況類似。ConnectionPool 類還保留了一個獨立的 HTTPConnection 實例池。其中的連接在一個獨立請求期間使用,請求完成后又會返回池內(nèi)。這種可復(fù)用的連接默認只有一個。如果想同時對相同的主機做很多請求的話,增加該數(shù)值有助于提高性能(下面兩句代碼等效2,選用一句即可)。

# 二者選其一 http = urllib3.PoolManager(maxszie=10) http = urllib3.HTTPConnectionPool('baidu.com', maxsize=10)

ConnectionPool 類的池行為和 PoolManager 類不同。默認情況下,創(chuàng)建新請求時如果池內(nèi)沒有空閑的連接,就會新建一個連接。但是該連接在池內(nèi)連接數(shù)已大于最大值的時候不會保留下來。也就是說,maxsize 參數(shù)不是可以向某個主機打開的最大連接數(shù),而是池內(nèi)可保留的最大連接數(shù)。指定參數(shù) block=True 時,允許打開的最大連接數(shù)就是 maxsize 設(shè)定的數(shù)值。

# 二者選其一 http = urllib3.PoolManager(maxsize=10, block=True) http = urllib3.HTTPConnectionPool(maxsize=10, block=True)

新請求會被阻塞,直到池中有連接可用為止。在多線程的應(yīng)用中,這樣做能避免太多連接使主機內(nèi)存溢出。

2.2 流和IO

處理大的響應(yīng)時,最好使用流式傳輸。

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 設(shè)為 False 時,urllib3 會流失傳輸響應(yīng)內(nèi)容。stream 函數(shù)使你能遍歷響應(yīng)內(nèi)容的大塊。必須用 release_conn() 函數(shù)把 http 連接釋放回連接池,該連接才能復(fù)用。
流式傳輸獲得的 HTPResponse 對象能看做是一個文件對象,允許進行緩沖。能使用 read()函數(shù),還能用 codecs 模塊對內(nèi)容進行解碼。

2.3 代理

使用 ProxyManager3 能通過 HTTP 代理發(fā)送請求。

proxy = urllib3.ProxyManager('http://host:port/') proxy.request('GET', url)

通過 SOCKSProxyManager 能連接到 SOCKS4 和 SOCKS5 的代理。使用 SOCKS 代理需要安裝 PySocks 或者安裝 urllib3 時帶上額外的 socks 模塊。

2.4 自定義SSL證書

不用使用 certifi 就能提供自己的證書捆綁包。當(dāng)你已經(jīng)生成自己的證書或者使用私有證書機構(gòu)時,這非常有用。只要在創(chuàng)建 PoolManager 時提供到證書捆綁包的完整路徑就行。

http = urllib3.PoolManager(cert_request='CERT_REQUIRED', ca_certs='path/bundle')

使用自己的證書捆綁包時,只有能用該證書驗證的請求才能成功。對于不需要自定義證書驗證的 URL,最好有一個單獨的 PoolManager 用來發(fā)出請求。

2.5 客戶端證書

指定客戶端證書可用于服務(wù)端和客戶端驗證彼此的身份。通常這些證書是從同一個證書機構(gòu)頒發(fā)的。

http = urllib3.PoolManager(cert_file='/path/client_cert.pem',cert_reqs='CERT_REQUIRED',ca_certs='/path/certificate_bundle')

如果您具有加密的客戶端證書私鑰,則可以使用key_password參數(shù)指定用于解密密鑰的密碼。

http = urllib3.PoolManager(cert_file='/path/client_cert.pem',cert_reqs='CERT_REQUIRED',key_file='/path/client.key',key_password='password')

2.6 證書驗證和Mac OS 系統(tǒng)

蘋果提供的 Python 和 OpenSSL 庫包含一個修補程序,讓它們能自動檢查系統(tǒng)鑰匙串的證書。如果您指定自定義證書并且看到請求意外成功,這可能會令人驚訝。例如,如果您要指定自己的證書進行驗證,并且服務(wù)器提供了不同的證書,則您以為連接會失敗。但是,如果該服務(wù)器出示系統(tǒng)鑰匙串中的證書,則連接將成功。

2.7 SSL警告

urllib3 會基于證書驗證支持的級別發(fā)出幾個不同的警告。這些警告表明特殊情況的出現(xiàn),能用不同的方式解決。
InsecureRequestWarning:對 HTTPS URL 發(fā)出請求時沒有用證書驗證。
InsecurePlatformWarning:在有過期 ssl 模塊的Python 2平臺上會發(fā)生。這些舊的 ssl 模塊可能導(dǎo)致一些不安全的請求在該失敗的地方成功,而安全的請求在該成功的地方失敗。
SNIMissingWarning:2.7.9之前的Python 2版本上會出現(xiàn)。這些版本缺少 SNI 支持,可能會導(dǎo)致服務(wù)器出示客戶端認為無效的證書。
不建議進行未經(jīng)驗證的 HTTPS 請求。如果了解風(fēng)險并想忽視這些警告要使用 disable_warnings()。

urllib3.disable_warnings()

此外,還能用標準庫的 logging 模塊捕獲這些警告;可以通過設(shè)置PYTHONWARNINGS 環(huán)境變量或使用 -W 標志在解釋器級別抑制警告 。


  • 多用途互聯(lián)網(wǎng)郵件擴展類型。使 HTTP 傳輸?shù)臄?shù)據(jù)更加豐富。斜杠前是數(shù)據(jù)的大類型如文本、聲音、圖像等,斜杠后面是具體的文件類型。Headers 中的 Content-Type 指定的就是 MIME 類型。 ??

  • PoolManager 是 urllib3.request.RequestMethods 的子類;HTTPConnectionPool 同時是 ConnectionPool 和 urllib3.request.RequestMethods 的子類。所以,它們的對象都能發(fā)出請求。 ??

  • ProxyManager 是 PoolManager 的子類。 ??

  • 總結(jié)

    以上是生活随笔為你收集整理的python-urllib3的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。