requests是Python中最流行的HTTP庫之一,它簡化了發(fā)送HTTP請求的過程。通過requests庫,開發(fā)者可以輕松地發(fā)送各種HTTP請求(如GET、POST、PUT、DELETE等),處理響應(yīng),支持會話管理、重定向、代理、文件上傳等功能,是Web開發(fā)和API交互中不可或缺的工具。
一、安裝requests庫
首先,確保你已經(jīng)安裝了requests庫。如果沒有安裝,可以通過pip命令輕松安裝:
bashCopy Codepip install requests
安裝完成后,即可在代碼中導(dǎo)入并使用該庫。
二、基本用法
requests庫提供了簡單易用的API來進行HTTP請求操作。最常見的請求方法包括GET、POST、PUT、DELETE等。以下是幾種常見請求的示例:
1. 發(fā)送GET請求
GET請求用于從服務(wù)器獲取資源,通常用于瀏覽器訪問網(wǎng)頁。
pythonCopy Codeimport requests
# 發(fā)送GET請求
response = requests.get('https://httpbin.org/get')
# 打印響應(yīng)的狀態(tài)碼
print(response.status_code)
# 打印響應(yīng)的文本內(nèi)容
print(response.text)
# 打印響應(yīng)的JSON內(nèi)容(如果響應(yīng)為JSON格式)
print(response.json())
解析:
status_code: 返回HTTP響應(yīng)的狀態(tài)碼,如200表示請求成功。
text: 返回響應(yīng)的內(nèi)容,通常是字符串形式。
json(): 將響應(yīng)內(nèi)容解析為JSON格式(如果響應(yīng)是JSON格式的話)。
2. 發(fā)送POST請求
POST請求用于向服務(wù)器提交數(shù)據(jù)。常用于表單提交或API數(shù)據(jù)交互。
pythonCopy Codeimport requests
# 要發(fā)送的數(shù)據(jù)(可以是字典、JSON等格式)
data = {'username': 'john_doe', 'password': '123456'}
# 發(fā)送POST請求
response = requests.post('https://httpbin.org/post', data=data)
# 打印響應(yīng)內(nèi)容
print(response.status_code)
print(response.json())
解析:
data: POST請求的表單數(shù)據(jù)(可以是字典、列表、字符串等)。
json(): 可以直接解析返回的JSON格式響應(yīng)。
3. 發(fā)送PUT請求
PUT請求用于更新資源。類似于POST請求,但通常用于更新現(xiàn)有資源。
pythonCopy Codeimport requests
data = {'username': 'john_doe', 'password': 'newpassword123'}
# 發(fā)送PUT請求
response = requests.put('https://httpbin.org/put', data=data)
print(response.status_code)
print(response.json())
4. 發(fā)送DELETE請求
DELETE請求用于刪除服務(wù)器上的資源。
pythonCopy Codeimport requests
# 發(fā)送DELETE請求
response = requests.delete('https://httpbin.org/delete')
print(response.status_code)
print(response.json())
三、請求參數(shù)與頭部設(shè)置
1. 傳遞URL參數(shù)(Query參數(shù))
GET請求可以在URL中附加參數(shù)。你可以通過params參數(shù)傳遞這些查詢字符串。
pythonCopy Codeimport requests
# 發(fā)送帶有查詢參數(shù)的GET請求
params = {'search': 'python', 'page': 2}
response = requests.get('https://httpbin.org/get', params=params)
print(response.url) # 打印最終的URL
print(response.json()) # 打印返回的JSON數(shù)據(jù)
解析:
params: 將字典類型的查詢參數(shù)附加到請求URL中。
2. 自定義請求頭(Headers)
你可以通過headers參數(shù)傳遞自定義請求頭信息,通常用于設(shè)置User-Agent、Authorization等信息。
pythonCopy Codeimport requests
headers = {'User-Agent': 'Mozilla/5.0', 'Authorization': 'Bearer <token>'}
response = requests.get('https://httpbin.org/headers', headers=headers)
print(response.json()) # 打印響應(yīng)的頭部信息
解析:
headers: 用于設(shè)置HTTP請求頭,如User-Agent、Content-Type、Authorization等。
3. 傳遞JSON數(shù)據(jù)
如果要發(fā)送JSON數(shù)據(jù),可以使用json參數(shù)。requests會自動將字典數(shù)據(jù)轉(zhuǎn)為JSON格式并設(shè)置正確的Content-Type頭部。
pythonCopy Codeimport requests
data = {'name': 'John', 'age': 30}
# 發(fā)送POST請求,傳遞JSON數(shù)據(jù)
response = requests.post('https://httpbin.org/post', json=data)
print(response.json())
四、會話管理與Cookie
requests庫還提供了會話管理功能,允許你保持某個會話的狀態(tài),跨多個請求保持Cookie、身份驗證等信息。
pythonCopy Codeimport requests
# 創(chuàng)建一個會話對象
session = requests.Session()
# 第一次請求,保存cookie
response = session.get('https://httpbin.org/cookies/set?name=foo&value=bar')
print(response.status_code)
# 第二次請求,帶上之前保存的cookie
response = session.get('https://httpbin.org/cookies')
print(response.json()) # 查看cookie信息
解析:
使用Session對象可以自動管理Cookie和會話信息。
五、文件上傳與下載
1. 文件上傳
通過files參數(shù),你可以上傳文件。在發(fā)送POST請求時,通常會使用這個參數(shù)。
pythonCopy Codeimport requests
# 要上傳的文件
files = {'file': open('example.txt', 'rb')}
# 發(fā)送文件上傳請求
response = requests.post('https://httpbin.org/post', files=files)
print(response.json())
2. 文件下載
你可以使用requests下載文件,并將文件內(nèi)容寫入本地。
pythonCopy Codeimport requests
url = 'https://www.example.com/somefile.zip'
# 發(fā)送GET請求下載文件
response = requests.get(url, stream=True)
# 保存文件到本地
with open('downloaded_file.zip', 'wb') as f:
for chunk in response.iter_content(chunk_size=1024):
if chunk:
f.write(chunk)
print("文件下載完成")
解析:
stream=True: 使得響應(yīng)體以流的方式處理,適用于大文件下載。
iter_content(): 按塊讀取文件內(nèi)容。
六、錯誤處理與調(diào)試
1. 錯誤處理
在發(fā)送請求時,你可能遇到一些網(wǎng)絡(luò)問題或服務(wù)器錯誤。requests提供了異常處理機制,常用的異常類包括:
requests.exceptions.RequestException: 基類,所有請求異常的基類。
requests.exceptions.HTTPError: HTTP響應(yīng)錯誤。
requests.exceptions.Timeout: 請求超時。
requests.exceptions.ConnectionError: 網(wǎng)絡(luò)連接錯誤。
pythonCopy Codeimport requests
try:
response = requests.get('https://httpbin.org/status/404')
response.raise_for_status() # 如果響應(yīng)狀態(tài)碼不是2xx,會拋出HTTPError
except requests.exceptions.HTTPError as err:
print(f"HTTP錯誤: {err}")
except requests.exceptions.RequestException as err:
print(f"請求錯誤: {err}")
2. 調(diào)試請求
你可以使用requests的response對象獲取更詳細(xì)的調(diào)試信息,例如響應(yīng)頭、請求體等。
pythonCopy Codeimport requests
response = requests.get('https://httpbin.org/get')
print(f"請求URL: {response.url}")
print(f"請求頭: {response.request.headers}")
print(f"響應(yīng)頭: {response.headers}")
print(f"響應(yīng)文本: {response.text}")
requests庫提供了簡單且強大的功能,使得Python開發(fā)者能夠輕松地進行HTTP請求。通過掌握基本的GET、POST請求的使用方法,結(jié)合會話管理、文件上傳下載、錯誤處理等技巧,可以應(yīng)對絕大多數(shù)的網(wǎng)絡(luò)請求需求。希望本篇文章能幫助你快速上手并高效使用requests庫進行Web請求。