HTTPX
是一個 高效並行請求Python 庫,用於發送異步 HTTP 請求。它是基於 httpcore 和 asyncio 構建的,這意味著它可以利用 Python 的異步功能來執行網路操作,從而提高應用程式的效能和效率,特別是在處理大量並行請求時。
「安裝」
pip install httpx
「使用」
「1. 發送 GET 請求」 :
import httpx
asyncdef fetch_data():
asyncwith httpx.AsyncClient() as client:
response = await client.get('https://api.example.com/data')
print(response.status_code) # 打印狀態碼
print(response.json()) # 打印 JSON 響應體
# 執行異步函式
import asyncio
asyncio.run(fetch_data())
「2. 發送 POST 請求」 :
asyncdef post_data():
asyncwith httpx.AsyncClient() as client:
response = await client.post('https://api.example.com/submit', json={'key': 'value'})
print(response.status_code)
print(response.text) # 打印響應體
asyncio.run(post_data())
「3. 發送帶有請求頭的請求」 :
asyncdef request_with_headers():
headers = {
'User-Agent': 'MyApp/1.0',
'Accept': 'application/json',
}
asyncwith httpx.AsyncClient(headers=headers) as client:
response = await client.get('https://api.example.com/data')
print(response.json())
asyncio.run(request_with_headers())
「4. 使用請求參數」 :
asyncdef request_with_params():
params = {
'query': 'search term',
'page': 2,
}
asyncwith httpx.AsyncClient() as client:
response = await client.get('https://api.example.com/search', params=params)
print(response.json())
asyncio.run(request_with_params())
「5. 使用超時」 :
asyncdef request_with_timeout():
timeout = 5# 5 seconds
asyncwith httpx.AsyncClient(timeout=timeout) as client:
response = await client.get('https://api.example.com/data')
print(response.status_code)
asyncio.run(request_with_timeout())
「6. 使用代理」 :
asyncdef request_with_proxy():
proxies = {
'http': 'http://10.10.1.10:3128',
'https': 'https://10.10.1.11:1080',
}
asyncwith httpx.AsyncClient(proxies=proxies) as client:
response = await client.get('https://api.example.com/data')
print(response.status_code)
asyncio.run(request_with_proxy())
「7. 使用 Cookies」 :
asyncdef request_with_cookies():
cookies = {'session_token': '123456789'}
asyncwith httpx.AsyncClient(cookies=cookies) as client:
response = await client.get('https://api.example.com/data')
print(response.status_code)
asyncio.run(request_with_cookies())
「例項:獲取百度搜尋結果」
import httpx
import asyncio
from bs4 import BeautifulSoup
asyncdef fetch_baidu_search_results(keyword):
asyncwith httpx.AsyncClient(headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"}) as client:
response = await client.get("https://www.baidu.com/s?wd={keyword}")
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'html.parser')
h3_tags = soup.find_all('h3')
search_results = []
for h3 in h3_tags:
a_tag = h3.find('a')
if a_tag:
title = a_tag.get_text(strip=True)
link = a_tag['href']
search_results.append({'title': title, 'link': link})
return search_results
keyword = "HTTPX"#關鍵詞
results = asyncio.run(fetch_baidu_search_results(keyword))
for result in results:
print(result)
「HttpX 「vs」 Requests」
特性/庫 | HTTPX | Requests |
---|---|---|
異步支持 | 支持 | 不支持 |
同步支持 | 不支持同步請求 | 支持 |
HTTP/2 | 支持 |
透過第三方庫支持(如
requests-toolbelt
)
|
連線池 | 內建支持 |
不內建,但可以透過
requests.Session
實作
|
流式上傳 | 支持 | 支持 |
流式下載 | 支持 | 支持 |
超時控制 | 支持連線超時和讀取超時 | 支持 |
重試機制 | 內建支持 |
需要使用第三方庫(如
urllib3
的重試功能)
|
代理支持 | 內建支持 | 內建支持 |
Cookie 管理 | 內建支持 | 內建支持 |
JSON 支持 | 內建支持 | 內建支持 |
表單數據 | 內建支持 | 內建支持 |
SSL/TLS 支持 | 內建支持 | 內建支持 |
測試伺服器 |
提供一個簡單的測試伺服器
httpx.TestClient
| 不提供 |
錯誤處理 | 使用異常來處理錯誤 | 使用異常來處理錯誤 |
社群和流行度 | 相對較新,但迅速增長 | 非常流行,廣泛使用 |
維護狀態 | 活躍 | 活躍 |