一、restful api 基础与 requests 库简介
1.1 什么是restful api
api(应用程序编程接口)允许不同软件之间相互通信。restful api是目前最流行的api设计风格,它基于http协议,使用url定位资源,用http方法(get、post、put、delete等)描述操作。
例如,一个提供天气数据的api可能有一个端点:https://api.weather.com/v1/city/beijing?unit=celsius
通过向该url发送get请求,我们可以获取北京的天气信息。
1.2 requests库:python的http客户端
requests库是python中最优雅、最常用的http库。它简化了发送http请求和处理响应的过程,让开发者能够专注于业务逻辑。
安装非常简单:
pip install requests
一个最基本的get请求示例:
import requests
response = requests.get('https://api.github.com')
print(response.status_code) # 200
print(response.json()) # 解析json响应
二、requests库核心用法详解
在深入案例之前,我们先系统梳理一下requests库的常用功能,这些将是所有api调用的基础。
2.1 发送请求
get请求:获取资源
params = {'q': 'python', 'page': 1}
response = requests.get('https://api.github.com/search/repositories', params=params)
post请求:创建资源(常用于提交数据)
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需要认证或指定内容类型,通过headers参数设置:
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状态码(200成功,404未找到,500服务器错误)response.text:原始文本内容response.json():将json响应解析为python字典/列表(最常用)response.headers:响应头response.encoding:编码方式
异常处理:使用response.raise_for_status()可以自动抛出http错误异常。
2.4 超时与重试
网络请求必须设置超时,防止程序卡死:
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,但简单场景可手动循环。
2.5 文件上传与下载
上传:用files参数
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)
三、实战案例一:调用天气api获取实时天气
天气api是最常见的免费api之一。以openweathermap为例,演示如何调用。
3.1 注册并获取api密钥
访问 openweathermap,注册账号后,在api keys页面获取你的密钥(例如:your_api_key)。
3.2 构建请求并解析数据
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' # 请替换为真实密钥
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 集成到自动化流程
假设我们之前实现了邮件自动发送功能,现在可以每天定时获取天气,并发送天气日报邮件。代码只需将获取的天气数据填入邮件正文即可。
四、实战案例二:调用汇率api实现货币转换
汇率数据更新频繁,非常适合通过api获取。以 exchangerate-api.com 为例,它提供免费、无需认证的汇率接口。
4.1 api介绍
端点:https://api.exchangerate-api.com/v4/latest/{base}
返回以base为基础货币的实时汇率。
4.2 实现汇率转换函数
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 进阶:处理多个货币对
可以封装一个类,缓存汇率数据以减少请求频率,或使用批量查询。
这种能力在跨境电商、财务自动化脚本中非常实用。例如,自动读取excel中的外币金额,转换为本币后生成报表。
五、实战案例三:调用ai接口实现智能文本处理
近年来,ai接口如雨后春笋般涌现。以openai gpt为例,展示如何调用ai生成文本。由于openai的api需要付费且国内访问受限,我们也可以使用国内平台如百度文心一言、阿里通义千问等。这里以openai风格为例,但代码稍作修改即可适配其他平台。
5.1 准备工作
注册openai并获取api密钥。设置环境变量或直接在代码中配置(注意安全)。
5.2 封装ai调用函数
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回复内容
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自动总结要点,然后发送给团队。或者,监控系统报警时,让ai分析日志并生成解决方案建议。ai接口为自动化注入了“智能”。
六、将api调用集成到自动化流程中
前面几天的学习我们实现了邮件自动发送与接收(day 55-58)、ocr文字识别(day 51-54)。现在有了api调用能力,我们可以将这些模块组合成一个强大的自动化系统。
示例:智能邮件助手
- 接收邮件(使用
imap_tools)获取未读邮件。 - 解析邮件内容,如果是特定指令(如“查询天气”),提取城市信息。
- 调用天气api获取该城市实时天气。
- 调用ai接口将天气数据组织成友好的回复文本。
- 自动回复邮件(使用
smtplib)将结果发送给用户。
关键代码片段(伪代码):
from imap_tools import mailbox, and
import smtplib
from email.mime.text import mimetext
# 省略天气和ai函数定义
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 = "抱歉,未查到该城市的天气。"
# 发送回复
send_email(msg.from_, "re: 天气查询", reply_text)
mailbox.move([msg.uid], 'processed')
这样,一个半智能的客服机器人就诞生了!
七、最佳实践与注意事项
安全存储api密钥
绝对不要将密钥硬编码在代码中,尤其是当代码会公开时。推荐使用环境变量或配置文件。
import os
api_key = os.environ.get('weather_api_key')
或使用.env文件配合python-dotenv。
速率限制与礼貌
大多数免费api都有请求频率限制(如每分钟60次)。应合理控制请求间隔,避免被封。可以在代码中添加sleep或使用令牌桶算法。
错误处理
网络请求可能因各种原因失败:超时、4xx/5xx错误、json解析失败。务必使用try/except捕获异常,并考虑重试机制。
超时设置
始终设置timeout参数,防止程序因等待响应而永久挂起。
缓存数据
对于变化不频繁的数据(如汇率,虽实时更新但可接受几分钟延迟),可以缓存一段时间以减少api调用。
使用会话对象
如果需要对同一主机发送多个请求,使用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库实现调用外部api的实战指南的文章就介绍到这了,更多相关python requests调用外部api内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论