【复制粘贴即可运行】用Python和API制作天气预报CLI应用!给初学者的保姆级分步教程
“我开始学编程了,但不知道该做什么…” “我正在学习,但因为做不出能实际运行的东西,感觉快要放弃了…”
就在几个月前,我也抱着完全相同的烦恼。我从编程知识为零开始,借助AI的力量自学,现在已经能运营网站了。但在学习初期,我感到最重要的事情就是“亲手创造并运行一些东西的体验”。
在本文中,我将比任何地方都更详细地解释如何使用Python制作一个能告诉你天气预报的简单命令行(CLI)应用程序,以便编程初学者能够体验到“它动了!真好玩!”的感觉。
完成后的效果是这样的。在终端(黑色屏幕)中输入命令后……?
$ python weather.py 东京
[ 东京 (JP) 的天气 ]
天气: 晴 ☀️
气温: 28.5℃ (体感温度: 29.1℃)
湿度: 65%
风速: 3.1 m/s
一点都不难!只需复制粘贴,它就能立刻在你的电脑上运行。我也会坦誠地分享我实际遇到的问题,所以请放心地跟着我做。
第 1 步:准备开始冒险! - 获取天气API密钥
首先,我们从哪里获取天气信息呢?我们在电视或智能手机上看到的天气预报,其数据来源也是气象局等专业机构观测得来的,对吧?
这次,我们将使用一个名为OpenWeatherMap的服务。利用该服务提供的API机制,我们就可以在程序中自由获取世界各地的天气数据。
不必把“API是什么?”想得太复杂。现在,你只需把它看作是“从程序获取天气数据的暗号(密钥)”之类的东西。下面我来解释获取这个密钥(API Key)的步骤。
- 访问OpenWeatherMap的API页面,点击“Current Weather Data”下的“Subscribe”按钮。
- 在免费计划中点击“Get API key”按钮,然后创建一个账户(设置你的邮箱地址和密码等)。
- 注册完成后,你的专用API密钥就会出现在仪表盘的“API keys”标签页中。这个由大约32位字母和数字组成的字符串就是我前面提到的“暗号”。
【非常重要】绝对不要将你的API密钥告诉他人,或在社交网络、GitHub等地方公开!
这个密钥是你专用的。如果被怀有恶意的人知道,他们可能会进行大量的恶意访问,导致你被收取费用。请像保管自家钥匙一样,严格管理它。
第 2 步:准备必要的工具! - `requests`库
拿到API密钥后,下一步是准备一个能让Python使用API的工具。这个工具就是`requests`库。
库就像一个预装了各种便利功能的“工具箱”。使用`requests`,只需几行代码就能访问网站和API。
请打开你电脑的终端(Windows上是命令提示符或PowerShell,Mac上是终端),然后运行以下命令。
pip install requests
如果看到`Successfully installed...`之类的消息,就表示成功了。现在,与天气API通信的准备工作已经完成!
第 3 步:先来个简单的尝试!
终于到了编码的时候了。首先,我们来写一段非常非常简单的代码,获取特定城市(这里是东京)的天气。请在你的编辑器中创建一个名为`weather.py`的文件,然后粘贴以下代码。
import requests
import json
# 请替换为在第1步中获取的你的API密钥
API_KEY = "在此处粘贴你的API密钥"
CITY_NAME = "Tokyo"
# 构建API请求URL
api_url = f"https://api.openweathermap.org/data/2.5/weather?q={CITY_NAME}&appid={API_KEY}&units=metric&lang=zh_cn"
try:
# 实际向API发送请求
response = requests.get(api_url)
response.raise_for_status() # 如果有错误,则抛出异常
# 将结果从JSON格式转换为Python的字典类型
data = response.json()
# 以易于阅读的方式显示数据
print(json.dumps(data, indent=2, ensure_ascii=False))
except requests.exceptions.RequestException as e:
print(f"发生了通信错误: {e}")
except Exception as e:
print(f"发生了意外错误: {e}")
粘贴代码后,别忘了将`API_KEY = "在此处粘贴你的API密钥"`这部分替换成你刚刚获取的自己的API密钥哦。
替换完成后,让我们在终端中运行这个文件吧。
$ python weather.py
怎么样?如果显示了下面这样大量的文字(数据),就表示成功了!
{
"coord": {
"lon": 139.6917,
"lat": 35.6895
},
"weather": [
{
"id": 800,
"main": "Clear",
"description": "晴",
"icon": "01d"
}
],
"base": "stations",
"main": {
"temp": 28.5,
"feels_like": 29.1,
"temp_min": 27.21,
"temp_max": 29.58,
"pressure": 1012,
"humidity": 65
},
"visibility": 10000,
"wind": {
"speed": 3.09,
"deg": 190
},
// ...后面还有很多
}
这就是从OpenWeatherMap发来的“东京当前天气数据”的原始状态。下一步就是从这种名为JSON的数据格式中提取出我们需要的信息。
【难点解析】如何读取JSON数据
JSON由`{}`(花括号)和`[]`(方括号)组合而成。
- `{}`: 表示一个字典(对象)。它是由“键”和“值”组成的对。例如,`"temp": 28.5`表示“名为'temp'的键对应的值是28.5”。
- `[]`: 表示一个列表(数组)。它包含了按顺序排列的多个数据。
第 4 步:来一次真正的应用改造!
好了,从这里开始才是重头戏。我们不再是每次都修改代码,而是让用户能够输入城市名称,并以清晰的方式显示所需信息,让它进化成一个像样的CLI应用。
这次,为了制作一个更正式的CLI应用,我们将使用Python的标准库`argparse`。使用它,你就可以在运行时传递信息,例如`python weather.py Beijing`。
请用以下内容完全替换`weather.py`文件。API密钥的管理方式也改为了更安全的形式。
import requests
import argparse
import os
def get_weather_emoji(weather_main):
"""根据天气英文名返回表情符号"""
if weather_main == "Clear":
return "☀️"
elif weather_main == "Clouds":
return "☁️"
elif weather_main == "Rain":
return "🌧️"
elif weather_main == "Drizzle":
return "🌦️"
elif weather_main == "Thunderstorm":
return "⛈️"
elif weather_main == "Snow":
return "❄️"
else:
return "🌫️" # Mist, Smoke, Haze, Dust, Fog, Sand, Ash, Squall, Tornado
def format_weather_data(data):
"""格式化API响应并以字符串形式返回"""
try:
city_name = data["name"]
country = data["sys"]["country"]
weather_description = data["weather"][0]["description"]
weather_main = data["weather"][0]["main"]
emoji = get_weather_emoji(weather_main)
temp = data["main"]["temp"]
feels_like = data["main"]["feels_like"]
humidity = data["main"]["humidity"]
wind_speed = data["wind"]["speed"]
# 构建易于阅读的输出字符串
output = f"[ {city_name} ({country}) 的天气 ]\n"
output += f"天气: {weather_description} {emoji}\n"
output += f"气温: {temp}°C (体感温度: {feels_like}°C)\n"
output += f"湿度: {humidity}%\n"
output += f"风速: {wind_speed} m/s"
return output
except KeyError:
return "解析天气数据失败。响应格式可能无效。"
def main():
# 1. 从环境变量获取API密钥
# 为了更安全地管理密钥
api_key = os.getenv("OPENWEATHERMAP_API_KEY")
if not api_key:
print("错误:环境变量 'OPENWEATHERMAP_API_KEY' 未设置。")
print("请先设置API密钥再重新运行。")
return # 退出程序
# 2. 设置命令行参数
parser = argparse.ArgumentParser(description="显示指定城市的当前天气信息。")
parser.add_argument("city", help="希望获取天气信息的城市名称 (例如: Beijing)")
parser.add_argument("-u", "--units", choices=["metric", "imperial"], default="metric",
help="指定温度单位 ('metric' 代表摄氏度, 'imperial' 代表华氏度)")
args = parser.parse_args()
# 3. 向API发送请求
base_url = "https://api.openweathermap.org/data/2.5/weather"
params = {
"q": args.city,
"appid": api_key,
"units": args.units,
"lang": "zh_cn"
}
try:
response = requests.get(base_url, params=params)
# 如果返回4xx, 5xx错误码,则抛出异常
response.raise_for_status()
weather_data = response.json()
# 4. 显示结果
formatted_output = format_weather_data(weather_data)
print(formatted_output)
except requests.exceptions.HTTPError as e:
if e.response.status_code == 401:
print("错误:API密钥无效。请检查是否设置了正确的API密钥。")
elif e.response.status_code == 404:
print(f"错误:找不到城市 '{args.city}'。请检查城市名称。")
else:
print(f"发生了HTTP错误: {e}")
except requests.exceptions.RequestException as e:
print(f"发生了通信错误: {e}")
except Exception as e:
print(f"发生了意外错误: {e}")
if __name__ == "__main__":
main()
【重要】安全设置API密钥的方法(环境变量)
我之前提到,直接在代码中写入API密钥是危险的。因此,我们将使用专业开发中也常用的“环境变量”机制。这是一种让你自己的电脑记住API密钥的方法。
对于 Mac / Linux:
export OPENWEATHERMAP_API_KEY="你的API密钥"
对于 Windows (命令提示符):
set OPENWEATHERMAP_API_KEY="你的API密钥"
对于 Windows (PowerShell):
$Env:OPENWEATHERMAP_API_KEY="你的API密钥"
请在你的终端中运行上述命令(关闭终端后设置会重置)。这样,代码`os.getenv("OPENWEATHERMAP_API_KEY")`就能读取到你在电脑中设置的密钥了。
准备好后,我们来运行一下吧!
$ python weather.py Shanghai
上海的天气是不是完美地显示出来了?
接下来,我们来尝试用华氏度(Fahrenheit)显示北京的天气。
$ python weather.py Beijing -u imperial
如果城市名称包含空格,别忘了用`"`(双引号)括起来哦。如果温度以华氏度(°F)显示,就表示成功了!
你也可以故意输入一个错误的城市名称,或者设置一个错误的API密钥,看看错误信息是否能正确显示。这就是“健壮的错误处理”。
总结:超越“它动了!”的下一步
辛苦了!现在,你专属的原创天气预报CLI应用就完成了。除了简单地复制粘贴代码,你还应该学到了以下几点:
- 使用API从外部获取数据的方法 (`requests`)
- 处理JSON数据格式的方法
- 安全管理API密钥的方法(环境变量)
- 制作正式CLI应用参数的方法 (`argparse`)
- 编写一个遇到错误也不会崩溃的友好程序的方法 (`try-except`)
- 使用函数来整理代码的方法
在编程学习中,积累这些“小小的成功体验”至关重要。以今天制作的这个应用为基础,不断用你自己的想法去改造它吧,比如“下次尝试同时显示多个城市的天气”、“增加每小时的预报”、“把结果通知到微信”等等。
让“创造能动的东西的乐趣”成为你的燃料,继续在编程世界中冒险吧!