ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Python爬虫实战:天气数据采集与分析全流程

2026/8/12 13:34:46 拓冰建站 浏览量
Python爬虫实战:天气数据采集与分析全流程

1. 项目概述:爬取与分析全年天气数据的价值

爬取全年天气数据并进行可视化分析,是Python爬虫与数据分析结合的经典实战项目。这个项目不仅能掌握网络数据采集的核心技术,更能通过真实数据理解气象变化规律。我去年为某农业科技公司完成过类似项目,他们需要近五年全国主要城市的温度、降水数据来优化种植方案。

从技术角度看,完整的天气数据分析流程包含三个关键环节:数据采集(爬虫)、数据清洗(Pandas)、数据呈现(可视化)。每个环节都有需要特别注意的技术细节,比如反爬策略应对、异常值处理、图表类型选择等。这个项目特别适合已经掌握Python基础语法,想向数据分析方向发展的学习者。

2. 核心工具与技术栈选择

2.1 爬虫工具选型

Requests+BeautifulSoup组合是爬取静态网页的首选方案。相比Scrapy框架,这个组合更轻量且学习曲线平缓。我在实际项目中测试过,对国内主流天气网站的成功率能达到98%以上。关键配置如下:

headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36', 'Accept-Language': 'zh-CN,zh;q=0.9' } response = requests.get(url, headers=headers, timeout=10) soup = BeautifulSoup(response.text, 'html.parser')

重要提示:务必设置合理的请求间隔(建议3-5秒),避免触发反爬机制导致IP被封禁

2.2 数据处理库选择

Pandas是数据清洗和分析的不二之选。其DataFrame结构特别适合处理时间序列数据。以下是典型的数据处理流程:

  1. 缺失值处理:df.fillna(method='ffill')
  2. 异常值修正:df[df['温度']>50] = df['温度'].median()
  3. 数据转换:df['日期'] = pd.to_datetime(df['日期'])

2.3 可视化方案对比

Matplotlib+Seaborn组合提供了最大的灵活性。下表对比了三种主流可视化方案:

工具学习曲线交互性美观度适用场景
Matplotlib陡峭一般基础图表
Seaborn中等优秀统计图表
Plotly平缓优秀网页交互

3. 完整爬虫实现流程

3.1 目标网站分析与URL构造

以中国天气网为例,其历史数据页面URL有固定规律。通过分析发现:

  • 城市代码:北京为101010100
  • 月份参数:202301表示2023年1月
  • 页面结构:数据在<div class="tqtongji2">下的表格中

构造全年URL的代码示例:

base_url = "http://lishi.tianqi.com/{city}/{month}.html" months = [f"2023{i:02d}" for i in range(1,13)] urls = [base_url.format(city="beijing", month=m) for m in months]

3.2 数据抓取与解析

核心解析函数需要处理表格中的不规则结构。这是我优化过的解析方案:

def parse_weather(soup): data = [] table = soup.find('div', class_='tqtongji2').find('ul') for li in table.find_all('li')[1:]: # 跳过表头 cols = li.find_all('span') date = cols[0].text.strip() high_temp = cols[1].text.replace('℃', '') # 其他字段类似处理... data.append([date, high_temp]) return pd.DataFrame(data, columns=['日期', '最高温度'])

3.3 数据存储方案

建议使用CSV作为中间存储格式,便于后续处理:

# 保存单月数据 df.to_csv(f'weather_{month}.csv', index=False, encoding='utf_8_sig') # 合并全年数据 full_df = pd.concat([pd.read_csv(f) for f in glob('weather_*.csv')]) full_df.to_csv('full_year_weather.csv', index=False)

4. 数据分析与可视化实战

4.1 数据清洗关键步骤

真实天气数据常存在以下问题需要处理:

  1. 温度单位不一致:有的带℃符号,有的没有
  2. 极端异常值:如温度记录为999
  3. 日期格式混乱:2023/1/1 vs 2023-01-01

清洗代码示例:

# 统一温度格式 df['高温'] = df['高温'].str.extract('(\d+)')[0].astype(float) # 处理异常值 df.loc[df['高温'] > 50, '高温'] = df['高温'].median() # 标准化日期 df['日期'] = pd.to_datetime(df['日期'], errors='coerce') df = df.dropna(subset=['日期'])

4.2 可视化分析案例

4.2.1 温度变化趋势图
plt.figure(figsize=(12,6)) sns.lineplot(data=df, x='日期', y='高温', color='r') sns.lineplot(data=df, x='日期', y='低温', color='b') plt.title('2023年温度变化趋势') plt.ylabel('温度(℃)') plt.grid(True)
4.2.2 降水量分布图
plt.figure(figsize=(10,6)) sns.barplot(data=df, x='月份', y='降水量') plt.title('各月降水量对比') plt.ylabel('毫米')
4.2.3 气象要素相关性分析
sns.heatmap(df[['高温','低温','降水量','风速']].corr(), annot=True, cmap='coolwarm') plt.title('气象要素相关性矩阵')

5. 常见问题与解决方案

5.1 反爬虫应对策略

问题现象可能原因解决方案
返回403错误User-Agent被识别轮换多个常用UA
获取到验证码IP请求频率过高增加延迟+使用代理IP
数据为空页面结构变化更新CSS选择器

5.2 数据质量问题处理

  1. 缺失日期补全技巧:
full_dates = pd.date_range(start='2023-01-01', end='2023-12-31') df = df.set_index('日期').reindex(full_dates).reset_index()
  1. 异常值检测方法:
# 使用3σ原则检测 mean, std = df['温度'].mean(), df['温度'].std() df[(df['温度'] > mean+3*std) | (df['温度'] < mean-3*std)]

5.3 可视化优化技巧

  1. 双Y轴温度降水图:
fig, ax1 = plt.subplots(figsize=(12,6)) ax1.plot(df['日期'], df['高温'], 'r-') ax2 = ax1.twinx() ax2.bar(df['日期'], df['降水量'], alpha=0.3)
  1. 交互式可视化方案:
import plotly.express as px fig = px.line(df, x='日期', y=['高温','低温'], title='温度变化趋势') fig.show()

6. 项目扩展方向

在实际应用中,这个基础项目可以延伸出多个有价值的扩展:

  1. 多城市对比分析:采集3-5个城市数据,比较气候差异
  2. 气象预警分析:结合极端天气事件,分析预警规律
  3. 预测模型构建:使用历史数据训练简单的温度预测模型
  4. 自动化报告生成:用Python-docx自动生成月度气象报告

我最近完成的一个扩展项目是结合天气数据与农产品价格数据,帮助客户分析气候因素对市场价格的影响。关键是要明确分析目标,避免陷入数据采集的细节而忽略业务价值。