Python Requests庫入門實戰(zhàn)演示
1. 庫的概覽與核心價值
想象一下,在網(wǎng)絡(luò)世界中,如果你想與各種網(wǎng)站和服務進行通信,就像是用傳統(tǒng)的信件往來。你需要手動打包數(shù)據(jù)、編寫地址、處理回復編碼,這些繁瑣的細節(jié)會讓簡單的任務變得復雜。requests庫正是為解決這些問題而生的工具。
Requests是Python中最流行的HTTP客戶端庫,它的設(shè)計哲學是"為人類設(shè)計"。它將復雜的HTTP協(xié)議細節(jié)封裝在簡潔的API之下,讓開發(fā)者能夠用最少的代碼完成網(wǎng)絡(luò)請求。與Python標準庫中的urllib相比,Requests的使用體驗提升了90%以上——你不再需要手動處理URL編碼、表單數(shù)據(jù)序列化、連接池管理等底層細節(jié)。
Requests在Python生態(tài)系統(tǒng)中占據(jù)著不可或缺的地位。據(jù)PyPI官方統(tǒng)計,它的下載量每月超過10億次,超過50萬個開源項目依賴它。無論是調(diào)用REST API、構(gòu)建網(wǎng)絡(luò)爬蟲、自動化測試,還是開發(fā)微服務客戶端,Requests都是首選工具。它支持HTTP/1.1的所有特性,包括連接池管理、Cookie持久化、SSL驗證、自動內(nèi)容解碼等,讓HTTP請求變得前所未有的簡單。
2. 環(huán)境搭建與"Hello, World"
安裝說明
Requests不是Python標準庫的一部分,需要通過包管理器安裝:
# 使用pip安裝(推薦) pip install requests # 使用conda安裝 conda install requests # 使用Python模塊方式安裝 python -m pip install requests
Requests官方支持Python 3.9+版本,同時也兼容PyPy解釋器。如果在安裝過程中遇到權(quán)限問題,可以嘗試使用--user參數(shù)或創(chuàng)建虛擬環(huán)境。
最簡示例
以下是一個簡單的"Hello, World"示例,展示如何發(fā)送GET請求并獲取響應:
import requests
# 發(fā)送GET請求到GitHub API
response = requests.get('https://api.github.com/events')
# 打印響應狀態(tài)碼
print(f"狀態(tài)碼: {response.status_code}")
# 打印響應內(nèi)容的前100個字符
print(f"響應內(nèi)容: {response.text[:100]}")逐行解釋
import requests- 導入Requests庫,使其功能在當前腳本中可用。response = requests.get('https://api.github.com/events')- 調(diào)用get()方法向GitHub API發(fā)送GET請求,返回的Response對象包含了服務器的全部響應信息。print(f"狀態(tài)碼: {response.status_code}")- 訪問Response對象的status_code屬性,獲取HTTP狀態(tài)碼(200表示成功)。print(f"響應內(nèi)容: {response.text[:100]}")- 通過text屬性獲取響應的文本內(nèi)容,并切片顯示前100個字符。
運行結(jié)果
程序運行后會輸出類似以下內(nèi)容:
狀態(tài)碼: 200
響應內(nèi)容: [{"id":"25698765432","type":"PushEvent","actor":{"id":12345678,"login":"userna
這個簡單的例子展示了Requests的核心優(yōu)勢:用三行代碼就完成了一次完整的HTTP請求,自動處理了連接建立、數(shù)據(jù)傳輸、響應解碼等所有細節(jié)。
3. 核心概念解析
Requests庫圍繞幾個核心概念構(gòu)建,理解這些概念有助于你更靈活地使用它。
3.1 請求方法(Request Methods)
HTTP協(xié)議定義了多種請求方法,Requests為每種方法都提供了對應的函數(shù):
requests.get()- 獲取資源requests.post()- 提交數(shù)據(jù)requests.put()- 更新資源(完整替換)requests.patch()- 更新資源(部分修改)requests.delete()- 刪除資源requests.head()- 獲取響應頭requests.options()- 獲取服務器支持的方法
3.2 響應對象(Response Object)
每次請求后,Requests都會返回一個Response對象,它包含了服務器的完整響應信息:
response.status_code- HTTP狀態(tài)碼response.text- 響應的文本內(nèi)容(自動解碼)response.content- 響應的字節(jié)內(nèi)容(原始二進制)response.json()- 將JSON響應解析為Python字典response.headers- 響應頭信息(字典形式)response.cookies- 服務器設(shè)置的Cookie
3.3 會話對象(Session Object)
Session對象允許你在多個請求之間保持某些參數(shù)(如Cookies、認證信息),并復用TCP連接,顯著提高性能:
session = requests.Session()
session.headers.update({'User-Agent': 'My App'})
# 第一個請求會保存Cookies
response1 = session.get('https://httpbin.org/cookies/set/sessionid/123')
# 第二個請求會自動攜帶之前保存的Cookies
response2 = session.get('https://httpbin.org/cookies')概念關(guān)系圖

這個圖表展示了Requests庫的核心概念及其關(guān)系:請求方法用于發(fā)送請求,響應對象用于接收和處理服務器的回應,而會話對象則在多個請求之間提供狀態(tài)保持和連接復用。
4. 實戰(zhàn)演練:解決一個典型問題
需求分析
假設(shè)我們需要開發(fā)一個天氣查詢應用,能夠獲取指定城市的當前天氣信息。我們將使用免費的天氣API,通過發(fā)送HTTP請求來獲取數(shù)據(jù),并解析返回的JSON響應。
方案設(shè)計
這個項目將展示Requests庫的幾個核心功能:
- 使用
requests.get()發(fā)送帶參數(shù)的GET請求 - 通過
params參數(shù)傳遞查詢參數(shù)(城市名稱) - 使用
response.json()解析JSON響應 - 實現(xiàn)錯誤處理和異常捕獲
- 展示響應數(shù)據(jù)的提取和格式化
代碼實現(xiàn)
import requests
from requests.exceptions import RequestException
def get_weather(city):
"""
獲取指定城市的天氣信息
Args:
city (str): 城市名稱,例如"Beijing"或"Shanghai"
Returns:
dict: 包含天氣信息的字典,失敗時返回None
"""
# 使用免費的天氣API(示例使用httpbin.org模擬)
base_url = "https://httpbin.org/get"
params = {
'city': city,
'units': 'metric'
}
try:
# 發(fā)送GET請求,設(shè)置超時時間為5秒
response = requests.get(base_url, params=params, timeout=5)
# 檢查響應狀態(tài)碼,如果不是2xx則拋出異常
response.raise_for_status()
# 解析JSON響應
data = response.json()
# 提取天氣信息(這里模擬真實API的數(shù)據(jù)結(jié)構(gòu))
weather_info = {
'city': data.get('args', {}).get('city', city),
'temperature': 25, # 模擬數(shù)據(jù)
'condition': '晴朗',
'humidity': 45,
'wind_speed': 3.2
}
return weather_info
except requests.exceptions.Timeout:
print(f"錯誤: 請求超時,無法獲取{city}的天氣信息")
except requests.exceptions.HTTPError as err:
print(f"HTTP錯誤: {err.response.status_code}")
except requests.exceptions.RequestException as err:
print(f"請求出錯: {err}")
return None
def main():
"""主函數(shù):獲取并顯示多個城市的天氣"""
cities = ['Beijing', 'Shanghai', 'Guangzhou']
print("=== 天氣查詢系統(tǒng) ===\n")
for city in cities:
print(f"正在查詢 {city} 的天氣...")
weather = get_weather(city)
if weather:
print(f"\n{weather['city']} 天氣信息:")
print(f" 溫度: {weather['temperature']}°C")
print(f" 天氣: {weather['condition']}")
print(f" 濕度: {weather['humidity']}%")
print(f" 風速: {weather['wind_speed']} m/s")
print("-" * 40)
if __name__ == '__main__':
main()運行說明
- 確保已安裝Requests庫:
pip install requests - 將代碼保存為
weather_app.py - 運行程序:
python weather_app.py
程序會依次查詢?nèi)齻€城市的天氣信息,并格式化輸出結(jié)果。雖然示例使用了httpbin.org模擬數(shù)據(jù),但代碼結(jié)構(gòu)可以直接適配真實的天氣API(如OpenWeatherMap、和風天氣等),只需修改base_url和數(shù)據(jù)提取邏輯即可。
關(guān)鍵點解析
- 參數(shù)傳遞: 使用
params字典傳遞查詢參數(shù),Requests會自動進行URL編碼 - 超時設(shè)置:
timeout=5參數(shù)防止請求無限期等待 - 錯誤處理: 使用
raise_for_status()自動檢查狀態(tài)碼,并捕獲各類異常 - JSON解析:
response.json()將JSON響應直接轉(zhuǎn)換為Python字典 - 模塊化設(shè)計: 將核心功能封裝為函數(shù),便于復用和測試
5. 最佳實踐與常見陷阱
常見錯誤及規(guī)避方法
錯誤1:不檢查狀態(tài)碼
# ? 錯誤做法
response = requests.get('https://api.example.com/data')
data = response.json() # 如果狀態(tài)碼不是200,這里可能拋出異常
# ? 正確做法
response = requests.get('https://api.example.com/data')
response.raise_for_status() # 檢查狀態(tài)碼,非2xx時拋出HTTPError
data = response.json()錯誤2:不設(shè)置超時時間
# ? 錯誤做法
response = requests.get('https://api.example.com/data')
# 如果網(wǎng)絡(luò)故障或服務器無響應,程序會無限期等待
# ? 正確做法
response = requests.get('https://api.example.com/data', timeout=10)
# 10秒后超時,拋出Timeout異常錯誤3:在循環(huán)中重復創(chuàng)建會話
# ? 錯誤做法
for url in url_list:
response = requests.get(url) # 每次都建立新連接,效率低下
# ? 正確做法
with requests.Session() as session:
for url in url_list:
response = session.get(url) # 復用連接,性能更高最佳實踐建議
- 始終使用會話(Session): 對于向同一域名發(fā)送多個請求的場景,使用Session可以復用TCP連接,減少握手開銷,提高性能。
- 合理設(shè)置超時: 建議為所有請求設(shè)置超時參數(shù),可以使用元組分別設(shè)置連接超時和讀取超時,例如
timeout=(3, 10)。 - 處理JSON解析異常: 并非所有API響應都是有效的JSON,使用
response.json()時應該捕獲JSONDecodeError:
import json
try:
data = response.json()
except json.JSONDecodeError:
print("響應不是有效的JSON格式")
data = None- 使用User-Agent標識: 某些網(wǎng)站會檢查請求頭中的User-Agent,建議設(shè)置一個合理的標識:
headers = {
'User-Agent': 'MyWeatherApp/1.0 (https://myapp.com)'
}
response = requests.get(url, headers=headers)- HTTPS證書驗證: 生產(chǎn)環(huán)境中應該驗證SSL證書,僅在測試環(huán)境或特定場景下禁用:
# 生產(chǎn)環(huán)境:驗證證書(默認行為)
response = requests.get('https://example.com')
# 測試環(huán)境:禁用證書驗證
response = requests.get('https://example.com', verify=False)- 使用環(huán)境變量管理敏感信息: API密鑰、令牌等敏感信息應該存儲在環(huán)境變量中,而不是硬編碼在代碼里:
import os
api_key = os.environ.get('MY_API_KEY')
headers = {'Authorization': f'Bearer {api_key}'}注意事項
- Requests默認使用連接池,會自動處理Keep-Alive,無需手動管理連接
- 下載大文件時,使用
stream=True參數(shù)逐步讀取,避免內(nèi)存溢出 - 處理重定向時,可以通過
allow_redirects=False禁用自動重定向 - 對于需要認證的API,優(yōu)先使用Session對象的
auth參數(shù)或headers參數(shù),而不是在每個請求中重復設(shè)置
6. 進階指引
高級功能
Requests提供了許多高級功能,可以應對復雜的HTTP交互場景:
- 認證處理: 支持Basic認證、Digest認證、OAuth等多種認證方式
- 代理配置: 通過
proxies參數(shù)配置HTTP/SOCKS代理 - 流式上傳/下載: 處理大文件傳輸時避免內(nèi)存問題
- 事件鉤子: 在請求的不同階段注冊回調(diào)函數(shù)
- 自定義適配器: 實現(xiàn)自定義的傳輸協(xié)議或連接邏輯
生態(tài)擴展
Requests的生態(tài)豐富,有許多擴展庫可以增強其功能:
requests-oauthlib: OAuth認證支持requests-cache: 響應緩存,減少重復請求requests-toolbelt: 實用工具集合,如Multipart上傳、流式請求等grequests: 基于gevent的異步請求requests-threads: 多線程請求支持
學習路徑
如果你想深入學習Requests,建議按以下路徑進行:
- 掌握基礎(chǔ)API: 熟悉所有請求方法和Response對象的屬性
- 理解HTTP協(xié)議: 學習HTTP/1.1規(guī)范,理解狀態(tài)碼、請求頭、響應頭的含義
- 探索高級特性: 研究Session對象、連接池、SSL驗證等高級功能
- 閱讀源代碼: Requests的代碼結(jié)構(gòu)清晰,閱讀源碼有助于理解其實現(xiàn)原理
- 實踐項目: 開發(fā)一個完整的爬蟲或API客戶端項目
學習資源
- 官方文檔: https://docs.python-requests.org (最權(quán)威、最完整的資源)
- GitHub倉庫: https://github.com/psf/requests (源碼、Issue、討論)
- Stack Overflow: 搜索標簽[python-requests]找到常見問題的解答
- 社區(qū)博客: 許多開發(fā)者分享了Requests的實戰(zhàn)經(jīng)驗和技巧
Requests庫的設(shè)計理念是"簡單即美",但它的背后是HTTP協(xié)議的復雜性和網(wǎng)絡(luò)編程的挑戰(zhàn)。掌握了Requests,你就掌握了與網(wǎng)絡(luò)世界溝通的基本技能。繼續(xù)探索,你會發(fā)現(xiàn)HTTP請求的世界遠比你想象的更加豐富和有趣。
到此這篇關(guān)于Python Requests庫入門指南的文章就介紹到這了,更多相關(guān)Python Requests庫入門內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
pandas組內(nèi)排序,并在每個分組內(nèi)按序打上序號的操作
這篇文章主要介紹了pandas組內(nèi)排序,并在每個分組內(nèi)按序打上序號的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03
Python?shapefile轉(zhuǎn)GeoJson的2種方式實例
geojson是地圖可視化系統(tǒng)中最常用的地理數(shù)據(jù)格式,幾乎所有主流地圖可視化庫或框架都支持geojson數(shù)據(jù)的加載,下面這篇文章主要給大家介紹了關(guān)于Python?shapefile轉(zhuǎn)GeoJson的2種方式的相關(guān)資料,需要的朋友可以參考下2023-03-03
Python利用flask sqlalchemy實現(xiàn)分頁效果
這篇文章主要為大家詳細介紹了利用flask sqlalchemy實現(xiàn)分頁效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07

