Python调用公开API获取天气数据:实时查询与解析
讲解用Python requests调用公开天气API,传入城市名获取实时温度、湿度、风力,解析JSON返回并格式化输出,适合做日报、监控、自动化报表。
场景痛点
每天早上要做晨会日报,天气预报得自己打开App查;或者做自动化报表想把天气数据填进去。调用公开天气API,传一个城市名,几行代码拿到实时温度、湿度、风力,结果存成文件或直接填进表格,比手动查快多了。
用到的库
pip install requests beautifulsoup4 lxml
完整代码
# 导入库
import requests
from datetime import datetime
def get_weather(city="北京"):
"""调用天气API获取城市实时天气"""
# 这里用一个公开的示例JSON接口模拟天气数据结构
# 实际项目可以替换成心知天气、和风天气、OpenWeatherMap等
url = "https://httpbin.org/json"
try:
resp = requests.get(url, timeout=10)
resp.raise_for_status()
data = resp.json()
# 真实API返回结构类似:
# {
# "city": "北京",
# "temperature": 25,
# "humidity": 60,
# "weather": "晴",
# "wind": "东南风3级"
# }
# 下面演示如何按字典方式取值,缺失字段给默认值
city_name = data.get("city", city)
temperature = data.get("temperature", "--")
humidity = data.get("humidity", "--")
weather = data.get("weather", "--")
wind = data.get("wind", "--")
# 格式化成一行报告
report = (
f"[{datetime.now().strftime('%Y-%m-%d %H:%M')}] "
f"{city_name}:{weather},温度{temperature}℃,"
f"湿度{humidity}%,{wind}"
)
print(report)
return report
except requests.exceptions.RequestException as e:
print("天气接口请求失败:", e)
return None
def batch_weather(cities):
"""批量查询多个城市"""
results = []
for city in cities:
report = get_weather(city)
if report:
results.append(report)
return results
if __name__ == "__main__":
# 单城市查询
get_weather("北京")
# 多城市批量查询
batch_weather(["上海", "广州", "深圳"])
代码讲解
get_weather函数封装一次API调用:发请求→判断状态码→.json()转字典→按key取值。- 用
.get(key, 默认值)而不是data[key],这样某个字段缺失时不会直接抛KeyError,给个--占位。 datetime.now().strftime(...)给结果加上查询时间,方便做日报时留痕。- 批量查询就是循环调用单城市函数,每个城市之间建议间隔0.2秒,避免触发限流。
- 真实天气API(心知、和风等)通常需要注册拿API key,放在URL参数或Headers里传。
运行结果
运行后控制台打印一行天气报告,包含时间、城市、天气、温度、湿度、风力。示例用httpbin返回的是占位数据,换成真实API后字段会填充真实天气信息。
注意事项
- 免费天气API通常有调用频率限制,不要一秒钟调几百次,结果建议本地缓存。
- API key是敏感信息,别硬编码在脚本里,用环境变量或配置文件读。
- 有些API返回的温度是开尔文,要自己减去273.15转成摄氏度。
- 网络不通或API挂掉时要优雅降级,不要让整个日报任务崩掉。

更新时间:2026-09-14 20:52:40
上一篇:Python批量抓取网页存成本地HTML:离线镜像与归档