恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
Python天气预测项目实战:从数据抓取到模型部署全流程解析
首页
资讯中心
/
Python天气预测项目实战:从数据抓取到模型部署全流程解析
Python天气预测项目实战:从数据抓取到模型部署全流程解析
发布时间:2026/10/13 0:15:33
简介这是一套面向Python初学者与数据分析爱好者的天气预测与可视化完整项目源码适合用作课程设计、毕业设计或数据挖掘练手案例。项目以Python为核心串联数据采集、清洗、建模预测到前端展示的完整链路帮助读者理解天气数据从原始CSV到预测结果的全流程处理思路。压缩包共27个文件约2.86MB包含4个Python源码文件承载数据分析与预测逻辑4个CSV文件存储原始及处理后天气数据1个Pickle模型文件保存训练结果1个HTML文件用于前端可视化展示另有12张jpg图像呈现可视化效果以及若干Markdown说明与编译缓存文件。目前已有955人学习下载具备一定参考热度。读者可从中获取可运行的预测脚本、模型持久化方案、数据预处理范例与可视化图表参考并借助目录结构快速定位数据、代码与展示模块适合对照复现与二次开发。1. 从一份 29 文件的天气预测源码包说起它到底能跑出什么如果你手头正好有一份upload.zip解压后看到main.py、GetData.py、ProcessData.py、GetModel.py四个源码文件外加date_train.csv、date_test.csv、date_valid.csv三份数据和一个Model.pkl那你拿到的不是玩具 demo而是一条从抓数、清洗、建模到出图的完整链路。它解决的核心问题是把天气网站上的原始观测数据抓下来整理成可训练的时序样本训练一个预测模型再把预测结果和真实曲线画在一起最后用天气网.html做前端展示。适合谁适合刚学完 Python 基础、想找一个能跑通「数据采集 预测 可视化」全流程的练手项目的人也适合需要快速搭一个天气预测原型的从业者。12 张 jpg 图不是装饰它们是可视化结果的实物证据说明这条链路真的出过图。2. 拆开源码包四个 .py 文件的分工与数据流2.1 GetData.py 负责抓数天气网.html 是它的产物GetData.py是整个链路的入口。它的职责很明确从天气网站拉取数据落成 CSV。项目里出现的天气网.html和china_today.csv就是这一步的产物——前者是抓下来的页面快照后者是解析后的当日数据。常见做法是用requests拿页面再用BeautifulSoup或lxml解析表格。这里要注意天气网站的结构会变所以抓取逻辑不能写死某一个 class 名最好把选择器抽成变量。# GetData.py 抓取逻辑示意 import requests from bs4 import BeautifulSoup import pandas as pd URL http://www.weather.com.cn/... # 实际地址以源码为准 HEADERS {User-Agent: Mozilla/5.0} # 不加 UA 容易被拒 def fetch_page(url): resp requests.get(url, headersHEADERS, timeout10) resp.encoding utf-8 # 天气网常见编码写错会乱码 return resp.text def parse_table(html): soup BeautifulSoup(html, lxml) rows soup.select(table tr) # 选择器按实际页面调整 data [] for tr in rows: tds [td.get_text(stripTrue) for td in tr.find_all(td)] if tds: data.append(tds) return pd.DataFrame(data) if __name__ __main__: html fetch_page(URL) df parse_table(html) df.to_csv(china_today.csv, indexFalse, encodingutf-8-sig)逻辑说明fetch_page负责网络请求timeout10是防止卡死resp.encoding必须显式设置否则中文会变乱码。parse_table把表格行转成 DataFrameutf-8-sig是为了 Excel 打开不乱码。参数上HEADERS里的 UA 不能省很多站点会直接拒绝空 UA 的请求。如果你跑GetData.py报ConnectionError先检查 URL 是否还有效再看是否需要加Referer。2.2 ProcessData.py 做清洗与特征date_train/test/valid 三份 CSV 从这里来ProcessData.py是承上启下的模块。它读入原始 CSV处理缺失值、统一时间格式、构造时序特征然后按时间顺序切分成date_train.csv、date_test.csv、date_valid.csv。这里的关键是切分不能随机打乱时序数据一旦 shuffle验证集就会「偷看」未来指标虚高。常见做法是按时间点切前 70% 训练中间 15% 验证最后 15% 测试。# ProcessData.py 清洗与切分示意 import pandas as pd import numpy as np def clean(df): df df.dropna(subset[temperature, humidity]) # 关键列缺失直接丢 df[date] pd.to_datetime(df[date], errorscoerce) df df.dropna(subset[date]).sort_values(date) # 必须按时间排序 return df def split_by_time(df, train0.7, valid0.15): n len(df) i, j int(n * train), int(n * (train valid)) return df.iloc[:i], df.iloc[i:j], df.iloc[j:] if __name__ __main__: raw pd.read_csv(china_today.csv) df clean(raw) tr, va, te split_by_time(df) tr.to_csv(date_train.csv, indexFalse) va.to_csv(date_valid.csv, indexFalse) te.to_csv(date_test.csv, indexFalse)逻辑说明dropna只针对关键列避免把整行都删掉pd.to_datetime加errorscoerce是为了把非法日期转成 NaT 再统一丢弃。split_by_time用位置索引切分保证时间顺序。参数上train0.7是经验值数据量小可以调到 0.8。如果你发现date_train.csv里日期不连续检查原始数据是否有重复行没去重。2.3 GetModel.py 训练并落盘 Model.pklmain.py 串起全流程GetModel.py负责建模。项目里已经有Model.pkl说明训练过一次并序列化了。常见做法是用scikit-learn的回归模型或statsmodels的时序模型训练完用pickle或joblib存下来。main.py则是总调度调GetData抓数、调ProcessData清洗、调GetModel训练或加载模型、最后出图。# GetModel.py 训练与保存示意 import pandas as pd, pickle from sklearn.ensemble import RandomForestRegressor from sklearn.metrics import mean_absolute_error def train(train_csv, valid_csv): tr pd.read_csv(train_csv) va pd.read_csv(valid_csv) feats [humidity, pressure, wind] # 特征列按实际数据调整 X_tr, y_tr tr[feats], tr[temperature] X_va, y_va va[feats], va[temperature] model RandomForestRegressor(n_estimators200, random_state42) model.fit(X_tr, y_tr) pred model.predict(X_va) print(MAE:, mean_absolute_error(y_va, pred)) with open(Model.pkl, wb) as f: pickle.dump(model, f) return model if __name__ __main__: train(date_train.csv, date_valid.csv)逻辑说明RandomForestRegressor对特征缩放不敏感适合这种小规模表格数据n_estimators200是精度和速度的折中数据量小可以降到 100。random_state42保证可复现。MAE是回归任务最直观的指标先看它是否合理再谈调参。pickle.dump存模型时注意 Python 版本要一致__pycache__里的.pyc是 3.11 编译的换版本可能加载失败。3. 把项目跑起来环境、依赖与执行顺序3.1 依赖清单与安装命令这个项目依赖不多核心是pandas、numpy、scikit-learn、requests、beautifulsoup4、lxml、matplotlib。readme.txt里通常有说明但如果没有按下面这份装基本不会缺。# 建议在虚拟环境里装避免污染全局 python -m venv venv source venv/bin/activate # Windows 用 venv\Scripts\activate pip install pandas numpy scikit-learn requests beautifulsoup4 lxml matplotlib逻辑说明虚拟环境是后悔药装崩了直接删目录重来。lxml是BeautifulSoup的解析器不装会退化成内置解析器速度慢且容错差。如果你用的是 Python 3.11.pyc文件能直接复用换 3.12 可能触发重新编译一般不影响运行。3.2 执行顺序先抓数再清洗再训练最后出图顺序不能乱。main.py通常已经串好但如果你想分步调试按GetData.py→ProcessData.py→GetModel.py→main.py走。每步产出的文件就是下一步的输入缺一环就断链。步骤执行文件输入输出1GetData.py天气网站china_today.csv、天气网.html2ProcessData.pychina_today.csvdate_train/test/valid.csv3GetModel.pydate_train.csv、date_valid.csvModel.pkl4main.pyModel.pkl、date_test.csv12 张 jpg 可视化图逻辑说明这张表就是数据流的实物映射。如果你只想要预测结果不想重新抓数可以跳过第 1 步直接用现成的 CSV。但要注意china_today.csv是「当日」数据放久了就过期预测意义会打折。3.3 可视化出图12 张 jpg 是怎么生成的main.py里通常用matplotlib画图把预测曲线和真实曲线叠在一起再存成 jpg。项目里 12 张图对应不同维度或不同时间段。常见坑是中文显示成方块需要设置字体。import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei] # 中文显示Windows 常用 plt.rcParams[axes.unicode_minus] False # 负号正常显示 def plot(y_true, y_pred, path): plt.figure(figsize(10, 4)) plt.plot(y_true, label真实值) plt.plot(y_pred, label预测值) plt.legend() plt.title(天气预测对比) plt.savefig(path, dpi150, bbox_inchestight) plt.close() plot([1,2,3], [1.1,1.9,3.2], wps17.jpg)逻辑说明font.sans-serif设成SimHei是 Windows 下的常规做法Linux 上要换成系统里有的中文字体否则中文全是方框。axes.unicode_minusFalse解决负号显示异常。dpi150保证图片清晰度bbox_inchestight去掉多余白边。plt.close()必须加否则循环画 12 张图会内存暴涨。4. 避坑与排查这份源码最容易翻车的五个地方4.1 抓数返回空或乱码现象china_today.csv只有表头没有数据或者中文全是乱码。原因天气网站改版导致选择器失效或者编码没设对。解决先用浏览器打开天气网.html看结构把parse_table里的选择器改成实际标签编码统一用resp.encoding resp.apparent_encoding让 requests 自己猜。4.2 时序切分用了随机 shuffle现象验证集 MAE 低得离谱但测试集一跑就崩。原因train_test_split默认 shuffle时序数据被打乱后模型「看到」了未来。解决改用按时间位置切分参考 2.2 里的split_by_time绝不加shuffleTrue。4.3 Model.pkl 加载报版本不兼容现象pickle.load抛UnpicklingError或AttributeError。原因.pkl是用 Python 3.11 存的你换了 3.12 或换了 scikit-learn 版本。解决要么切回 3.11 环境要么删掉Model.pkl重新跑GetModel.py生成一份。.pyc文件同理版本不对就删掉让 Python 重新编译。4.4 中文图表显示成方块现象12 张 jpg 里标题和标签全是方框。原因matplotlib默认字体不含中文。解决按 3.3 设置font.sans-serifLinux 上先fc-list :langzh查可用中文字体再填进去。如果还不行检查字体文件是否真的存在。4.5 路径写死导致换目录就报错现象在项目根目录能跑换个目录就FileNotFoundError。原因源码里用了相对路径如date_train.csv依赖当前工作目录。解决用os.path.dirname(__file__)拼绝对路径或者统一在项目根目录执行。常见做法是加一个BASE_DIR变量所有路径基于它拼。import os BASE_DIR os.path.dirname(os.path.abspath(__file__)) train_path os.path.join(BASE_DIR, date_train.csv)逻辑说明__file__是当前脚本路径abspath转绝对dirname取目录。这样无论从哪执行路径都对。这是血泪经验路径问题排查起来最费时间。5. 进阶用法把预测结果接到 HTML 和可视化大屏5.1 用天气网.html 做静态展示的改造思路项目里的天气网.html目前只是抓取快照但你可以把它改造成结果展示页。思路是main.py出图后把图片路径和预测数值写进一个 JSONHTML 用fetch读 JSON 再渲染。这样每次跑完模型刷新页面就能看到最新结果不用手动换图。// 在天气网.html 里加一段渲染逻辑 fetch(result.json) .then(res res.json()) .then(data { document.getElementById(temp).innerText data.pred_temp ℃; document.getElementById(chart).src data.chart_path; });逻辑说明fetch读同目录下的result.json把预测温度和图表路径填进页面。result.json由main.py用json.dump生成。这样 HTML 就从静态快照变成了动态展示页。注意浏览器直接打开本地 HTML 时fetch可能被跨域策略拦起一个python -m http.server就能解决。5.2 接 ECharts 做可视化大屏的可行路径如果你想把 12 张静态 jpg 升级成可交互的图表ECharts 是最省事的选择。做法是main.py除了存 jpg再把预测序列导出成 JSON 数组HTML 里用 ECharts 的line组件渲染。这样鼠标悬停能看具体数值比 jpg 直观得多。常见做法是把date_test.csv和预测结果合并成一个{date: [], true: [], pred: []}的结构前端直接消费。方案优点代价静态 jpg零依赖跑完就有不可交互改图要重跑HTML JSON轻量刷新即更新需要起本地服务ECharts 大屏可交互适合演示前端工作量增加逻辑说明这张表帮你按场景选。自己看结果jpg 够了要给同事演示HTML JSON 最快要做成可视化大屏再上 ECharts。别一上来就追求大屏先把预测跑准。5.3 验证模型是否真的可用三个必看指标跑通不等于可用。我一般会强制走一遍这三个检查第一看date_test.csv上的 MAE 是否和验证集接近差距大说明过拟合第二把预测曲线和真实曲线叠图看趋势是否跟得上滞后太多说明特征不够第三拿最近 7 天数据做一次滚动预测看误差是否稳定。这三步走完心里才有底。从那以后我每次拿到这种时序预测源码包都先跑一遍测试集叠图再决定要不要调参。希望帮到你。本文还有配套的精品资源点击获取