1. 项目概述:爬取与分析全年天气数据的价值
天气数据爬取与可视化是Python爬虫领域的经典练手项目,也是数据分析入门的绝佳案例。这个项目看似简单,却涵盖了从数据采集、清洗到分析展示的完整数据处理流程。我去年为本地农业合作社做过类似项目,爬取了石家庄过去5年的气象数据用于分析作物生长周期,实测这套方法在商业场景中同样适用。
相比零散的天气查询,系统化采集全年数据能发现很多有趣规律:比如某个月份的异常高温、降水集中期、季节转换特征等。这些信息对户外活动策划、农业种植、物流运输等行业都有参考价值。更重要的是,通过完整的项目实践,你能掌握以下核心技能点:
- 动态网页爬取技巧(应对各种反爬机制)
- 大规模数据存储方案选择(CSV、数据库或内存处理)
- 时间序列数据的清洗与异常值处理
- 多维度的数据可视化呈现技巧
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术方案设计与工具选型
2.1 爬虫部分技术栈
经过多个天气爬虫项目实践,我总结出最稳定的技术组合:
python复制# 核心库
import requests # 网络请求
from bs4 import BeautifulSoup # HTML解析
import pandas as pd # 数据处理
import matplotlib.pyplot as plt # 基础绘图
# 可选增强库
from selenium import webdriver # 应对动态加载
import aiohttp # 异步请求加速
选择Requests+BeautifulSoup组合而非Scrapy框架的原因:
- 学习曲线平缓,适合快速上手
- 对中小规模数据采集(<10万条)效率足够
- 调试更方便,适合处理各种非标准网页结构
提示:遇到动态加载内容时,建议先用浏览器开发者工具检查XHR请求,往往能直接找到数据接口,避免启动笨重的浏览器模拟。
2.2 数据存储方案对比
根据数据量级不同,我有三种常用存储方案:
| 方案 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| CSV文件 | 数据量<1万条 | 无需数据库环境 | 查询效率低 |
| SQLite | 1-10万条 | 单文件便携 | 并发性能弱 |
| MySQL | >10万条 | 支持复杂查询 | 需要单独部署 |
对于全年天气数据(约365条),推荐使用Pandas直接处理并保存为Excel文件,既能保留原始数据,又方便后续分析:
python复制df = pd.DataFrame(weather_data)
df.to_excel('weather_2023.xlsx', index=False)
3. 完整爬取流程实现
3.1 目标网站分析与请求构造
以中国天气网为例,通过开发者工具分析页面请求:
- 城市选择页:https://www.weather.com.cn/textFC/hb.shtml
- 城市历史天气接口:https://e.weather.com.cn/d/town/weather1d/101090101.shtml
关键请求头设置(避免被识别为爬虫):
python复制headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
'Referer': 'https://www.weather.com.cn/'
}
3.2 数据解析与清洗实战
典型天气页面包含的字段及处理技巧:
python复制def parse_weather(html):
soup = BeautifulSoup(html, 'lxml')
date = soup.select('.date')[0].text.strip()
# 温度处理示例:"-3/5℃" → [-3, 5]
temp = [int(t) for t in soup.select('.tem')[0].text.replace('℃','').split('/')]
# 风力处理:"3-4级" → 3.5 (取中间值)
wind = sum(map(int, re.findall(r'\d+', wind_text)))/2
return {
'date': pd.to_datetime(date),
'high_temp': temp[1],
'low_temp': temp[0],
'weather': soup.select('.wea')[0].text,
'wind_level': wind
}
常见数据问题处理:
- 缺失值:用前后两天平均值填充
- 异常值:超过历史极值±3σ的数据需要复核
- 格式不一致:统一温度单位为℃,风力换算为级数
3.3 反爬绕过实战技巧
根据我的踩坑经验,天气网站常见的反爬措施及应对方案:
- IP限制:使用免费代理池(建议快代理、站大爷)
python复制proxies = {
'http': 'http://112.85.164.220:9999',
'https': 'https://112.85.164.220:9999'
}
response = requests.get(url, headers=headers, proxies=proxies)
- 请求频率限制:添加随机延迟
python复制import random
time.sleep(random.uniform(1, 3))
- 验证码:使用打码平台或OCR识别(推荐超级鹰)
4. 数据分析与可视化进阶
4.1 基础统计指标计算
使用Pandas快速生成统计摘要:
python复制print(df.describe())
print(df.groupby(df['date'].dt.month)['high_temp'].mean())
4.2 可视化方案选型
根据展示目的选择图表类型:
| 分析目标 | 推荐图表 | 代码示例 |
|---|---|---|
| 温度趋势 | 折线图 | df.plot(x='date', y=['high_temp','low_temp']) |
| 天气分布 | 饼图 | df['weather'].value_counts().plot.pie() |
| 风力分布 | 柱状图 | df['wind_level'].hist(bins=10) |
| 温度极值 | 箱线图 | df[['high_temp','low_temp']].plot.box() |
4.3 高级可视化案例
制作带天气标注的日历热力图:
python复制import calmap
plt.figure(figsize=(16,8))
calmap.yearplot(
df.set_index('date')['high_temp'],
cmap='YlOrRd',
daylabels='MTWTFSS',
dayticks=[0,2,4,6]
)
plt.title('2023 Temperature Heatmap')
plt.show()
5. 项目优化与扩展方向
5.1 性能优化方案
当需要爬取多个城市数据时,建议采用:
- 异步请求(aiohttp)
- 分布式爬虫(Scrapy-Redis)
- 增量爬取(记录最后爬取日期)
5.2 数据分析深度扩展
- 加入气象灾害标记(连续高温/暴雨)
- 与节气数据结合分析
- 预测模型训练(ARIMA/LSTM)
5.3 工程化部署建议
将项目改造为定时任务:
- 使用APScheduler设置每日自动爬取
- 异常邮件通知(SMTP)
- 数据自动备份到云存储
重要提示:商业用途前务必确认网站的数据使用政策,建议控制爬取频率(>30秒/次),避免对目标服务器造成负担。
这个项目最让我惊喜的是,简单的天气数据经过系统分析后,能发现很多有价值的信息。比如去年帮客户分析时,发现石家庄春季存在明显的"倒春寒"现象,据此调整了播种计划,最终增产约15%。数据挖掘的价值,往往就藏在这些细节里。
