目錄
- 簡介
- 一、安裝與導入
- 安裝
- 導入
- 二、發送 HTTP 請求
- 1. GET 請求
- 基本請求
- URL 參數
- 2. POST 請求
- 表單數據提交
- JSON 數據提交
- 文件上傳
- 3. 其他方法
- PUT 請求示例
- DELETE 請求示例
- 三、處理響應
- 1. 響應內容解析
- 文本內容處理
- 二進制內容處理
- JSON 數據處理
- 2. 響應狀態與頭信息
- 狀態碼檢查
- 異常處理
- 響應頭解析
- 四、高級功能
- 1. 會話(Session)管理
- 2. 代理設置
- 3. 超時控制
- 4. SSL 驗證
- 禁用驗證(測試環境使用)
- 自定義證書
- 五、異常處理
- 完整異常處理示例
- 六、其他實用功能
- 1. Cookie 操作
- 2. 重定向控制
- 3. 流式下載大文件
- 4. 身份認證
- 七、最佳實踐
- 推薦做法
- 特點說明
簡介
requests
是 Python 中最流行的 HTTP 客戶端庫,以簡潔的 API 設計和強大的功能著稱。以下是其核心知識點的詳細說明及代碼示例。
一、安裝與導入
安裝
# 使用 pip 安裝 requests 庫
pip install requests
導入
# 導入 requests 模塊
import requests
二、發送 HTTP 請求
1. GET 請求
基本請求
# 發送一個簡單的 GET 請求
response = requests.get("https://api.example.com/data")
print("響應狀態碼:", response.status_code)
URL 參數
# 通過 params 參數傳遞 URL 查詢參數
params = {"page": 1, # 當前頁碼"limit": 10, # 每頁數據量"sort": "desc" # 排序方式
}
response = requests.get("https://api.example.com/items", params=params)
print("實際請求的 URL:", response.url) # 輸出構造后的完整 URL
2. POST 請求
表單數據提交
# 模擬表單提交(Content-Type: application/x-www-form-urlencoded)
form_data = {"username": "admin","password": "secret"
}
response = requests.post("https://api.example.com/login", data=form_data)
print("登錄響應:", response.text)
JSON 數據提交
# 發送 JSON 格式數據(Content-Type: application/json)
user_info = {"name": "Alice","age": 25,"email": "alice@example.com"
}
response = requests.post("https://api.example.com/users", json=user_info)
print("創建用戶結果:", response.json())
文件上傳
# 上傳本地文件(Content-Type: multipart/form-data)
with open("report.pdf", "rb") as file: # 以二進制模式打開文件files = {"document": ("report.pdf", file, "application/pdf")}response = requests.post("https://api.example.com/upload", files=files)
print("文件上傳結果:", response.json())
3. 其他方法
PUT 請求示例
# 更新資源(例如修改用戶信息)
update_data = {"email": "new_email@example.com"}
response = requests.put("https://api.example.com/users/123", json=update_data)
print("更新結果狀態碼:", response.status_code)
DELETE 請求示例
# 刪除資源(例如刪除文章)
response = requests.delete("https://api.example.com/articles/456")
print("刪除操作狀態碼:", response.status_code)
三、處理響應
1. 響應內容解析
文本內容處理
# 獲取響應文本(自動解碼)
response = requests.get("https://api.example.com/text")
print("文本內容:", response.text[:100]) # 截取前 100 個字符
二進制內容處理
# 下載圖片并保存到本地
response = requests.get("https://example.com/image.jpg")
with open("image.jpg", "wb") as f: # 以二進制寫入模式保存f.write(response.content)
print("圖片下載完成")
JSON 數據處理
# 解析 JSON 響應(自動轉換為字典)
response = requests.get("https://api.example.com/products/789")
product = response.json()
print(f"產品名稱: {product['name']}, 價格: {product['price']}元")
2. 響應狀態與頭信息
狀態碼檢查
response = requests.get("https://api.example.com/health")
if response.status_code == 200:print("服務正常")
elif response.status_code == 404:print("資源不存在")
else:print("未知狀態:", response.status_code)
異常處理
# 自動拋出 HTTP 錯誤
try:response = requests.get("https://api.example.com/error")response.raise_for_status() # 如果狀態碼是 4xx/5xx 會拋出異常
except requests.HTTPError as err:print(f"HTTP 錯誤: {err}")
響應頭解析
response = requests.head("https://example.com") # HEAD 請求只獲取頭信息
print("服務器類型:", response.headers.get("Server", "未知"))
print("內容類型:", response.headers.get("Content-Type", "未指定"))
四、高級功能
1. 會話(Session)管理
# 使用 Session 保持登錄狀態和連接池
with requests.Session() as session:# 第一次請求:登錄login_data = {"user": "admin", "pass": "123456"}session.post("https://api.example.com/login", data=login_data)# 后續請求:自動攜帶 Cookieprofile = session.get("https://api.example.com/profile").json()orders = session.get("https://api.example.com/orders").json()print("用戶信息:", profile)
2. 代理設置
# 通過代理服務器發送請求
proxies = {"http": "http://10.10.1.10:3128", # HTTP 代理"https": "http://10.10.1.10:1080" # HTTPS 代理
}
try:response = requests.get("http://external-site.com", proxies=proxies, timeout=5)print("通過代理訪問成功")
except requests.ConnectTimeout:print("代理連接超時")
3. 超時控制
# 設置連接超時和讀取超時(元組格式)
try:response = requests.get("https://slow-api.example.com", timeout=(3.05, 10))# 連接超時 3.05 秒,讀取超時 10 秒
except requests.Timeout:print("請求超時,請重試")
4. SSL 驗證
禁用驗證(測試環境使用)
# 注意:verify=False 會忽略 SSL 證書驗證(不安全!)
response = requests.get("https://self-signed-cert-site.com", verify=False)
print("跳過 SSL 驗證結果:", response.status_code)
自定義證書
# 使用自定義 CA 證書驗證
response = requests.get("https://internal-api.example.com", verify="/path/to/corporate-ca-bundle.crt")
print("自定義證書驗證成功")
五、異常處理
完整異常處理示例
from requests.exceptions import RequestExceptionurl = "https://unstable-api.example.com/data"try:# 設置超時和重試response = requests.get(url, timeout=5)response.raise_for_status() # 檢查 4xx/5xx 錯誤# 處理成功響應data = response.json()print("獲取數據成功:", data["key"])except requests.Timeout:print("錯誤: 請求超時(5 秒)")
except requests.HTTPError as e:print(f"HTTP 錯誤: {e.response.status_code} - {e.response.reason}")
except requests.JSONDecodeError:print("錯誤: 響應不是有效的 JSON")
except RequestException as e:print(f"請求失敗: {str(e)}")
六、其他實用功能
1. Cookie 操作
# 手動設置 Cookie
cookies = {"session_id": "abc123xyz"}
response = requests.get("https://api.example.com/cart", cookies=cookies)
print("購物車內容:", response.json())# 獲取服務器設置的 Cookie
print("服務器返回的 Cookies:")
for cookie in response.cookies:print(f"{cookie.name}: {cookie.value}")
2. 重定向控制
# 禁用自動重定向
response = requests.get("https://example.com/old-url", allow_redirects=False)
if response.status_code == 301:new_location = response.headers["Location"]print(f"需要手動跳轉到: {new_location}")
3. 流式下載大文件
# 分塊下載大文件(避免內存溢出)
url = "https://example.com/large-video.mp4"
with requests.get(url, stream=True) as r:r.raise_for_status()with open("video.mp4", "wb") as f:for chunk in r.iter_content(chunk_size=8192): # 8KB 塊f.write(chunk)
print("大文件下載完成")
4. 身份認證
# 使用 Basic 認證
from requests.auth import HTTPBasicAuthresponse = requests.get("https://api.example.com/secured",auth=HTTPBasicAuth("user", "pass"))
print("認證結果:", response.status_code)
七、最佳實踐
推薦做法
-
會話復用:
# 使用 with 語句自動管理 Session with requests.Session() as s:s.headers.update({"User-Agent": "MyApp/1.0"}) # 統一設置請求頭s.get("https://api.example.com/ping") # 測試連接
-
超時必填:
# 所有請求都應該設置超時 requests.get("https://example.com", timeout=(3, 10)) # 連接 3 秒,讀取 10 秒
-
資源釋放:
# 使用 with 語句確保響應資源釋放 with requests.get("https://example.com", stream=True) as response:# 處理響應內容pass
-
錯誤重試:
# 實現簡單重試邏輯 retries = 3 for _ in range(retries):try:response = requests.get(url, timeout=5)response.raise_for_status()breakexcept (RequestException, Timeout):continue
官方文檔:https://docs.python-requests.org/
特點說明
- 代碼注釋:每個示例都添加了詳細的注釋,說明代碼用途和關鍵參數
- 場景覆蓋:包含常見場景(登錄、文件傳輸、錯誤處理)和特殊需求(代理、SSL 驗證)
- 安全提示:在禁用 SSL 驗證等危險操作時添加警告說明
- 最佳實踐:強調超時設置、會話管理和資源釋放的重要性
可直接保存為 .md
文件或導入到文檔工具中使用。