Python案例如何实现天气查询?

wen python案例 3

Python案例实战:如何实现天气查询?一文掌握API调用与数据解析

目录导读

  • 为什么用Python实现天气查询?

    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) 为例(国内速度快,免费额度充足):

  1. 访问 dev.qweather.com(请替换为实际域名)注册账号
  2. 创建应用,获取 API Key(一串32位字符)
  3. 免费版支持每日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项目。

抱歉,评论功能暂时关闭!