小沐:戈戈,最近我出门总是被突如其来的雨淋湿,你说古人是怎么预测天气的呀?
戈戈:哈哈,古人靠观云识天气,"朝霞不出门,晚霞行千里"就是老祖宗留下的经验。

小沐:那现在我们有没有更靠谱的方式?每次打开天气 APP 都感觉背后一定有什么神秘的力量在支撑!
戈戈:当然有!今天就来聊聊 OpenWeatherMap——一个让你用代码"呼风唤雨"的天气 API,Python、Node.js、Vue 都能玩!

1、认识 OpenWeatherMap
天气预报对我们的日常生活至关重要——它帮助我们决定今天该不该带伞、周末适不适合爬山。而在软件开发领域,天气数据同样是许多应用的核心需求,从出行 APP 到智能农业系统,背后都少不了一个稳定的天气数据源。
imageOpenWeatherMap 正是这样一位"幕后英雄"。它通过全球气象站网络、卫星和雷达,收集并处理来自世界各地的实时天气数据,以 JSON、XML 或 HTML 格式开放给开发者调用。无论是当前温度、湿度、风速、降水量,还是历史归档数据和未来预报,都可以通过简单的 HTTP 请求获取。
image1.1 费用与注册
OpenWeatherMap 提供免费和付费两种套餐,免费版按60次/分钟限流,月调用量约26万次,该额度足够个人项目和小型应用使用。 注册地址:
https://home.openweathermap.org/users/sign_in
image注册并登录后,在「API Keys」页面生成你的专属密钥(appid),后续所有接口调用都需要携带它。
2、核心接口一览
OpenWeatherMap 提供了多个系列的接口,覆盖从"现在"到"40年前"的完整气象数据链路。
2.1 One Call 3.0(全能版)
这是最强大的接口,一次调用即可获得:
https://api.openweathermap.org/data/2.5/onecall?lat={lat}&lon={lon}&appid={API key}
2.2 Current Weather(实时天气)
每 10 分钟更新一次,支持城市名称或经纬度查询,是最常用的基础接口:
# 按城市名查询(JSON格式)https://api.openweathermap.org/data/2.5/weather?q=Beijing&appid={API key}# 按经纬度查询https://api.openweathermap.org/data/2.5/weather?lat=39.92&lon=116.38&appid={API key}
常用参数说明:
2.3 历史天气与地图图层
历史数据接口支持按小时粒度查询 40 余年的气象档案;天气地图接口则提供 15 种可视化图层,包含降水、云量、温度等,非常适合做数据大屏。
# 历史天气查询https://history.openweathermap.org/data/2.5/history/city?lat={lat}&lon={lon}&type=hour&start={start}&cnt={cnt}&appid={API key}# 空气质量http://api.openweathermap.org/data/2.5/air_pollution?lat={lat}&lon={lon}&appid={API key}
3、实战演练:多语言接入示例
理论讲完了,程序员最爱的还是"跑起来"。下面用三种语言分别演示如何接入当前天气数据。
3.1 Python + Flask:构建天气查询服务
安装依赖:
pip install flask requests
下面我们用 Flask 搭建一个简单的天气查询 HTTP 服务,访问 /weather 路由即可返回北京的当前天气:
from flask import Flask, requestimport requestsapp = Flask(__name__)API_KEY = "你的API Key" # 替换成你的密钥API_URL = "https://api.openweathermap.org/data/2.5/weather"# 首页:查询表单@app.route('/')def index(): return ''' <h3>天气查询</h3> <form action="/weather"> 城市(英文):<input name="city" value="Beijing"> <button>查询</button> </form> '''# 查询天气@app.route('/weather')def weather(): city = request.args.get('city') res = requests.get(API_URL, params={ "q": city, "appid": API_KEY, "units": "metric", "lang": "zh_cn" }) if res.status_code != 200: return "查询失败" d = res.json() return f""" <h4>{d['name']}</h4> <p>温度:{d['main']['temp']}℃</p> <p>天气:{d['weather'][0]['description']}</p> <p>湿度:{d['main']['humidity']}%</p> <p>风速:{d['wind']['speed']}m/s</p> <br><a href="/">返回</a> """# JSON API 接口@app.route('/api')def api(): return requests.get(API_URL, params={ "q": request.args.get('city', 'Beijing'), "appid": API_KEY, "units": "metric" }).json()if __name__ == '__main__': app.run(debug=True)
代码运行结果如下:
image启动服务后,浏览器访问 http://127.0.0.1:5000/weather,即可看到返回的 JSON 格式天气数据,包含温度(单位:°C)和天气描述。
image
4、Python 专属神器:PyOWM
如果你主要用 Python 开发,还有一个更"面向对象"的选择——PyOWM,一个专为 OpenWeatherMap 打造的 Python 客户端库。它把底层 HTTP 请求封装为直观的对象操作,几行代码就能拿到结构化的天气数据。
安装:
image使用示例:
import pyowm# 初始化客户端,传入 API Keyowm = pyowm.OWM('your_api_key')mgr = owm.weather_manager()# 查询北京当前天气observation = mgr.weather_at_place('beijing, CN')w = observation.weather# 获取摄氏度温度字典(包含最高、最低、体感温度等)print(w.temperature('celsius'))print(w.detailed_status) # 天气描述,如 "light rain"
代码运行结果如下:
imagePyOWM 支持 Python 3.7+,除了基础天气查询,还封装了空气污染、UV 指数、气象站管理等高级接口,是 Python 开发者接入气象数据的首选工具。
5、其他天气 API 横向对比
除了 OpenWeatherMap,市面上还有不少优秀的天气数据服务,各有侧重:
| | |
|---|
| OpenWeatherMap | | 全球覆盖广,分钟级预报,历史数据丰富,支持多语言,适配全球项目 |
| 高德天气 API | | 国内城市定位精准,接口调用简单,文档清晰,适合国内基础天气需求 |
| 和风天气(QWeather) | | 含空气质量、生活指数、气象预警,文档友好,国内城市适配度高 |
| 心知天气(Seniverse) | | |
| AccuWeather | | 全球权威气象服务商,预报精度高,支持分钟级降水预报,适合对精度要求高的场景 |
对于国内项目,高德天气和和风天气在延迟和精准度上更有优势;面向全球用户的应用,OpenWeatherMap 和 AccuWeather 则是不二之选。

小沐:原来天气 APP 背后是这么运转的!以后再被雨淋,我就自己写个预警程序!
戈戈:哈哈,学以致用才是正道。不过记得先申请好 API Key,别让"晴天霹雳"打了你个措手不及。

结语
如果您觉得这些文字有一点点用处,请给作者点个赞或关个注;╮( ̄▽ ̄)╭
如果您有技术问题探讨,评论处留言。//(ㄒoㄒ)//
谢谢各位童鞋们啦( ´ ▽ ` )ノ ( ´ ▽ `` )っ!
更多精彩文章详见:
CSDN博客:爱看书的小沐
微信公众号:杨小羊爱阅读