基于Python的天气数据分析与可视化系统(附源码获取链接)
📌 引言
随着气候变化日益受到关注,对历史天气数据的分析和未来趋势的预测变得尤为重要。本次分享一个基于 Django 的 天气数据分析与可视化系统,实现了从数据采集、存储、分析到可视化展示和预测的全流程功能。
🏗️ 一、系统概述
本项目是一个完整的 Web端天气数据分析平台,主要功能包括:
- ✅ 多城市历史天气数据自动爬取
- ✅ 用户注册/登录与数据管理
- ✅ 温度、风力、空气质量等多维度数据可视化
- ✅ 天气词云展示
- ✅ 基于机器学习的天气趋势预测
- ✅ 支持MySQL数据库与定时任务更新
项目采用 前后端分离 + MVC架构,后端使用 Django 框架,前端基于 Bootstrap + Morris Chart + jQuery 实现响应式交互界面。
🧩 二、系统架构设计
[用户浏览器] ↓ HTTP请求 [Django Web Server] ↓ 路由分发 → View → Model → DB [MySQL/SQLite] ↑ 数据存储 [Spiders] ← 定时任务 ← Python爬虫 ← 天气网站 ↓ [Pandas] → 数据清洗 → [Scikit-learn] → 预测模型 ↓ [前端图表] ← JSON API ← View📌 架构特点:数据采集与业务逻辑解耦可扩展性强,支持多城市、多指标支持开发(SQLite)与生产(MySQL)环境切换
⚙️ 三、技术栈详解
| 类别 | 技术 |
|---|---|
| 后端 | Python 3.8+, Django 3.1.14, MySQL, SQLite |
| 爬虫 | requests, lxml |
| 数据处理 | pandas, numpy |
| 机器学习 | scikit-learn(线性回归、随机森林) |
| 前端 | Bootstrap 4, Morris Chart, Swiper, jQuery |
| 工具库 | csv, datetime, json |
🗂️ 四、项目目录结构
weather-analysis-system/ ├── manage.py ├── requirements.txt ├── weatherdata.sql # 数据库初始化脚本 ├── spiders/ # 爬虫模块 │ ├── spiderMain.py # 主爬虫入口 │ ├── spiderCity.py # 城市爬虫 │ └── city.csv # 城市列表 ├── myApp/ # Django主应用 │ ├── models.py # 数据模型 │ ├── views.py # 视图逻辑 │ ├── urls.py # URL路由 │ └── templates/ # HTML模板 ├── model/ # 预测模型 │ └── index.py # 预测算法 ├── utils/ # 工具函数 │ └── getChartData.py # 图表数据生成 ├── static/ # 静态资源 ├── wordCloud.py # 词云生成脚本 └── 天气数据分析可视化系统/ # Django项目配置💡 说明:项目命名使用中文目录是为方便理解
🕷️ 五、核心功能实现
1. 数据采集模块(爬虫)
使用 requests + lxml 抓取某天气网站的历史数据(如“中国天气网”),示例代码如下:
# spiders/spiderMain.py import requests from lxml import html def crawl_weather(city, date): url = f"https://www.weather.com/history/{city}/{date}" headers = {"User-Agent": "Mozilla/5.0"} response = requests.get(url, headers=headers) tree = html.fromstring(response.content) temperature = tree.xpath('//div[@class="temp"]/text()')[0] wind = tree.xpath('//div[@class="wind"]/text()')[0] air_quality = tree.xpath('//div[@class="aqi"]/text()')[0] return { "city": city, "date": date, "temperature": temperature, "wind": wind, "air_quality": air_quality }🔁 支持批量爬取多个城市,并将数据写入数据库。
2. 数据模型定义(Django Models)
# myApp/models.py from django.db import models class WeatherData(models.Model): city = models.CharField(max_length=50, verbose_name="城市") date = models.DateField(verbose_name="日期") high_temp = models.IntegerField(verbose_name="最高气温") low_temp = models.IntegerField(verbose_name="最低气温") wind = models.CharField(max_length=30, verbose_name="风力") air_quality = models.CharField(max_length=20, verbose_name="空气质量") weather = models.CharField(max_length=20, verbose_name="天气状况") class Meta: db_table = 'weather_data' verbose_name = "天气数据" verbose_name_plural = "天气数据"3. 数据可视化(Morris Chart)
前端使用 Morris.js 实现动态图表,例如温度趋势图:
<!-- templates/temp_chart.html --> <div></div> <script> Morris.Line({ element: 'temp-chart', data: {{ chart_data|safe }}, xkey: 'date', ykeys: ['high', 'low'], labels: ['最高温', '最低温'], parseTime: false }); </script>后端视图提供JSON数据:
# myApp/views.py def cityChar(request): city = request.GET.get('city', '北京') data = WeatherData.objects.filter(city=city).order_by('date') chart_data = [ {"date": d.date.strftime("%m-%d"), "high": d.high_temp, "low": d.low_temp} for d in data ] return JsonResponse(chart_data, safe=False)
4. 词云生成(wordCloud.py)
使用 wordcloud 库生成天气状况词云:
# wordCloud.py from wordcloud import WordCloud import matplotlib.pyplot as plt from myApp.models import WeatherData def generate_wordcloud(): texts = WeatherData.objects.values_list('weather', flat=True).join(texts) wc = WordCloud(font_path='simhei.ttf', width=800, height=400, background_color='white') wc.generate(text) wc.to_file('static/images/wordcloud.png')
🖼️ 效果:雨天、晴天、多云等出现频率高的词会更大。
5. 天气预测(机器学习)
使用 scikit-learn 建立简单线性回归模型预测未来温度:
# model/index.py import pandas as pd from sklearn.linear_model import LinearRegression def predict_temperature(city, days=7): data = pd.read_csv('spiders/tempData.csv') data['date_ordinal'] = pd.to_datetime(data['date']).map(pd.Timestamp.toordinal) X = data[['date_ordinal']] y = data['high_temp'] model = LinearRegression() model.fit(X, y) # 预测未来7天 future_dates = pd.date_range(data['date'].max(), periods=days+1)[1:] future_ordinals = [[d.toordinal()] for d in future_dates] predictions = model.predict(future_ordinals) return list(zip(future_dates.strftime("%Y-%m-%d"), predictions))
⚠️ 注意:想要扩展的可以使用更复杂的模型(如LSTM)并加入气象因子。
🚀 六、快速部署指南
1. 安装依赖
pip install -r requirements.txt2. 配置数据库(settings.py)
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'weatherdata', 'USER': 'root', 'PASSWORD': 'your_password', 'HOST': '127.0.0.1', 'PORT': '3306', } }3. 初始化数据库
python manage.py makemigrations python manage.py migrate4. 运行服务
python manage.py runserver 8000访问:http://127.0.0.1:8000
📊 七、系统截图



源码获取: