當前位置: 妍妍網 > 碼農

HTTPX:Python 中的異步HTTP客戶端

2024-06-27碼農

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 不提供
錯誤處理 使用異常來處理錯誤 使用異常來處理錯誤
社群和流行度 相對較新,但迅速增長 非常流行,廣泛使用
維護狀態 活躍 活躍