前言

如果你是从上一篇《大一新生 × AI Coding:从游戏到记账本,我如何用DeepSeek写出第二个Python项目》过来的,那么恭喜你,你已经掌握了逻辑判断和数据持久化两项核心技能。

但说实话,前两个项目都有一个共同的“局限”——它们的数据都是自己玩自己的。猜数字的答案是自己随机生成的,记账本的数据是存在本地文件里的。它们和互联网这个巨大的数据世界,还没有产生任何连接。

我一直在想:能不能写一个程序,让它主动去互联网上“抓”数据回来?

于是,就有了这第三个实践小项目——天气查询助手。

这篇文章会记录我如何借助 DeepSeek,从零开始理解 API 的概念,并成功调用免费的天气服务,最终做出一个能查询全球城市实时天气的命令行工具。全程不超过100行代码,零基础也能看懂,代码依然复制即用。


一、项目功能说明

这个命令行天气查询助手支持以下功能:

1. 输入城市名(中英文都行),自动联网获取实时天气
2. 显示当前温度、天气状况(晴天、小雨、多云等)
3. 显示湿度和风速
4. 支持连续查询多个城市,输入 quit 退出
5. 如果城市名输错或网络不好,程序会友好提示而不是直接崩溃

运行起来的效果长这样:

☀️ 欢迎使用天气查询助手! ☀️
输入城市名即可查询实时天气。输入 'quit' 退出。

请输入您要查询的城市名 (输入 'quit' 退出程序): 北京
查询中,请稍候...

------------------------------
城市: 北京
温度: 15.3°C
天气: 局部多云
湿度: 45%
风速: 12.3 km/h
------------------------------

是不是有点像一个真正的天气 App 的命令行版本?实际上它的核心代码同样不到100行。


二、实现思路:从“本地数据”到“云端数据”

这次的项目和前两个最大的不同是:我们需要和互联网上的服务器“对话”。

这个“对话”在编程里有一个专业名词,叫 API 调用。

你可以把 API 想象成一个线上的“自动售货机”:

我们不需要知道售货机里面怎么运作,只要按照它的规则投币(发送 HTTP 请求),它就会把商品(天气数据)吐出来给我们。

整个流程是这样的:
用户输入城市名 → 程序把城市名转成经纬度(地理编码 API) → 用经纬度去问天气 API → 拿到 JSON 格式的天气数据 → 解析并友好地打印出来

这个项目做完,你就正式迈入“能写联网程序”的行列了。


三、第一步:安装 requests 库

前两个项目只用到了 Python 自带的库,但这次我们需要一个叫 requests 的第三方库来发送网络请求。

打开命令提示符(Win+R 输入 cmd),输入以下命令然后回车:

pip install requests

如果看到 Successfully installed 的字样,说明安装成功。



四、第二步:选择免费的天气 API

我一开始完全不知道去哪找天气数据,于是问 DeepSeek:

“有没有免费、不用注册、适合新手的天气 API?”

DeepSeek 推荐了 Open-Meteo,一个开源免费的天气 API。它的优点是:

- 完全免费,无需注册,无需 API 密钥
- 全球天气数据覆盖,中英文城市都支持
- 数据格式简洁,非常适合新手
这一步的启发是:AI 不仅能帮你写代码,还能帮你做技术选型。不知道怎么选工具的时候,直接问它就行。


五、第三步:创建项目文件

和前两次一样,我们需要新建一个 .py 文件。

1. 在桌面右键 → 新建 → 文本文档
2. 确保能看到文件扩展名(如果看不到 .txt,打开任意文件夹 → 顶部“查看” → 勾选“文件扩展名”)
3. 把 新建文本文档.txt 重命名为 weather_helper.py

注意:后缀一定要从 .txt 变成 .py,系统提示“改变扩展名可能导致文件不可用”,点“是”就行。


六、第四步:向 DeepSeek 提问,生成初版代码

打开 DeepSeek,选择专家模式,把下面这段话复制进去:

我想用 Python 写一个命令行天气查询程序,使用 Open-Meteo API,用户输入城市名,程序输出当前温度、天气描述、湿度和风速。代码要附带详细注释,适合大一新生阅读。

DeepSeek 会返回一段完整的代码。全选复制,然后右键 weather_helper.py → 打开方式 → 记事本,把代码粘贴进去,Ctrl+S 保存。
七、第五步:运行演示

在桌面空白处按住 Shift 键,点击鼠标右键,选择“在此处打开 PowerShell 窗口”,输入:

python weather_helper.py (城市名)

比如,python weather_helper.py wuhan

八、第六步:运行并调试——和 DeepSeek 协作优化

我满怀期待地运行了 python weather_helper.py,输入“北京”,结果……

程序确实返回了数据,但有两个问题:
1. 有时候输入中文城市名查不到。
2. 输出的天气是数字代码(比如 0、61),完全看不懂什么意思。


于是我把问题描述给 DeepSeek:

中文城市名有时候查不到,而且天气显示的是数字代码,能不能优化一下?

DeepSeek 立刻给出了改进方案:
1. 增加一个地理编码 API 调用,先把城市名转成经纬度,再用经纬度去查天气。这样准确率大大提高。
2. 添加一个 weather_map 字典,把天气代码映射成中文描述(“晴天”、“小雨”、“多云”等)。

我把新代码替换进去,再运行,完美!

整个过程中,我基本就是:
复制 → 运行 → 发现问题 → 把问题丢给 DeepSeek → 复制新代码 → 再运行

循环了两三次,程序就完全符合预期了。这种“AI 帮你 debug”的体验,比一个人对着报错信息干瞪眼舒服太多了。


九、第七步:完整代码(复制即用)

以下是经过我亲测、可直接运行的完整代码。你可以新建一个 Python 文件,比如 weather_helper.py,把下面的内容全部复制进去。

(下面这段是代码,粘贴到 CSDN 后,请用鼠标选中它,然后点击编辑器工具栏上的「代码块」按钮,选择 Python 语言)

import requests

def get_weather_description(weather_code):
    """根据Open-Meteo的WMO天气代码返回简单描述"""
    weather_map = {
        0: "晴天", 1: "晴朗", 2: "局部多云", 3: "多云",
        45: "有雾", 48: "有雾", 51: "小雨", 53: "中雨", 55: "中雨",
        61: "小雨", 63: "中雨", 65: "大雨", 71: "小雪", 73: "中雪",
        75: "中雪", 80: "阵雨", 81: "阵雨", 82: "大雨", 85: "阵雪",
        95: "雷暴", 96: "雷暴", 99: "雷暴"
    }
    return weather_map.get(weather_code, "未知")

def fetch_weather(city_name):
    """
    根据城市名获取天气数据,并返回一个包含关键信息的字典
    """
    # 1. 获取地理坐标
    geo_url = f"https://geocoding-api.open-meteo.com/v1/search?name={city_name}"
    
    try:
        geo_response = requests.get(geo_url, timeout=10)
        geo_response.raise_for_status()
        
        geo_data = geo_response.json()
        if not geo_data.get("results"):
            print(f"❌ 错误:未找到名为 '{city_name}' 的城市。")
            return None
            
        location = geo_data["results"][0]
        latitude = location["latitude"]
        longitude = location["longitude"]
        full_city_name = location["name"] + (", " + location["admin1"] if "admin1" in location else "")

    except requests.exceptions.RequestException as e:
        print(f"❌ 网络请求失败,获取坐标时出错: {e}")
        return None
    except Exception as e:
        print(f"❌ 解析坐标数据时出错: {e}")
        return None

    # 2. 获取天气数据
    weather_url = f"https://api.open-meteo.com/v1/forecast"
    params = {
        "latitude": latitude,
        "longitude": longitude,
        "current_weather": "true",
        "hourly": "relativehumidity_2m",
    }

    try:
        weather_response = requests.get(weather_url, params=params, timeout=10)
        weather_response.raise_for_status()
        
        weather_data = weather_response.json()
        current_weather = weather_data["current_weather"]
        
        temperature = current_weather["temperature"]
        wind_speed = current_weather["windspeed"]
        weather_code = current_weather["weathercode"]
        
        # 从hourly数据中提取当前湿度 (取第一个值作为近似)
        humidity = weather_data["hourly"]["relativehumidity_2m"][0]

        weather_description = get_weather_description(weather_code)

        return {
            "city": full_city_name,
            "temperature": temperature,
            "description": weather_description,
            "humidity": humidity,
            "wind_speed": wind_speed
        }

    except requests.exceptions.RequestException as e:
        print(f"❌ 网络请求失败,获取天气时出错: {e}")
        return None
    except KeyError as e:
        print(f"❌ 解析天气数据时出错,缺少字段: {e}")
        return None
    except Exception as e:
        print(f"❌ 发生未知错误: {e}")
        return None

def main():
    """主程序,负责用户交互和流程控制"""
    print("☀️ 欢迎使用天气查询助手! ☀️")
    print("输入城市名即可查询实时天气。输入 'quit' 退出。")

    while True:
        city_input = input("\n请输入您要查询的城市名 (输入 'quit' 退出程序): ").strip()
        
        if city_input.lower() == 'quit':
            print("感谢使用,再见!")
            break
            
        if not city_input:
            print("❌ 城市名不能为空,请重新输入。")
            continue
            
        print("查询中,请稍候...")
        weather_info = fetch_weather(city_input)
        
        if weather_info:
            print("\n" + "-" * 30)
            print(f"城市: {weather_info['city']}")
            print(f"温度: {weather_info['temperature']}°C")
            print(f"天气: {weather_info['description']}")
            print(f"湿度: {weather_info['humidity']}%")
            print(f"风速: {weather_info['wind_speed']} km/h")
            print("-" * 30)

if __name__ == "__main__":
    main()

(代码块结束)


十、第八步:运行演示

在桌面空白处按住 Shift 键,点击鼠标右键,选择“在此处打开 PowerShell 窗口”,输入:

python weather_helper.py

程序启动后,我测试了几个城市:

- 输入“北京” → 显示北京天气
- 输入“上海” → 显示上海天气
- 输入“london” → 显示伦敦天气(支持英文)
- 输入一个不存在的城市名“abc” → 友好提示“未找到名为 'abc' 的城市”
- 输入 quit → 退出程序

所有功能都正常!而且每次查询都是实时的,数据来自互联网,不是写死在代码里的。


十一、我学到了什么

这个项目做完,我的技能树又点亮了好几个新节点:

- API 概念:理解了什么是 API,以及如何用 Python 调用它
- requests 库:会发送 GET 请求,会处理响应
- JSON 数据解析:知道怎么从一大坨返回数据里提取我想要的那几个字段
- 异常处理:用 try...except 让程序在网络出问题时不会直接崩溃
- 真实世界的编程思维:程序的数据不一定都在本地,互联网上到处是可以调用的“数据接口”

更重要的是,我开始意识到编程的边界比我想象的要大得多。只要会调用 API,我就能获取天气、汇率、新闻、电影信息……能做的东西一下子多了几百倍。


十二、三个项目复盘:我走过的路

项目              核心技能                        数据来源        代码行数
猜数字游戏        变量、循环、条件判断            程序内部生成    ~50行
命令行记账本      列表、字典、文件读写、JSON      本地文件        ~100行
天气查询助手      网络请求、API调用、JSON解析     互联网          ~100行

这三个项目做下来,我发现自己已经从“对着黑框框发怵”变成“敢写、敢跑、敢改”的状态了。

AI Coding 对我来说,不是偷懒,而是让我能跳过那些让人劝退的语法细节,直接去理解“程序是怎么解决问题的”。


十三、下一步计划

三个命令行小项目做完,我打算挑战一个有图形界面的程序。

Python 自带一个叫 tkinter 的库,可以做出窗口、按钮、输入框。我打算用它给记账本加一个真正的窗口界面,或者做一个简单的计算器。

等做出来了,我会继续写成第四篇博客。这个系列会一直更新下去,记录我从零开始学编程的每一步。

如果你也照着这篇教程做出了天气查询助手,欢迎在评论区告诉我!遇到了什么问题也可以留言,我们一起讨论。


附录:常见问题排查

Q1:运行时报错 ModuleNotFoundError: No module named 'requests'
A1:说明 requests 库没装上。重新在命令行执行 pip install requests 即可。

Q2:输入中文城市名查不到?
A2:Open-Meteo 的地理编码 API 对部分中文城市名支持不够完善,可以尝试输入拼音(比如 beijing)或英文名。

Q3:程序能查未来几天的天气吗?
A3:Open-Meteo 支持天气预报,但代码需要修改。你可以问 DeepSeek:“请在上面的天气查询代码中增加一个功能:显示未来3天的天气预报。”


本文代码由 DeepSeek 生成,作者已实际运行验证。

AI 声明:
本文由 DeepSeek 辅助生成代码和部分文案,所有步骤均经过本人实际操作验证。
————————————————
版权声明:本文为CSDN博主「qinrunlin」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qinrunlin/article/details/(发布后会生成)
Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐