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

📅 2026/7/20 16:09:09 👁️ 阅读次数 📝 编程学习
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 python=3.8 conda activate weather

注意:如果遇到conda命令不可用的情况,需要先将conda添加到系统环境变量。Windows用户可以在Anaconda Prompt中执行conda init,Linux/Mac用户需要在~/.bashrc中添加export PATH="~/miniconda3/bin:$PATH"

2.2 必需库安装

这几个库是我们项目的核心依赖:

pip install requests matplotlib pygal flask
  • requests:用于获取天气API数据(比urllib更友好)
  • matplotlib:绘制温度曲线图(行业标准可视化库)
  • pygal:生成SVG格式的交互式图表(适合网页展示)
  • flask:轻量级Web框架(比Django更简单)

2.3 开发工具建议

虽然可以用任何文本编辑器写Python代码,但我强烈推荐:

  1. VS Code:安装Python扩展后智能提示很好用
  2. PyCharm Community:专业Python IDE,免费版足够用
  3. Jupyter Notebook:适合分步调试可视化效果

3. 天气数据获取实战

3.1 免费API选择

经过对比测试,我推荐这两个免费天气API:

  1. Open-Meteo:无需API key,直接请求即可
    import requests def get_weather(latitude=39.9, longitude=116.4): url = f"https://api.open-meteo.com/v1/forecast?latitude={latitude}&longitude={longitude}&daily=temperature_2m_max,temperature_2m_min,precipitation_sum&timezone=auto" response = requests.get(url) return response.json()
  2. WeatherAPI:免费套餐足够用(需注册获取key)
    def get_weather_alternative(city="Beijing"): url = f"http://api.weatherapi.com/v1/forecast.json?key=YOUR_KEY&q={city}&days=5" 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 温度曲线图(Matplotlib)

import 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'], color='orange', alpha=0.1) plt.title('5日温度趋势', fontproperties='SimHei') plt.xlabel('日期') plt.ylabel('温度(℃)') plt.legend() plt.grid(True) plt.savefig('static/temp_chart.png') # 保存为图片供网页使用

4.2 降水概率图(Pygal)

import 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> <h1>5日天气预报</h1> <div class="chart-container"> <div class="chart"> <img src="{{ url_for('static', filename='temp_chart.png') }}"> </div> <div class="chart"> <embed type="image/svg+xml" src="{{ url_for('static', filename='precip_chart.svg') }}"/> </div> </div> </body> </html>

5.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(debug=True)

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', hours=1) 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 部署到云服务器

用Gunicorn+Nginx部署:

pip install gunicorn gunicorn -w 4 -b 0.0.0.0:8000 app:app

7. 常见问题解决

  1. 中文显示乱码

    • 下载SimHei字体放到matplotlib字体目录
    • 在代码中添加:
      plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False
  2. API请求限制

    • 添加延时避免频繁请求
    import time time.sleep(1) # 每次请求间隔1秒
  3. 图表不更新

    • 浏览器缓存问题,可以强制刷新(Ctrl+F5)
    • 或者在图片URL后添加时间戳:
    <img src="/static/temp_chart.png?t={{ timestamp }}">

这个项目虽然简单,但涵盖了Python开发的完整流程:数据获取、处理、可视化和Web展示。我在实际开发中发现,用pygal生成的SVG图表在移动端显示效果特别好,而matplotlib则更适合需要精细控制的场景。如果想让仪表盘更美观,可以尝试用Bootstrap美化网页界面,或者用Plotly替代matplotlib实现交互式图表。