Python案例实战:如何实现天气查询?一文掌握API调用与数据解析
目录导读
-
为什么用Python实现天气查询?

-
准备工作:你需要哪些依赖与API密钥?
-
核心代码分步解析
-
完整案例:命令行版与GUI版
-
常见问题与避坑指南(问答Q&A)
-
优化建议与延伸学习
为什么用Python实现天气查询?
在实际开发中,天气查询是一个经典的API调用与数据解析案例,通过这个项目,你可以掌握:
- 如何调用RESTful API(如和风天气、OpenWeatherMap)
- JSON数据的解析与提取
- 异常处理与错误码判断
- 将结果格式化输出或嵌入GUI界面
使用场景:智能家居控制屏、个人助理机器人、自动化消息推送,或者只是一个让你想出门前看看天气的实用脚本。
准备工作:你需要哪些依赖与API密钥?
1 安装必要库
pip install requests # 用于HTTP请求 pip install tkinter # 如果要做GUI版,Python自带,无需额外安装
2 申请API密钥
以和风天气(QWeather) 为例(国内速度快,免费额度充足):
- 访问
dev.qweather.com(请替换为实际域名)注册账号 - 创建应用,获取
API Key(一串32位字符) - 免费版支持每日1000次调用,足够个人学习使用
注意:不要将API密钥硬编码在共享代码中,建议使用环境变量或配置文件。
核心代码分步解析
1 获取城市ID(先查后查天气)
和风天气要求通过城市名称先获取 Location ID,再查询天气。
import requests
API_KEY = "你的密钥"
def get_city_id(city_name):
url = "https://geoapi.qweather.com/v2/city/lookup" # 请替换为正确域名
params = {
"location": city_name,
"key": API_KEY
}
resp = requests.get(url, params=params)
data = resp.json()
if data["code"] == "200":
return data["location"][0]["id"]
else:
raise Exception(f"城市查询失败: {data['code']}")
2 获取实时天气数据
def get_weather(city_id):
url = "https://devapi.qweather.com/v7/weather/now" # 请替换为正确域名
params = {
"location": city_id,
"key": API_KEY
}
resp = requests.get(url, params=params)
data = resp.json()
if data["code"] == "200":
now = data["now"]
return {
"温度": now["temp"] + "°C",
"体感温度": now["feelsLike"] + "°C",
"天气": now["text"],
"风向": now["windDir"],
"风力": now["windScale"] + "级",
"湿度": now["humidity"] + "%"
}
else:
raise Exception(f"天气查询失败: {data['code']}")
3 数据格式化输出
def print_weather(weather_dict):
print("当前天气信息:")
for key, value in weather_dict.items():
print(f"{key}: {value}")
完整案例:命令行版与GUI版
1 命令行版(完整脚本)
if __name__ == "__main__":
city = input("请输入城市名称(如北京):")
try:
city_id = get_city_id(city)
weather = get_weather(city_id)
print_weather(weather)
except Exception as e:
print("错误:", e)
2 GUI版(使用Tkinter)
创建一个简单的窗口,输入城市后点击按钮显示天气。
import tkinter as tk
from tkinter import messagebox
def search_weather():
city = entry.get()
try:
city_id = get_city_id(city)
weather = get_weather(city_id)
result_text = "\n".join([f"{k}: {v}" for k, v in weather.items()])
label_result.config(text=result_text)
except Exception as e:
messagebox.showerror("错误", str(e))
root = tk.Tk()"天气查询工具")
tk.Label(root, text="输入城市:").pack()
entry = tk.Entry(root)
entry.pack()
tk.Button(root, text="查询", command=search_weather).pack()
label_result = tk.Label(root, text="", justify="left")
label_result.pack()
root.mainloop()
常见问题与避坑指南(问答Q&A)
Q1:报错 requests.exceptions.ConnectionError 怎么办?
- 检查网络连接,确认是否可访问API域名(部分公司或校园网会限制外网访问)
- 尝试更换为
https://协议,或使用verify=False参数(不推荐生产环境)
Q2:返回 {"code":"403"} 代表什么?
- API密钥无效或已达调用限额,请确认
API_KEY正确,并检查免费版每日配额是否用完。
Q3:如何查询未来7天天气?
- 将API端点从
/weather/now改为/weather/7d,返回数据结构略有不同,但解析方式一致。
Q4:可以一次查询多个城市吗?
- 不能直接批量查询,建议使用循环遍历并添加
time.sleep(1)避免触发频率限制。
Q5:如何避免API密钥泄露?
- 使用环境变量:
os.getenv("WEATHER_API_KEY") - 或将密钥写在外部
config.json文件并添加到.gitignore
优化建议与延伸学习
- 增加缓存机制:同一城市10分钟内不再重复请求API,减少浪费
- 支持更多API来源:对比OpenWeatherMap、WeatherAPI等,选择响应更快的数据源
- 添加语音播报:结合
pyttsx3库,让电脑读出天气预报 - 部署为Web服务:使用Flask搭建一个简单的天气查询REST接口,供前端调用
这个案例虽然简单,却包含了Python实战中90%的常见操作:HTTP请求、JSON解析、异常处理、用户交互,你可以将它作为起点,逐步扩展为更复杂的实用工具。
延伸阅读:如果想深挖数据可视化,可以用
matplotlib将一周温度变化绘制成折线图——这将是你的下一个Python项目。