urllib3 概述
- 線程安全
- 連接池管理
- 客戶端 SSL/TLS 驗證
- 支持 HTTP 和 SOCKS 代理
官方文檔:urllib3 2.0.4 documentation
urllib3 安裝
- 通過 pip 安裝
pip install urllib3
urllib3 發送 HTTP 請求
- 導入
urllib3
模塊 - 創建
PoolManager
實例 - 調用
request()
方法
import urllib3
def test_HTTP():
# 創建連接池對象,默認會校驗證書
pm = urllib3.PoolManager()
# 發送HTTP請求
res = pm.request(method='GET', url="http://httpbin.org/robots.txt")
print(type(res))
urllib3 HTTPResponse 對象
- status 屬性
- headers 屬性
- data 屬性
import urllib3
def test_response():
# 創建連接池對象
pm = urllib3.PoolManager()
# 發送請求
resp = pm.request(method='GET', url="http://httpbin.org/ip")
print(resp.status) # 查看響應狀態狀態碼
print(resp.headers) # 查看響應頭信息
print(resp.data) # 查看響應原始二進制信息
urllib3 解析響應內容
- 二進制響應內容解碼
- JSON 字符串
import urllib3
import json
def test_response():
pm = urllib3.PoolManager()
resp = pm.request(method='GET', url="http://httpbin.org/ip")
# 獲取二進制形式的響應內容
raw = resp.data
print(type(raw), raw)
# 使用utf-8解碼成字符串
content = raw.decode('utf-8')
print(type(content), content)
# 將JSON字符串解析成字典對象
dict_obj = json.loads(content)
print(type(dict_obj), dict_obj)
print(dict_obj['origin'])
urllib3 request 請求參數
-
語法:
request(method, url, fields, headers, **)
-
必填
method
:請求方式url
:請求地址
-
選填
headers
:請求頭信息fields
:請求體數據body
:指定請求體類型tiemout
:設置超時時間
urllib3 定製請求數據
- 定製請求頭信息
- 使用
headers
參數
import urllib3
import json
def test_headers():
pm = urllib3.PoolManager()
url = "http://httpbin.org/get"
# 定製請求頭
headers = {'School': 'hogwarts'}
resp = pm.request('GET', url, headers=headers)
urllib3 定製請求數據
-
定製查詢字符串參數
fields
參數:適用於GET, HEAD, DELETE
請求- 拼接
url
:適用於POST, PUT
請求
urllib3 定製請求數據
import urllib3
import json
# GET/HEAD/DELETE 請求
def test_fields():
pm = urllib3.PoolManager()
url = "http://httpbin.org/get"
fields = {'school': 'hogwarts'}
resp = pm.request(method='GET', url=url, fields=fields)
# POST/PUT 請求
def test_urlencode():
# 從內置庫urllib的parse模塊導入編碼方法
from urllib.parse import urlencode
pm = urllib3.PoolManager()
url = "http://httpbin.org/post"
# POST和PUT請求需要編碼後拼接到URL中
encoded_str = urlencode({'school': 'hogwarts'})
resp = pm.request('POST', url=url+"?"+encoded_str)
urllib3 定製請求數據
- 提交 form 表單數據
- 類型
'Content-Type': 'multipart/form-data
- 請求方式:POST、PUT
import urllib3
import json
# POST/PUT 請求
def test_form():
pm = urllib3.PoolManager()
url = "http://httpbin.org/post"
fields = {'school': 'hogwarts'}
# fields數據會自動轉成form格式提交
resp = pm.request('POST', url, fields=fields)
urllib3 定製請求數據
- 提交 JSON 格式數據
- 類型:
'Content-Type': 'application/json'
- 請求方式:POST、PUT
import urllib3
import json
def test_json():
pm = urllib3.PoolManager()
url = "http://httpbin.org/post"
# 設定請求體數據類型
headers={'Content-Type': 'application/json'}
# JSON文本數據
json_str = json.dumps({'school': 'hogwarts'})
resp = pm.request('POST', url, headers=headers, body=json_str)
urllib3 定製請求數據
timeout
:設置超時時間- 時間單位:秒
- 值的格式:float 類型
import urllib3
def test_timeout():
pm = urllib3.PoolManager()
# 訪問這個地址,服務器會在3秒後響應
url = "http://httpbin.org/delay/3"
# 設置超時時長
resp = pm.request(method='GET', url=url, timeout=4.0)
assert resp.status == 200
urllib3 發送 HTTPS 請求
-
HTTPS 請求默認需要校驗證書
-
PoolManager 的
cert_reqs
參數"CERT_REQUIRED"
:需要校驗"CERT_NONE"
:取消校驗
import urllib3
import json
def test_HTTPS():
# 創建不校驗證書的連接池對象
pm_https = urllib3.PoolManager(cert_reqs="CERT_NONE")
url = "https://httpbin.ceshiren.com/get"
# 發送HTTPS請求
resp = pm_https.request(method='GET', url=url)
print(json.dumps(resp.data.decode('utf-8')))