天气预报数据可视化分析系统 - 系统文档
📋 目录
项目概述
项目简介
本系统是一个基于 Flask + MySQL 的天气预报数据可视化分析系统,提供天气数据的采集、存储、分析和可视化展示功能。系统整合了多个天气数据源,支持实时天气查询、历史天气查询、7天天气预报分析等功能,并通过多种图表和地图展示天气数据。
主要特性
- ✅ 用户认证系统(注册/登录/信息管理)
- ✅ 实时天气数据展示(中国地图可视化)
- ✅ 7天天气预报分析(多指标折线图)
- ✅ 历史天气查询(2022-2024年数据)
- ✅ 数据自动爬取(API + 网页爬虫)
- ✅ 多维度数据分析(温度、湿度、风力、能见度等)
- ✅ 响应式前端设计(Bootstrap 4)
系统架构
架构图
┌─────────────────────────────────────────────────────────────┐
│ 用户界面层 │
│ ┌──────────┬──────────┬──────────┬──────────┬──────────┐ │
│ │ 首页 │ 天气地图 │ 天气分析 │ 历史天气 │ 用户管理 │ │
│ └──────────┴──────────┴──────────┴──────────┴──────────┘ │
└─────────────────────────────────────────────────────────────┘
↕
┌─────────────────────────────────────────────────────────────┐
│ Flask 应用层 │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 路由控制器 (app.py) │ │
│ │ /login /register /home /map /search /lishi /user │ │
│ └─────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
↕
┌─────────────────────────────────────────────────────────────┐
│ 业务逻辑层 │
│ ┌──────────┬──────────┬──────────┬──────────┬──────────┐ │
│ │ home/ │ lishi/ │ map/ │ search/ │spider/ │ │
│ │ 首页数据 │历史查询 │地图数据 │天气分析 │数据爬取 │ │
│ └──────────┴──────────┴──────────┴──────────┴──────────┘ │
└─────────────────────────────────────────────────────────────┘
↕
┌─────────────────────────────────────────────────────────────┐
│ 数据访问层 │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ MySQL 数据库 (tianqi) │ │
│ │ users, weatherdata, weatherdata7, lishiweathers │ │
│ └─────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
↕
┌─────────────────────────────────────────────────────────────┐
│ 数据源层 │
│ ┌──────────────────┬──────────────────────────────────┐ │
│ │ 和风天气API │ weather.tianqi.com (网页爬取) │ │
│ │ 实时/7天预报 │ 历史天气数据 │ │
│ └──────────────────┴──────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
目录结构
code/
├── app.py # Flask主应用文件
├── requirements.txt # Python依赖包
├── home/ # 首页数据处理模块
│ ├── bar.py # 饼图数据处理
│ ├── biaoqian.py # 标签数据统计
│ ├── line.py # 折线图数据处理
│ ├── utils.py # 数据库连接工具
│ └── __init__.py
├── lishi/ # 历史天气查询模块
│ ├── search.py # 历史天气搜索
│ ├── utils.py # 数据库连接工具
│ └── __init__.py
├── map/ # 地图数据模块
│ └── utils.py # 城市温度数据查询
├── search/ # 天气分析查询模块
│ ├── line.py # 折线图数据查询
│ ├── table.py # 表格数据查询
│ ├── utils.py # 数据库连接工具
│ └── __init__.py
├── spider/ # 数据爬取模块
│ ├── fenxi.py # 7天天气预报爬取
│ ├── lishi.py # 历史天气数据爬取
│ ├── map.py # 当前天气爬取
│ ├── china.json # 中国城市编码
│ ├── city.json # 城市编码映射
│ └── province_city.json # 省市对应关系
├── static/ # 静态资源文件
│ ├── css/ # 样式文件
│ ├── js/ # JavaScript文件
│ ├── img/ # 图片资源
│ ├── pug/ # Pug模板文件
│ └── vendor/ # 第三方库
├── templates/ # HTML模板文件
│ ├── home.html # 首页
│ ├── login.html # 登录页
│ ├── register.html # 注册页
│ ├── map.html # 天气地图页
│ ├── search.html # 天气分析页
│ ├── lishi.html # 历史天气页
│ └── user.html # 用户管理页
├── userUtils/ # 用户工具模块
│ └── query.py # 用户数据库查询
└── 天气系统数据库/ # 数据库文件
├── users.sql # 用户表SQL
├── lishiweathrs.sql # 历史天气表SQL
├── 天气数据.sql # 当前天气数据SQL
└── 天气数据.zip # 压缩数据文件
技术栈
后端技术
| 技术 | 版本 | 用途 |
|---|---|---|
| Python | 3.x | 主要开发语言 |
| Flask | 8.0.3 | Web后端框架 |
| PyMySQL | - | MySQL数据库连接 |
| Requests | - | HTTP请求库 |
| BeautifulSoup4 | - | HTML解析 |
| Pandas | - | 数据处理 |
前端技术
| 技术 | 版本 | 用途 |
|---|---|---|
| Bootstrap | 4.x | 响应式UI框架 |
| jQuery | 3.6.0 | JavaScript库 |
| ECharts | - | 数据可视化图表 |
| Chart.js | - | 图表展示 |
| DataTables | - | 表格插件 |
| Font Awesome | - | 图标库 |
数据库
| 技术 | 版本 | 用途 |
|---|---|---|
| MySQL | 5.7.40 | 关系型数据库 |
外部API
| API | 用途 |
|---|---|
| 和风天气API | 获取实时天气和7天预报数据 |
功能模块
1. 用户系统模块
功能说明
- 用户注册
- 用户登录
- 用户信息管理
- 密码修改
相关文件
- 后端 :
app.py(路由),userUtils/query.py(数据库操作) - 前端 :
templates/login.html,templates/register.html,templates/user.html
数据库表
users表:存储用户基本信息
2. 首页仪表板模块
功能说明
- 天气统计卡片展示
- 风速最高的10个城市(饼图)
- 湿度最高的10个城市(饼图)
- 温度最高的10个城市(折线图)
- 温度最低的10个城市(折线图)
- 天气状况标签统计(晴天、阴天、雨天、雪天)
相关文件
- 后端 :
app.py(路由),home/bar.py,home/line.py,home/biaoqian.py - 前端 :
templates/home.html
API接口
GET /home
→ 返回首页所需的所有图表数据
3. 天气地图模块
功能说明
- 中国地图可视化展示
- 各省份当前温度热力图
- 鼠标悬停显示省份详情
相关文件
- 后端 :
app.py(路由),map/utils.py - 前端 :
templates/map.html,static/js/map/china.js
API接口
GET /map
→ 返回省份温度数据
格式: {省份: 温度, ...}
4. 天气分析模块
功能说明
- 城市搜索功能
- 7天天气预报展示
- 多指标折线图:
- 最高温度趋势
- 最低温度趋势
- 能见度趋势
- 湿度趋势
- 详细天气数据表格
相关文件
- 后端 :
app.py(路由),search/line.py,search/table.py - 前端 :
templates/search.html
API接口
POST /search
参数: {city: "城市名"}
→ 返回7天天气预报数据
5. 历史天气模块
功能说明
- 历史天气查询(2022-2024年数据)
- 按城市和日期模糊搜索
- 分页展示查询结果
- 数据导出功能
相关文件
- 后端 :
app.py(路由),lishi/search.py - 前端 :
templates/lishi.html
API接口
POST /lishi
参数: {city: "城市名", date: "日期"}
→ 返回历史天气数据列表
6. 数据爬取模块
功能说明
- 实时天气数据爬取
- 7天天气预报爬取
- 历史天气数据爬取
- 城市编码管理
相关文件
- 后端 :
spider/map.py,spider/fenxi.py,spider/lishi.py - 数据 :
spider/china.json,spider/city.json,spider/province_city.json
爬取策略
实时天气爬取 (map.py)
- 数据源: 和风天气API
- API Key:
- 存储表:
weatherdata
7天预报爬取 (fenxi.py)
- 数据源: 和风天气API
- 数据字段: 城市、观测时间、最高/最低温度、天气状况、风力、降水量、紫外线、湿度、能见度、云量
- 存储表:
weatherdata7
历史天气爬取 (lishi.py)
- 数据源: weather.tianqi.com
- 技术方案: BeautifulSoup + 正则表达式解析HTML
- 数据范围: 2022年1月 - 2024年2月
- 存储表:
lishiweathers
数据库设计
数据库信息
- 数据库名 :
tianqi - 字符集 :
utf8 - 引擎: InnoDB
数据表结构
1. users 表(用户表)
| 字段名 | 类型 | 说明 | 约束 |
|---|---|---|---|
| id | INT | 用户ID | 主键, 自增 |
| username | VARCHAR(255) | 用户名 | - |
| VARCHAR(255) | 邮箱 | 唯一 | |
| password | VARCHAR(255) | 密码 | - |
| mima | VARCHAR(255) | 密码(备用字段) | - |
2. weatherdata 表(当前天气数据)
| 字段名 | 类型 | 说明 |
|---|---|---|
| 城市 | VARCHAR | 城市名称 |
| 时间 | DATETIME | 观测时间 |
| 温度 | FLOAT | 当前温度(℃) |
| 体感温度 | FLOAT | 体感温度(℃) |
| 天气情况 | VARCHAR | 天气描述 |
| 风力等级 | VARCHAR | 风力等级 |
| 湿度 | FLOAT | 湿度(%) |
| 能见度 | FLOAT | 能见度(km) |
3. weatherdata7 表(7天预报数据)
| 字段名 | 类型 | 说明 |
|---|---|---|
| 城市 | VARCHAR | 城市名称 |
| 观测时间 | DATE | 预报日期 |
| 最高温度 | FLOAT | 最高温度(℃) |
| 最低温度 | FLOAT | 最低温度(℃) |
| 白天天气状况 | VARCHAR | 白天天气描述 |
| 晚间天气状况 | VARCHAR | 晚间天气描述 |
| 白天风力 | VARCHAR | 白天风力描述 |
| 夜间风力 | VARCHAR | 夜间风力描述 |
| 降水量 | FLOAT | 降水量(mm) |
| 紫外线 | VARCHAR | 紫外线指数 |
| 湿度 | FLOAT | 湿度(%) |
| 能见度 | FLOAT | 能见度(km) |
| 云量 | FLOAT | 云量(%) |
4. lishiweathers 表(历史天气数据)
| 字段名 | 类型 | 说明 | 约束 |
|---|---|---|---|
| id | INT | 记录ID | 主键, 自增 |
| 城市 | VARCHAR(255) | 城市名称 | - |
| 日期 | DATE | 日期 | - |
| 最高温度 | FLOAT | 最高温度(℃) | - |
| 最低温度 | FLOAT | 最低温度(℃) | - |
| 天气 | VARCHAR(255) | 天气描述 | - |
| 风向 | VARCHAR(255) | 风向描述 | - |
数据量统计
- lishiweathers表: 约129,052条记录(2022-2024历史数据)
- weatherdata表: 数百条记录(实时天气数据)
- weatherdata7表: 数千条记录(7天预报数据)
API接口文档
基础信息
- Base URL :
http://localhost:5000 - 数据格式: JSON
- 认证方式: Session
接口列表
1. 用户认证
用户注册
POST /register
Content-Type: application/json
Request Body:
{
"username": "用户名",
"email": "邮箱@example.com",
"password": "密码"
}
Response:
{
"success": true,
"message": "注册成功"
}
用户登录
POST /login
Content-Type: application/json
Request Body:
{
"email": "邮箱@example.com",
"password": "密码"
}
Response:
成功: 重定向到 /home
失败: 返回登录页
用户登出
GET /
Response: 重定向到登录页
2. 首页数据
获取首页数据
GET /home
Response:
{
"highTempCities": ["北京", "上海", ...],
"lowTempCities": ["哈尔滨", ...],
"highWindCities": ["乌鲁木齐", ...],
"highHumidityCities": ["深圳", ...],
"weatherLabels": {
"晴天": 120,
"阴天": 45,
"雨天": 30,
"雪天": 5
}
}
3. 天气地图
获取地图数据
GET /map
Response:
{
"北京": 25,
"上海": 28,
"广东": 30,
...
}
4. 天气分析
查询城市天气分析
POST /search
Content-Type: application/x-www-form-urlencoded
Request Body:
city=北京
Response:
{
"highTemps": [25, 26, 24, ...],
"lowTemps": [18, 19, 17, ...],
"visibility": [10, 12, 8, ...],
"humidity": [60, 65, 55, ...],
"tableData": [
{
"观测时间": "2024-03-11",
"最高温度": 25,
"最低温度": 18,
...
},
...
]
}
5. 历史天气
查询历史天气
POST /lishi
Content-Type: application/x-www-form-urlencoded
Request Body:
city=北京&date=2022-01
Response:
[
{
"城市": "北京",
"日期": "2022-01-01",
"最高温度": 6,
"最低温度": 7,
"天气": "晴",
"风向": "东北风 1级"
},
...
]
6. 用户管理
获取用户信息
GET /get_user_info
Response:
{
"username": "用户名",
"email": "邮箱@example.com",
"mima": "密码"
}
更新用户信息
POST /update_user_info
Content-Type: application/x-www-form-urlencoded
Request Body:
nickname=新用户名&mima=新密码
Response:
{
"message": "更新成功"
}
修改密码
POST /update_password
Content-Type: application/x-www-form-urlencoded
Request Body:
password=新密码
Response: 成功提示
部署指南
环境要求
- Python 3.7+
- MySQL 5.7+
- 操作系统: Windows / Linux / macOS
安装步骤
1. 安装Python依赖
bash
pip install -r requirements.txt
需要的依赖包:
blinker==1.8.2
certifi==2024.2.2
charset-normalizer==3.3.2
click==8.1.7
colorama==0.4.6
Flask==8.0.3
pymysql
requests
beautifulsoup4
pandas
2. 数据库配置
sql
-- 创建数据库
CREATE DATABASE IF NOT EXISTS tianqi DEFAULT CHARACTER SET utf8;
-- 导入SQL文件
USE tianqi;
source 天气系统数据库/users.sql;
source 天气系统数据库/天气数据.sql;
source 天气系统数据库/lishiweathrs.sql;
3. 修改数据库连接配置
修改以下文件中的数据库连接信息:
home/utils.pylishi/utils.pymap/utils.pysearch/utils.py
python
db = pymysql.connect(
host='localhost', # 数据库主机
user='root', # 数据库用户名
password='123456', # 数据库密码
database='tianqi' # 数据库名
)
4. 运行应用
bash
python app.py
应用将在 http://localhost:5000 启动
使用说明
快速开始
1. 注册账号
- 访问
http://localhost:5000 - 点击注册链接
- 填写用户名、邮箱和密码
- 完成注册后自动登录
2. 首页概览
- 查看天气统计卡片
- 观察各城市的温度、湿度、风力排名
- 浏览天气状况分布标签
3. 天气地图
- 点击"天气地图"菜单
- 查看中国各省份的实时温度分布
- 鼠标悬停查看详细数据
4. 天气分析
- 点击"天气分析"菜单
- 输入城市名称进行搜索
- 查看7天天气预报折线图
- 浏览详细天气数据表格
5. 历史天气
- 点击"历史天气"菜单
- 输入城市和日期(支持模糊查询)
- 使用分页功能浏览大量历史数据
- 可以跳转到指定页码
6. 用户管理
- 点击"用户管理"菜单
- 查看和修改个人信息
- 修改登录密码
数据爬取
如需手动爬取最新天气数据:
python
# 爬取实时天气
python spider/map.py
# 爬取7天预报
python spider/fenxi.py
# 爬取历史天气(注意:需要较长的时间)
python spider/lishi.py
注意事项
-
和风天气API限制
- 免费版API有调用次数限制
- 请合理控制爬取频率
- API Key需要定期检查是否有效
-
历史天气爬取
- 历史天气数据量大,爬取时间较长
- 建议分批次爬取
- 遵守网站使用条款,避免对目标服务器造成压力
-
数据库备份
- 定期备份数据库
- 重要数据建议保存SQL转储文件
系统特色
1. 多维度数据展示
- 系统整合了温度、湿度、风力、能见度等多个天气指标
- 通过折线图、饼图、热力图等多种图表形式展示数据
2. 历史数据丰富
- 包含2022年至2024年超过12万条历史天气记录
- 支持快速模糊查询和分页浏览
3. 可视化效果
- 使用ECharts绘制专业的数据图表
- 中国地图可视化直观展示区域天气分布
4. 用户体验
- 响应式设计适配多种设备
- 友好的用户界面和交互设计
- 快速的查询和加载速度
技术亮点
1. 数据源多样化
- 集成API接口和网页爬虫两种数据获取方式
- 互补获取实时数据和历史数据
2. 模块化设计
- 代码按功能模块清晰划分
- 易于维护和扩展
3. 前后端分离
- 前端使用jQuery实现AJAX交互
- 后端提供RESTful API接口
4. 数据可视化
- 多种图表库协同工作(ECharts、Chart.js)
- 数据展示直观美观
常见问题
Q1: 系统无法连接数据库?
A: 检查以下事项:
- MySQL服务是否启动
- 数据库连接配置是否正确
- 用户名密码是否正确
- 数据库是否存在
Q2: 爬虫获取数据失败?
A: 可能原因:
- 网络连接问题
- API调用次数超限
- 目标网站反爬虫机制
- 解决方法:检查网络、更换API Key、设置请求头
Q3: 图表不显示?
A: 检查:
- 浏览器控制台是否有JavaScript错误
- ECharts/Chart.js库是否正确加载
- 数据格式是否正确
Q4: 如何添加更多城市?
A : 在 spider/city.json 中添加城市编码,然后运行相应的爬虫脚本
Q5: 历史数据查询太慢?
A: 优化方案:
- 为查询字段添加数据库索引
- 使用分页限制返回数据量
- 优化SQL查询语句
版本历史
| 版本 | 日期 | 说明 |
|---|---|---|
| 1.0.0 | 2024 | 初始版本发布 |
许可证
本项目仅供学习和研究使用。
联系方式
如有问题或建议,欢迎反馈。
文档最后更新: 2026年3月11日