Python实战:20分钟搭建免费天气仪表盘

发布时间:2026/7/21 22:26:12

Python实战:20分钟搭建免费天气仪表盘 1. 项目概述用Python快速打造天气仪表盘最近在帮朋友做一个小工具时发现用Python搭建天气仪表盘的需求其实很普遍。无论是个人出行规划、农业种植参考还是简单的数据可视化练习一个直观的天气仪表盘都能派上用场。这个项目最吸引人的地方在于完全免费、代码简洁、20分钟就能跑起来特别适合Python新手作为第一个实战项目。我选择的方案是基于requests获取天气数据用matplotlib和pygal做可视化最后通过Flask搭建本地网页展示。整个过程不需要注册任何付费API所有工具都是Python生态里的主流库环境配置也非常简单。下面我就把这个项目的完整实现过程拆解给大家包括几个关键技巧和容易踩的坑。2. 环境准备与工具选型2.1 基础环境配置首先确保你的电脑已经安装Python 3.6版本。推荐使用Miniconda管理环境比Anaconda更轻量conda create -n weather python3.8 conda activate weather注意如果遇到conda命令不可用的情况需要先将conda添加到系统环境变量。Windows用户可以在Anaconda Prompt中执行conda initLinux/Mac用户需要在~/.bashrc中添加export PATH~/miniconda3/bin:$PATH2.2 必需库安装这几个库是我们项目的核心依赖pip install requests matplotlib pygal flaskrequests用于获取天气API数据比urllib更友好matplotlib绘制温度曲线图行业标准可视化库pygal生成SVG格式的交互式图表适合网页展示flask轻量级Web框架比Django更简单2.3 开发工具建议虽然可以用任何文本编辑器写Python代码但我强烈推荐VS Code安装Python扩展后智能提示很好用PyCharm Community专业Python IDE免费版足够用Jupyter Notebook适合分步调试可视化效果3. 天气数据获取实战3.1 免费API选择经过对比测试我推荐这两个免费天气APIOpen-Meteo无需API key直接请求即可import requests def get_weather(latitude39.9, longitude116.4): url fhttps://api.open-meteo.com/v1/forecast?latitude{latitude}longitude{longitude}dailytemperature_2m_max,temperature_2m_min,precipitation_sumtimezoneauto response requests.get(url) return response.json()WeatherAPI免费套餐足够用需注册获取keydef get_weather_alternative(cityBeijing): url fhttp://api.weatherapi.com/v1/forecast.json?keyYOUR_KEYq{city}days5 response requests.get(url) return response.json()关键技巧在开发阶段可以先把API响应保存为JSON文件避免频繁请求被限制import json with open(weather_data.json, w) as f: json.dump(response.json(), f)3.2 数据清洗与格式化原始API数据需要处理后才能用于可视化def process_data(raw_data): days raw_data[daily][time] max_temps raw_data[daily][temperature_2m_max] min_temps raw_data[daily][temperature_2m_min] return { days: [d.split(-)[-1] for d in days], # 只保留日期 max_temps: max_temps, min_temps: min_temps, precipitation: raw_data[daily][precipitation_sum] }4. 可视化图表实现4.1 温度曲线图Matplotlibimport matplotlib.pyplot as plt def create_temp_chart(data): plt.figure(figsize(10, 5)) plt.plot(data[days], data[max_temps], r-, label最高温) plt.plot(data[days], data[min_temps], b-, label最低温) plt.fill_between(data[days], data[min_temps], data[max_temps], colororange, alpha0.1) plt.title(5日温度趋势, fontpropertiesSimHei) plt.xlabel(日期) plt.ylabel(温度(℃)) plt.legend() plt.grid(True) plt.savefig(static/temp_chart.png) # 保存为图片供网页使用4.2 降水概率图Pygalimport pygal def create_precip_chart(data): bar_chart pygal.Bar() bar_chart.title 5日降水量 (mm) bar_chart.x_labels data[days] bar_chart.add(降水量, data[precipitation]) bar_chart.render_to_file(static/precip_chart.svg)5. Flask网页集成5.1 基础网页结构创建templates/dashboard.html!DOCTYPE html html head title天气仪表盘/title style .chart-container { display: flex; } .chart { margin: 20px; } /style /head body h15日天气预报/h1 div classchart-container div classchart img src{{ url_for(static, filenametemp_chart.png) }} /div div classchart embed typeimage/svgxml src{{ url_for(static, filenameprecip_chart.svg) }}/ /div /div /body /html5.2 Flask主程序app.py核心代码from flask import Flask, render_template import os app Flask(__name__) app.route(/) def dashboard(): # 确保static目录存在 if not os.path.exists(static): os.makedirs(static) weather_data get_weather() processed_data process_data(weather_data) create_temp_chart(processed_data) create_precip_chart(processed_data) return render_template(dashboard.html) if __name__ __main__: app.run(debugTrue)6. 项目优化与扩展6.1 自动刷新实现让仪表盘每小时自动更新数据from apscheduler.schedulers.background import BackgroundScheduler def update_charts(): weather_data get_weather() processed_data process_data(weather_data) create_temp_chart(processed_data) create_precip_chart(processed_data) scheduler BackgroundScheduler() scheduler.add_job(update_charts, interval, hours1) scheduler.start()6.2 多城市支持修改路由支持城市参数app.route(/city) def city_dashboard(city): weather_data get_weather_by_city(city) processed_data process_data(weather_data) ...6.3 部署到云服务器用GunicornNginx部署pip install gunicorn gunicorn -w 4 -b 0.0.0.0:8000 app:app7. 常见问题解决中文显示乱码下载SimHei字体放到matplotlib字体目录在代码中添加plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] FalseAPI请求限制添加延时避免频繁请求import time time.sleep(1) # 每次请求间隔1秒图表不更新浏览器缓存问题可以强制刷新CtrlF5或者在图片URL后添加时间戳img src/static/temp_chart.png?t{{ timestamp }}这个项目虽然简单但涵盖了Python开发的完整流程数据获取、处理、可视化和Web展示。我在实际开发中发现用pygal生成的SVG图表在移动端显示效果特别好而matplotlib则更适合需要精细控制的场景。如果想让仪表盘更美观可以尝试用Bootstrap美化网页界面或者用Plotly替代matplotlib实现交互式图表。

相关新闻