1. 项目概述
这个基于Python和Django框架的城市天气大数据可视化系统,是我在计算机专业毕业设计期间完成的一个综合性项目。它整合了数据爬取、机器学习建模和数据可视化三大核心模块,能够自动从中国天气网抓取实时天气数据,通过随机森林算法进行预测分析,最终以直观的可视化图表展示结果。
这个系统的独特之处在于它完整覆盖了从数据采集到分析展示的全流程,特别适合想要学习Python全栈开发、数据分析和机器学习应用的在校学生。我在开发过程中遇到了不少坑,比如反爬虫机制的处理、大数据量下的性能优化等,这些经验都会在后续章节详细分享。
2. 系统架构设计
2.1 技术栈选型
核心框架选择Django主要基于以下几个考虑:
- Django自带完善的后台管理系统,方便快速开发数据管理界面
- ORM功能强大,能轻松处理关系型数据
- 模板系统成熟,便于前后端数据交互
- 社区活跃,遇到问题容易找到解决方案
其他关键技术组件包括:
- 爬虫模块:Requests+BeautifulSoup组合
- 数据分析:Pandas+NumPy
- 机器学习:Scikit-learn
- 可视化:ECharts+Pyecharts
- 缓存:Redis(用于提升频繁查询的性能)
2.2 数据流设计
系统数据处理流程分为四个阶段:
- 数据采集层:定时爬取中国天气网的公开数据
- 数据存储层:清洗后存入MySQL数据库
- 分析预测层:使用随机森林进行天气趋势预测
- 展示层:通过Web界面展示可视化图表
注意:爬取公开数据时需遵守robots协议,控制请求频率,避免对目标网站造成负担
3. 核心模块实现
3.1 天气数据爬虫实现
爬虫模块的主要挑战在于:
- 网站反爬机制(验证码、请求频率限制)
- 数据结构的频繁变动
- 大规模数据抓取的稳定性
我的解决方案是:
python复制def fetch_weather_data(city_code):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) ...'
}
try:
response = requests.get(
f'http://www.weather.com.cn/weather/{city_code}.shtml',
headers=headers,
timeout=10
)
response.encoding = 'utf-8'
soup = BeautifulSoup(response.text, 'html.parser')
# 解析温度数据
temp = soup.select('.tem span')[0].text
# 解析天气状况
weather = soup.select('.wea')[0].text
return {
'temperature': temp,
'weather': weather,
'update_time': datetime.now()
}
except Exception as e:
logger.error(f"爬取数据失败: {str(e)}")
return None
关键技巧:
- 使用随机User-Agent轮换
- 设置合理的超时时间
- 添加完善的异常处理
- 记录详细的日志
3.2 随机森林预测模型
天气预测模型构建步骤:
-
数据预处理:
- 处理缺失值(用前后时刻均值填充)
- 特征工程(提取星期、季节等时间特征)
- 标准化连续变量
-
模型训练:
python复制from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split
# 准备数据
X = df[['temp_hist', 'humidity', 'wind_speed', 'season']]
y = df['temp_next']
# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
# 训练模型
model = RandomForestRegressor(
n_estimators=100,
max_depth=10,
random_state=42
)
model.fit(X_train, y_train)
- 模型评估指标:
- MAE(平均绝对误差):1.5℃
- R²得分:0.89
3.3 可视化展示实现
使用Pyecharts实现的主要可视化类型:
- 温度趋势折线图
- 天气状况饼图
- 城市对比雷达图
- 预测误差热力图
前端与后端数据交互关键代码:
python复制# views.py
def weather_chart(request):
city = request.GET.get('city', '北京')
data = WeatherData.objects.filter(city=city).order_by('-date')[:30]
# 创建折线图
line = (
Line()
.add_xaxis([d.date.strftime('%m-%d') for d in data])
.add_yaxis('最高温度', [d.max_temp for d in data])
.add_yaxis('最低温度', [d.min_temp for d in data])
.set_global_opts(title_opts=opts.TitleOpts(title=f"{city}近期温度趋势"))
)
return JsonResponse(line.dump_options_with_quotes())
4. 系统部署与优化
4.1 生产环境部署
我选择Nginx+Gunicorn的方案部署Django项目,主要配置:
- Gunicorn启动配置(gunicorn.conf.py):
python复制bind = "127.0.0.1:8000"
workers = 3
timeout = 120
accesslog = "/var/log/gunicorn/access.log"
errorlog = "/var/log/gunicorn/error.log"
- Nginx关键配置:
nginx复制location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
4.2 性能优化技巧
-
数据库优化:
- 添加适当索引(如城市、日期字段)
- 使用select_related减少查询次数
- 对大表进行分区
-
缓存策略:
- 使用Redis缓存热门城市数据
- 设置合理的缓存过期时间(天气数据1小时)
- 实现两级缓存(内存+Redis)
-
异步任务:
- 使用Celery处理数据爬取和模型训练
- 定时任务使用django-crontab
5. 常见问题与解决方案
5.1 爬虫相关问题
Q:遇到403 Forbidden错误怎么办?
A:通常是被反爬了,解决方案:
- 更换User-Agent
- 添加请求延迟(time.sleep随机1-3秒)
- 使用代理IP池
Q:网页结构变化导致解析失败?
A:建议:
- 编写更健壮的CSS选择器
- 添加多重解析逻辑
- 设置监控报警
5.2 模型预测问题
Q:预测误差较大怎么优化?
A:可以尝试:
- 增加更多历史数据
- 添加气压、降水量等特征
- 调整随机森林参数(如增加n_estimators)
- 尝试其他算法(如XGBoost)对比效果
5.3 可视化显示问题
Q:图表加载缓慢?
A:优化建议:
- 减少一次性展示的数据点数量
- 启用图表的数据缩放功能
- 使用WebSocket实现增量更新
6. 项目扩展方向
这个基础系统还有很大的扩展空间:
- 增加更多数据源(如AQI空气质量数据)
- 实现异常天气预警功能
- 开发移动端适配界面
- 加入LSTM等深度学习模型
- 构建预测结果自动推送机制
我在开发过程中最大的体会是:一个完整的数据系统需要平衡各模块的关系。比如爬虫频率太高会被封,太低又影响数据时效性;模型复杂度高了预测准但训练慢。这些权衡需要根据实际需求不断调整。
