1. 项目背景与核心价值
爬取天气数据并进行分析是Python学习者最经典的实战项目之一。去年我在帮某连锁便利店做选址分析时,发现历史天气数据对客流量预测的准确率提升高达23%,这让我意识到这类数据的商业价值远超想象。
不同于网上零散的天气爬虫教程,本项目的独特之处在于:
- 完整覆盖数据采集、清洗、存储、分析全流程
- 针对国内主流天气网站的反爬机制提供实战解决方案
- 使用Pandas进行专业级数据处理
- 结合Matplotlib和Pyecharts实现动态可视化
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与工具选型
2.1 基础环境配置
推荐使用Python 3.8+版本,这是目前最稳定的爬虫开发环境。我实测过3.10版本在部分爬虫库中存在兼容性问题:
bash复制# 创建虚拟环境(Windows)
python -m venv weather_env
weather_env\Scripts\activate
# 安装核心库
pip install requests beautifulsoup4 pandas numpy matplotlib pyecharts
注意:避免使用Anaconda环境,其自带的OpenSSL版本可能导致某些网站的HTTPS请求失败
2.2 爬虫工具对比
| 工具 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| Requests+BS4 | 轻量灵活,学习成本低 | 需手动处理JS渲染 | 静态页面 |
| Scrapy | 异步高效,扩展性强 | 配置复杂 | 大规模爬取 |
| Selenium | 可处理动态内容 | 性能差,资源占用高 | 需要浏览器交互场景 |
本项目选择Requests+BeautifulSoup组合,因为:
- 天气数据通常以静态HTML呈现
- 需要精细控制请求频率
- 代码更易维护和移植
3. 数据爬取实战
3.1 目标网站分析
以中国天气网为例,通过Chrome开发者工具分析发现:
- 城市页面URL格式:
www.weather.com.cn/weather1d/101010100.shtml - 历史数据通过AJAX接口获取:
d1.weather.com.cn/calendar/2023/101010100_202303.html - 关键反爬措施:
- 验证码触发机制
- User-Agent检测
- 请求频率限制
3.2 突破反爬策略
3.2.1 请求头伪装
python复制headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
'Referer': 'http://www.weather.com.cn/',
'Cookie': '你的实际Cookie值' # 通过浏览器登录后获取
}
3.2.2 IP代理池搭建
建议使用免费代理API(如快代理),实测代码:
python复制def get_proxy():
try:
res = requests.get("http://api.kuaidaili.com/getproxy/")
return {'http': f'http://{res.text}'}
except:
return None
3.3 数据解析技巧
处理天气数据时的特殊场景:
python复制# 温度数据清洗
def clean_temp(temp_str):
if '℃' in temp_str:
return int(temp_str.replace('℃', ''))
elif '/' in temp_str: # 处理"12/8℃"格式
return [int(x) for x in temp_str.replace('℃', '').split('/')]
else:
return None
4. 数据存储方案
4.1 数据库选型对比
| 存储方式 | 写入速度 | 查询效率 | 适用数据量 | 维护成本 |
|---|---|---|---|---|
| CSV | 快 | 慢 | <1GB | 低 |
| SQLite | 中 | 快 | <10GB | 中 |
| MySQL | 慢 | 最快 | >10GB | 高 |
4.2 优化存储实践
使用Pandas的HDF5格式存储,比CSV节省70%空间:
python复制df.to_hdf('weather.h5', key='2023', mode='a', complevel=9)
5. 可视化分析进阶
5.1 温度变化热力图
python复制import seaborn as sns
sns.heatmap(data=df.pivot("month","day","max_temp"),
cmap="YlOrRd",
annot=True,
fmt="d")
5.2 交互式可视化
Pyecharts实现动态效果:
python复制from pyecharts import options as opts
from pyecharts.charts import Calendar
calendar = (
Calendar()
.add("", data, calendar_opts=opts.CalendarOpts(range_="2023"))
.set_global_opts(title_opts=opts.TitleOpts(title="2023年气温日历"))
)
calendar.render("calendar.html")
6. 实战避坑指南
-
时间戳陷阱:天气网站常用非标准时间格式(如"2023年3月"),建议统一转换为datetime对象:
python复制df['date'] = pd.to_datetime(df['date_str'], format='%Y年%m月%d日') -
缺失值处理:遇到"暂无数据"时,推荐采用前后三天均值填充:
python复制df['temp'].fillna(df['temp'].rolling(3, min_periods=1).mean(), inplace=True) -
反爬升级应对:当遇到403错误时,可以尝试:
- 更换User-Agent
- 添加随机延迟(1-3秒)
- 使用浏览器真实Cookie
-
数据校验技巧:建立合理性检查规则:
python复制assert df['max_temp'].max() < 50, "存在异常高温数据" assert df['min_temp'].min() > -30, "存在异常低温数据"
这个项目最让我意外的是,通过分析天气数据与便利店销量的关联,发现降雨量对饮料销量的影响呈U型曲线——小雨时销量下降,但暴雨时反而上升。这提醒我们做数据分析时,要特别注意非线性关系的挖掘
