Python使用requests庫實現(xiàn)調(diào)用外部API的實戰(zhàn)指南
一、RESTful API 基礎與 requests 庫簡介
1.1 什么是RESTful API
API(應用程序編程接口)允許不同軟件之間相互通信。RESTful API是目前最流行的API設計風格,它基于HTTP協(xié)議,使用URL定位資源,用HTTP方法(GET、POST、PUT、DELETE等)描述操作。
例如,一個提供天氣數(shù)據(jù)的API可能有一個端點:https://api.weather.com/v1/city/beijing?unit=celsius
通過向該URL發(fā)送GET請求,我們可以獲取北京的天氣信息。
1.2 requests庫:Python的HTTP客戶端
requests庫是Python中最優(yōu)雅、最常用的HTTP庫。它簡化了發(fā)送HTTP請求和處理響應的過程,讓開發(fā)者能夠?qū)W⒂跇I(yè)務邏輯。
安裝非常簡單:
pip install requests
一個最基本的GET請求示例:
import requests
response = requests.get('https://api.github.com')
print(response.status_code) # 200
print(response.json()) # 解析JSON響應
二、requests庫核心用法詳解
在深入案例之前,我們先系統(tǒng)梳理一下requests庫的常用功能,這些將是所有API調(diào)用的基礎。
2.1 發(fā)送請求
GET請求:獲取資源
params = {'q': 'python', 'page': 1}
response = requests.get('https://api.github.com/search/repositories', params=params)
POST請求:創(chuàng)建資源(常用于提交數(shù)據(jù))
data = {'name': 'John', 'age': 30}
response = requests.post('https://httpbin.org/post', data=data) # 表單格式
# 或者JSON格式
import json
response = requests.post('https://httpbin.org/post', json={'key': 'value'})
PUT/DELETE:更新/刪除資源,用法類似。
2.2 設置請求頭
許多API需要認證或指定內(nèi)容類型,通過headers參數(shù)設置:
headers = {
'User-Agent': 'Mozilla/5.0',
'Authorization': 'Bearer YOUR_TOKEN'
}
response = requests.get('https://api.example.com/data', headers=headers)
2.3 處理響應
response.status_code:HTTP狀態(tài)碼(200成功,404未找到,500服務器錯誤)response.text:原始文本內(nèi)容response.json():將JSON響應解析為Python字典/列表(最常用)response.headers:響應頭response.encoding:編碼方式
異常處理:使用response.raise_for_status()可以自動拋出HTTP錯誤異常。
2.4 超時與重試
網(wǎng)絡請求必須設置超時,防止程序卡死:
try:
response = requests.get('https://api.example.com', timeout=5) # 5秒超時
response.raise_for_status()
except requests.exceptions.Timeout:
print("請求超時")
except requests.exceptions.HTTPError as err:
print(f"HTTP錯誤: {err}")
對于需要重試的場景,可以使用requests的適配器或第三方庫tenacity,但簡單場景可手動循環(huán)。
2.5 文件上傳與下載
上傳:用files參數(shù)
files = {'file': open('report.xlsx', 'rb')}
requests.post('https://httpbin.org/post', files=files)
下載:流式下載大文件
with requests.get('https://example.com/bigfile.zip', stream=True) as r:
r.raise_for_status()
with open('bigfile.zip', 'wb') as f:
for chunk in r.iter_content(chunk_size=8192):
f.write(chunk)
三、實戰(zhàn)案例一:調(diào)用天氣API獲取實時天氣
天氣API是最常見的免費API之一。以OpenWeatherMap為例,演示如何調(diào)用。
3.1 注冊并獲取API密鑰
訪問 OpenWeatherMap,注冊賬號后,在API Keys頁面獲取你的密鑰(例如:your_api_key)。
3.2 構建請求并解析數(shù)據(jù)
import requests
def get_weather(city, api_key):
url = "http://api.openweathermap.org/data/2.5/weather"
params = {
'q': city,
'appid': api_key,
'units': 'metric', # 使用攝氏度
'lang': 'zh_cn' # 返回中文天氣描述
}
try:
response = requests.get(url, params=params, timeout=10)
response.raise_for_status()
data = response.json()
# 提取關鍵信息
city_name = data['name']
weather_desc = data['weather'][0]['description']
temp = data['main']['temp']
feels_like = data['main']['feels_like']
humidity = data['main']['humidity']
return {
'city': city_name,
'weather': weather_desc,
'temperature': temp,
'feels_like': feels_like,
'humidity': humidity
}
except requests.exceptions.RequestException as e:
print(f"請求失敗: {e}")
return None
except KeyError as e:
print(f"解析響應失敗,可能API返回錯誤: {e}")
return None
# 使用示例
if __name__ == '__main__':
api_key = 'your_api_key' # 請?zhí)鎿Q為真實密鑰
weather = get_weather('Beijing', api_key)
if weather:
print(f"{weather['city']}天氣:{weather['weather']}")
print(f"溫度:{weather['temperature']}°C (體感{weather['feels_like']}°C)")
print(f"濕度:{weather['humidity']}%")
輸出示例:
北京天氣:晴
溫度:25°C (體感26°C)
濕度:45%
3.3 集成到自動化流程
假設我們之前實現(xiàn)了郵件自動發(fā)送功能,現(xiàn)在可以每天定時獲取天氣,并發(fā)送天氣日報郵件。代碼只需將獲取的天氣數(shù)據(jù)填入郵件正文即可。
四、實戰(zhàn)案例二:調(diào)用匯率API實現(xiàn)貨幣轉換
匯率數(shù)據(jù)更新頻繁,非常適合通過API獲取。以 exchangerate-api.com 為例,它提供免費、無需認證的匯率接口。
4.1 API介紹
端點:https://api.exchangerate-api.com/v4/latest/{base}
返回以base為基礎貨幣的實時匯率。
4.2 實現(xiàn)匯率轉換函數(shù)
import requests
def convert_currency(amount, from_currency, to_currency):
url = f"https://api.exchangerate-api.com/v4/latest/{from_currency.upper()}"
try:
response = requests.get(url, timeout=10)
response.raise_for_status()
data = response.json()
if to_currency.upper() not in data['rates']:
print(f"不支持的貨幣: {to_currency}")
return None
rate = data['rates'][to_currency.upper()]
converted = amount * rate
return converted, rate
except requests.exceptions.RequestException as e:
print(f"匯率請求失敗: {e}")
return None
# 示例:100美元兌換人民幣
result = convert_currency(100, 'USD', 'CNY')
if result:
converted, rate = result
print(f"100 USD = {converted:.2f} CNY (匯率: {rate})")
4.3 進階:處理多個貨幣對
可以封裝一個類,緩存匯率數(shù)據(jù)以減少請求頻率,或使用批量查詢。
這種能力在跨境電商、財務自動化腳本中非常實用。例如,自動讀取Excel中的外幣金額,轉換為本幣后生成報表。
五、實戰(zhàn)案例三:調(diào)用AI接口實現(xiàn)智能文本處理
近年來,AI接口如雨后春筍般涌現(xiàn)。以OpenAI GPT為例,展示如何調(diào)用AI生成文本。由于OpenAI的API需要付費且國內(nèi)訪問受限,我們也可以使用國內(nèi)平臺如百度文心一言、阿里通義千問等。這里以OpenAI風格為例,但代碼稍作修改即可適配其他平臺。
5.1 準備工作
注冊OpenAI并獲取API密鑰。設置環(huán)境變量或直接在代碼中配置(注意安全)。
5.2 封裝AI調(diào)用函數(shù)
import requests
import json
def ask_ai(prompt, api_key, model="gpt-3.5-turbo"):
url = "https://api.openai.com/v1/chat/completions"
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {api_key}"
}
data = {
"model": model,
"messages": [{"role": "user", "content": prompt}],
"temperature": 0.7
}
try:
response = requests.post(url, headers=headers, json=data, timeout=30)
response.raise_for_status()
result = response.json()
# 提取AI回復內(nèi)容
reply = result['choices'][0]['message']['content']
return reply
except requests.exceptions.RequestException as e:
print(f"AI請求失敗: {e}")
return None
except (KeyError, json.JSONDecodeError) as e:
print(f"解析AI響應失敗: {e}")
return None
# 示例
api_key = "your_openai_key"
reply = ask_ai("用一句話解釋什么是RESTful API", api_key)
if reply:
print("AI回復:", reply)
5.3 將AI能力融入自動化
想象一下:每天收到一堆客戶反饋郵件,你可以用AI自動總結要點,然后發(fā)送給團隊?;蛘?,監(jiān)控系統(tǒng)報警時,讓AI分析日志并生成解決方案建議。AI接口為自動化注入了“智能”。
六、將API調(diào)用集成到自動化流程中
前面幾天的學習我們實現(xiàn)了郵件自動發(fā)送與接收(Day 55-58)、OCR文字識別(Day 51-54)?,F(xiàn)在有了API調(diào)用能力,我們可以將這些模塊組合成一個強大的自動化系統(tǒng)。
示例:智能郵件助手
- 接收郵件(使用
imap_tools)獲取未讀郵件。 - 解析郵件內(nèi)容,如果是特定指令(如“查詢天氣”),提取城市信息。
- 調(diào)用天氣API獲取該城市實時天氣。
- 調(diào)用AI接口將天氣數(shù)據(jù)組織成友好的回復文本。
- 自動回復郵件(使用
smtplib)將結果發(fā)送給用戶。
關鍵代碼片段(偽代碼):
from imap_tools import MailBox, AND
import smtplib
from email.mime.text import MIMEText
# 省略天氣和AI函數(shù)定義
def process_emails():
with MailBox('imap.qq.com').login('user@qq.com', 'pwd', 'INBOX') as mailbox:
for msg in mailbox.fetch(AND(seen=False, subject='天氣查詢')):
# 假設郵件正文包含城市名
city = msg.text.strip()
weather = get_weather(city, WEATHER_API_KEY)
if weather:
prompt = f"請將以下天氣信息整理成一段友好的文字:{weather}"
reply_text = ask_ai(prompt, AI_API_KEY)
else:
reply_text = "抱歉,未查到該城市的天氣。"
# 發(fā)送回復
send_email(msg.from_, "Re: 天氣查詢", reply_text)
mailbox.move([msg.uid], 'PROCESSED')
這樣,一個半智能的客服機器人就誕生了!
七、最佳實踐與注意事項
安全存儲API密鑰
絕對不要將密鑰硬編碼在代碼中,尤其是當代碼會公開時。推薦使用環(huán)境變量或配置文件。
import os
API_KEY = os.environ.get('WEATHER_API_KEY')
或使用.env文件配合python-dotenv。
速率限制與禮貌
大多數(shù)免費API都有請求頻率限制(如每分鐘60次)。應合理控制請求間隔,避免被封??梢栽诖a中添加sleep或使用令牌桶算法。
錯誤處理
網(wǎng)絡請求可能因各種原因失?。撼瑫r、4xx/5xx錯誤、JSON解析失敗。務必使用try/except捕獲異常,并考慮重試機制。
超時設置
始終設置timeout參數(shù),防止程序因等待響應而永久掛起。
緩存數(shù)據(jù)
對于變化不頻繁的數(shù)據(jù)(如匯率,雖實時更新但可接受幾分鐘延遲),可以緩存一段時間以減少API調(diào)用。
使用會話對象
如果需要對同一主機發(fā)送多個請求,使用requests.Session()可以復用TCP連接,提高性能。
with requests.Session() as session:
session.headers.update({'Authorization': f'Bearer {TOKEN}'})
resp1 = session.get('https://api.example.com/data1')
resp2 = session.get('https://api.example.com/data2')到此這篇關于Python使用requests庫實現(xiàn)調(diào)用外部API的實戰(zhàn)指南的文章就介紹到這了,更多相關Python requests調(diào)用外部API內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
python使用paramiko模塊實現(xiàn)ssh遠程登陸上傳文件并執(zhí)行
使用paramiko,ssh遠程登陸,長傳文件并執(zhí)行。其中用到了多線程和隊列,paramiko是用python語言寫的一個模塊,遵循SSH2協(xié)議,支持以加密和認證的方式,進行遠程服務器的連接。2014-01-01
Python數(shù)據(jù)類型之Number數(shù)字操作實例詳解
這篇文章主要介紹了Python數(shù)據(jù)類型之Number數(shù)字操作,結合實例形式詳細分析了Python數(shù)字類型的概念、功能、分類及常用數(shù)學函數(shù)相關使用技巧,需要的朋友可以參考下2019-05-05
Selenium獲取登錄Cookies并添加Cookies自動登錄的方法
這篇文章主要介紹了Selenium獲取登錄Cookies并添加Cookies自動登錄的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-12-12
PyQt5.6+pycharm配置以及pyinstaller生成exe(小白教程)
這篇文章主要介紹了PyQt5.6+pycharm配置以及pyinstaller生成exe,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-06-06

