在 Python 開發(fā)中,發(fā)送 HTTP 請求是實(shí)現(xiàn)接口調(diào)用、數(shù)據(jù)爬取、服務(wù)交互的核心需求 —— 無論是調(diào)用第三方 API(如天氣接口、支付接口),還是與后端服務(wù)通信,都需要通過 HTTP 協(xié)議傳遞數(shù)據(jù)。Python 內(nèi)置的urllib庫雖能實(shí)現(xiàn)基礎(chǔ)請求,但語法繁瑣;而第三方庫requests以簡潔的 API、完善的功能成為主流選擇。本文將從 HTTP 請求基礎(chǔ)入手,詳解requests庫的安裝、常用方法及實(shí)戰(zhàn)技巧,幫助你高效實(shí)現(xiàn) HTTP 交互。
一、HTTP 請求基礎(chǔ):理解核心概念
在使用requests庫前,需先明確 HTTP 請求的核心要素,確保后續(xù)操作符合協(xié)議規(guī)范:
請求方法:常見類型包括 GET(獲取資源)、POST(提交資源)、PUT(更新資源)、delete(刪除資源),不同方法對應(yīng)不同的業(yè)務(wù)場景;
請求 URL:目標(biāo)資源的地址(如https://api.example.com/weather);
請求頭(Headers):包含客戶端信息(如瀏覽器標(biāo)識、數(shù)據(jù)格式),部分接口需通過請求頭驗(yàn)證身份(如Authorization令牌);
請求參數(shù):GET 請求的參數(shù)通常拼接在 URL 后(如?city=beijing&date=20250828),POST 請求的參數(shù)多放在請求體(Body)中,格式可分為表單(Form Data)、JSON 等;
響應(yīng):服務(wù)器返回的結(jié)果,包含狀態(tài)碼(如 200 表示成功、404 表示資源不存在)、響應(yīng)頭、響應(yīng)體(業(yè)務(wù)數(shù)據(jù),多為 JSON 或 HTML 格式)。
二、requests 庫的安裝與基礎(chǔ)使用
requests是 Python 第三方庫,需先安裝才能使用,其核心優(yōu)勢是 “語法簡潔、功能全面”,支持所有 HTTP 請求方法,且自動(dòng)處理 Cookie、會(huì)話保持等細(xì)節(jié)。
(一)安裝 requests 庫
通過 Python 包管理工具pip安裝,命令如下(適用于 Windows、Linux、Mac):
TypeScript取消自動(dòng)換行復(fù)制
pip install requests
安裝完成后,在 Python 腳本中導(dǎo)入庫即可使用:
TypeScript取消自動(dòng)換行復(fù)制
import requests
(二)基礎(chǔ)請求流程
使用requests發(fā)送 HTTP 請求的通用流程為:
構(gòu)造請求參數(shù)(URL、方法、 headers、參數(shù)等);
調(diào)用requests對應(yīng)的方法發(fā)送請求;
解析響應(yīng)結(jié)果(狀態(tài)碼、響應(yīng)體等)。
示例:發(fā)送最簡單的 GET 請求,獲取百度首頁內(nèi)容
TypeScript取消自動(dòng)換行復(fù)制
import requests
# 1. 發(fā)送GET請求
response = requests.get("https://www.baidu.com")
# 2. 解析響應(yīng)
print("狀態(tài)碼:", response.status_code) # 輸出:200(表示請求成功)
print("響應(yīng)體前100字符:", response.text[:100]) # 輸出HTML內(nèi)容片段
三、requests 庫常用方法及實(shí)戰(zhàn)示例
requests庫為不同 HTTP 請求方法提供了對應(yīng)的函數(shù),核心常用方法包括get()、post()、put()、delete(),其中g(shù)et()和post()覆蓋 80% 以上的業(yè)務(wù)場景。
(一)GET 請求:獲取資源(requests.get())
GET 請求用于從服務(wù)器獲取資源,參數(shù)通常通過 URL 傳遞,適用于查詢數(shù)據(jù)(如獲取天氣、查詢用戶信息)。
1. 基礎(chǔ)用法:帶 URL 參數(shù)的 GET 請求
若需傳遞參數(shù)(如查詢 “北京” 的天氣),可通過params參數(shù)傳入字典,requests會(huì)自動(dòng)將參數(shù)拼接為 URL 查詢字符串(?city=北京&key=xxx)。
示例:調(diào)用模擬天氣 API 獲取北京天氣
TypeScript取消自動(dòng)換行復(fù)制
import requests
# 1. 配置請求參數(shù)
url = "https://api.example.com/weather" # 目標(biāo)API地址
params = {
"city": "北京", # 查詢的城市
"key": "abc123" # API密鑰(通常由接口提供方分配)
}
# 2. 發(fā)送GET請求
response = requests.get(url, params=params)
# 3. 解析響應(yīng)(假設(shè)響應(yīng)體為JSON格式)
if response.status_code == 200: # 200表示請求成功
weather_data = response.json() # 將JSON響應(yīng)體轉(zhuǎn)為Python字典
print("城市:", weather_data["city"])
print("溫度:", weather_data["temp"])
print("天氣:", weather_data["desc"])
else:
print(f"請求失敗,狀態(tài)碼:{response.status_code}")
2. 進(jìn)階用法:自定義請求頭
部分 API 要求在請求頭中攜帶客戶端信息(如User-Agent模擬瀏覽器,Authorization傳遞令牌),可通過headers參數(shù)配置。
示例:帶自定義 headers 的 GET 請求
TypeScript取消自動(dòng)換行復(fù)制
import requests
url = "https://api.example.com/user/123" # 查詢ID為123的用戶信息
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0", # 模擬Chrome瀏覽器
"Authorization": "Bearer abcdef123456" # 身份令牌(JWT格式)
}
response = requests.get(url, headers=headers)
if response.status_code == 200:
print("用戶信息:", response.json())
(二)POST 請求:提交資源(requests.post())
POST 請求用于向服務(wù)器提交數(shù)據(jù)(如提交表單、創(chuàng)建用戶、上傳文件),參數(shù)通常放在請求體中,安全性高于 GET(參數(shù)不暴露在 URL 中)。requests.post()支持多種請求體格式,最常用的是 “表單數(shù)據(jù)” 和 “JSON 數(shù)據(jù)”。
1. 提交表單數(shù)據(jù)(Form Data)
適用于模擬 HTML 表單提交(如登錄、注冊),需將參數(shù)通過data參數(shù)傳入字典,requests會(huì)自動(dòng)設(shè)置請求頭Content-Type: application/x-www-form-urlencoded。
示例:模擬用戶登錄(提交用戶名和密碼)
TypeScript取消自動(dòng)換行復(fù)制
import requests
url = "https://api.example.com/login" # 登錄接口地址
data = {
"username": "test_user",
"password": "123456"
}
# 發(fā)送POST請求,提交表單數(shù)據(jù)
response = requests.post(url, data=data)
if response.status_code == 200:
result = response.json()
print("登錄結(jié)果:", result["message"])
print("登錄令牌:", result["token"]) # 登錄成功后獲取的身份令牌,后續(xù)請求需攜帶
else:
print("登錄失?。?quot;, response.text)
2. 提交 JSON 數(shù)據(jù)(JSON Payload)
適用于前后端分離項(xiàng)目的 API 交互(如創(chuàng)建訂單、更新用戶信息),需將參數(shù)通過json參數(shù)傳入字典,requests會(huì)自動(dòng)設(shè)置請求頭Content-Type: application/json,并將字典轉(zhuǎn)為 JSON 字符串。
示例:創(chuàng)建新用戶(提交 JSON 格式數(shù)據(jù))
TypeScript取消自動(dòng)換行復(fù)制
import requests
url = "https://api.example.com/users" # 創(chuàng)建用戶的接口
headers = {
"Authorization": "Bearer abcdef123456" # 需攜帶登錄后的令牌
}
user_data = {
"name": "張三",
"age": 25,
"email": "zhangsan@example.com"
}
# 發(fā)送POST請求,提交JSON數(shù)據(jù)
response = requests.post(url, headers=headers, json=user_data)
if response.status_code == 201: # 201表示資源創(chuàng)建成功
new_user = response.json()
print("新用戶ID:", new_user["id"])
print("創(chuàng)建時(shí)間:", new_user["create_time"])
3. 上傳文件(Multipart/Form-Data)
若需上傳文件(如圖片、文檔),需通過files參數(shù)傳入字典,requests會(huì)自動(dòng)設(shè)置請求頭Content-Type: multipart/form-data,適用于頭像上傳、文件提交等場景。
示例:上傳圖片文件
TypeScript取消自動(dòng)換行復(fù)制
import requests
url = "https://api.example.com/upload" # 文件上傳接口
headers = {
"Authorization": "Bearer abcdef123456"
}
files = {
# "file"為接口要求的參數(shù)名,open()打開文件,指定文件類型(image/jpeg)
"file": ("test.jpg", open("test.jpg", "rb"), "image/jpeg")
}
# 發(fā)送POST請求,上傳文件
response = requests.post(url, headers=headers, files=files)
if response.status_code == 200:
upload_result = response.json()
print("文件URL:", upload_result["file_url"]) # 上傳后文件的訪問地址
(三)其他常用方法:PUT、delete
除 GET 和 POST 外,requests還支持 PUT(更新資源)、delete(刪除資源)等方法,用法與 GET/POST 類似,僅需調(diào)用對應(yīng)的函數(shù)并傳遞參數(shù)。
1. PUT 請求:更新資源(requests.put())
適用于全量更新資源(如修改用戶的所有信息),參數(shù)傳遞方式與 POST 類似(支持data或json)。
示例:更新用戶信息(全量更新)
TypeScript取消自動(dòng)換行復(fù)制
import requests
url = "https://api.example.com/users/123" # 要更新的用戶ID為123
headers = {
"Authorization": "Bearer abcdef123456"
}
update_data = {
"name": "張三_更新",
"age": 26,
"email": "zhangsan_update@example.com"
}
# 發(fā)送PUT請求,更新用戶信息
response = requests.put(url, headers=headers, json=update_data)
if response.status_code == 200:
print("更新結(jié)果:", response.json()["message"]) # 輸出:"用戶信息更新成功"
2. delete 請求:刪除資源(requests.delete())
適用于刪除資源(如刪除用戶、刪除訂單),通常僅需傳遞 URL 和必要的請求頭(如身份令牌)。
示例:刪除用戶(ID 為 123)
TypeScript取消自動(dòng)換行復(fù)制
import requests
url = "https://api.example.com/users/123" # 要?jiǎng)h除的用戶ID為123
headers = {
"Authorization": "Bearer abcdef123456"
}
# 發(fā)送delete請求,刪除用戶
response = requests.delete(url, headers=headers)
if response.status_code == 204: # 204表示資源刪除成功,無響應(yīng)體
print("用戶刪除成功")
else:
print("刪除失?。?quot;, response.text)
四、requests 庫的進(jìn)階技巧
在實(shí)際開發(fā)中,還需處理超時(shí)控制、會(huì)話保持、異常捕獲等場景,requests提供了對應(yīng)的功能滿足需求。
(一)設(shè)置請求超時(shí)
為避免請求因網(wǎng)絡(luò)問題長期阻塞,可通過timeout參數(shù)設(shè)置超時(shí)時(shí)間(單位:秒),超時(shí)后會(huì)拋出requests.exceptions.Timeout異常。
示例:設(shè)置 5 秒超時(shí)
TypeScript取消自動(dòng)換行復(fù)制
import requests
try:
response = requests.get("https://api.example.com/weather", params={"city": "北京"}, timeout=5)
print("請求成功")
except requests.exceptions.Timeout:
print("請求超時(shí),需檢查網(wǎng)絡(luò)或接口狀態(tài)")
(二)會(huì)話保持(Session)
若需多次請求同一域名(如登錄后多次調(diào)用接口),使用requests.Session()可保持會(huì)話狀態(tài)(自動(dòng)保存 Cookie),避免每次請求都重新驗(yàn)證身份,提升效率。
示例:使用 Session 保持登錄狀態(tài)
TypeScript取消自動(dòng)換行復(fù)制
import requests
# 創(chuàng)建Session對象
session = requests.Session()
# 1. 第一步:登錄(Session會(huì)自動(dòng)保存Cookie)
login_url = "https://api.example.com/login"
session.post(login_url, data={"username": "test_user", "password": "123456"})
# 2. 第二步:調(diào)用需要登錄的接口(無需再次傳遞密碼,Session自動(dòng)攜帶Cookie)
user_info_url = "https://api.example.com/user/info"
response = session.get(user_info_url)
print("用戶信息:", response.json())
# 3. 第三步:關(guān)閉Session
session.close()
(三)異常捕獲
HTTP 請求可能因網(wǎng)絡(luò)錯(cuò)誤、接口錯(cuò)誤等拋出異常,需通過try-except捕獲常見異常(如Timeout、ConnectionError、HTTPError),確保程序穩(wěn)定運(yùn)行。
示例:完整的異常捕獲
TypeScript取消自動(dòng)換行復(fù)制
import requests
from requests.exceptions import Timeout, ConnectionError, HTTPError
try:
response = requests.get("https://api.example.com/weather", params={"city": "北京"}, timeout=5)
response.raise_for_status() # 若狀態(tài)碼非200(如404、500),拋出HTTPError異常
print("天氣數(shù)據(jù):", response.json())
except Timeout:
print("請求超時(shí)")
except ConnectionError:
print("網(wǎng)絡(luò)連接錯(cuò)誤(如域名不存在、服務(wù)器不可達(dá))")
except HTTPError as e:
print(f"接口返回錯(cuò)誤,狀態(tài)碼:{e.response.status_code}")
except Exception as e:
print(f"其他未知錯(cuò)誤:{str(e)}")
掌握requests庫的使用,能讓你輕松實(shí)現(xiàn) Python 與 HTTP 服務(wù)的交互,無論是對接第三方 API、開發(fā)前后端分離項(xiàng)目,還是實(shí)現(xiàn)數(shù)據(jù)爬取,都能高效完成需求,是 Python 開發(fā)的必備技能之一。