公司动态
Python爬虫实战:天气数据采集与分析全流程
1. 项目概述爬取与分析全年天气数据的价值爬取全年天气数据并进行可视化分析是Python爬虫与数据分析结合的经典实战项目。这个项目不仅能掌握网络数据采集的核心技术更能通过真实数据理解气象变化规律。我去年为某农业科技公司完成过类似项目他们需要近五年全国主要城市的温度、降水数据来优化种植方案。从技术角度看完整的天气数据分析流程包含三个关键环节数据采集爬虫、数据清洗Pandas、数据呈现可视化。每个环节都有需要特别注意的技术细节比如反爬策略应对、异常值处理、图表类型选择等。这个项目特别适合已经掌握Python基础语法想向数据分析方向发展的学习者。2. 核心工具与技术栈选择2.1 爬虫工具选型RequestsBeautifulSoup组合是爬取静态网页的首选方案。相比Scrapy框架这个组合更轻量且学习曲线平缓。我在实际项目中测试过对国内主流天气网站的成功率能达到98%以上。关键配置如下headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36, Accept-Language: zh-CN,zh;q0.9 } response requests.get(url, headersheaders, timeout10) soup BeautifulSoup(response.text, html.parser)重要提示务必设置合理的请求间隔建议3-5秒避免触发反爬机制导致IP被封禁2.2 数据处理库选择Pandas是数据清洗和分析的不二之选。其DataFrame结构特别适合处理时间序列数据。以下是典型的数据处理流程缺失值处理df.fillna(methodffill)异常值修正df[df[温度]50] df[温度].median()数据转换df[日期] pd.to_datetime(df[日期])2.3 可视化方案对比MatplotlibSeaborn组合提供了最大的灵活性。下表对比了三种主流可视化方案工具学习曲线交互性美观度适用场景Matplotlib陡峭弱一般基础图表Seaborn中等弱优秀统计图表Plotly平缓强优秀网页交互3. 完整爬虫实现流程3.1 目标网站分析与URL构造以中国天气网为例其历史数据页面URL有固定规律。通过分析发现城市代码北京为101010100月份参数202301表示2023年1月页面结构数据在div classtqtongji2下的表格中构造全年URL的代码示例base_url http://lishi.tianqi.com/{city}/{month}.html months [f2023{i:02d} for i in range(1,13)] urls [base_url.format(citybeijing, monthm) 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(fweather_{month}.csv, indexFalse, encodingutf_8_sig) # 合并全年数据 full_df pd.concat([pd.read_csv(f) for f in glob(weather_*.csv)]) full_df.to_csv(full_year_weather.csv, indexFalse)4. 数据分析与可视化实战4.1 数据清洗关键步骤真实天气数据常存在以下问题需要处理温度单位不一致有的带℃符号有的没有极端异常值如温度记录为999日期格式混乱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[日期], errorscoerce) df df.dropna(subset[日期])4.2 可视化分析案例4.2.1 温度变化趋势图plt.figure(figsize(12,6)) sns.lineplot(datadf, x日期, y高温, colorr) sns.lineplot(datadf, x日期, y低温, colorb) plt.title(2023年温度变化趋势) plt.ylabel(温度(℃)) plt.grid(True)4.2.2 降水量分布图plt.figure(figsize(10,6)) sns.barplot(datadf, x月份, y降水量) plt.title(各月降水量对比) plt.ylabel(毫米)4.2.3 气象要素相关性分析sns.heatmap(df[[高温,低温,降水量,风速]].corr(), annotTrue, cmapcoolwarm) plt.title(气象要素相关性矩阵)5. 常见问题与解决方案5.1 反爬虫应对策略问题现象可能原因解决方案返回403错误User-Agent被识别轮换多个常用UA获取到验证码IP请求频率过高增加延迟使用代理IP数据为空页面结构变化更新CSS选择器5.2 数据质量问题处理缺失日期补全技巧full_dates pd.date_range(start2023-01-01, end2023-12-31) df df.set_index(日期).reindex(full_dates).reset_index()异常值检测方法# 使用3σ原则检测 mean, std df[温度].mean(), df[温度].std() df[(df[温度] mean3*std) | (df[温度] mean-3*std)]5.3 可视化优化技巧双Y轴温度降水图fig, ax1 plt.subplots(figsize(12,6)) ax1.plot(df[日期], df[高温], r-) ax2 ax1.twinx() ax2.bar(df[日期], df[降水量], alpha0.3)交互式可视化方案import plotly.express as px fig px.line(df, x日期, y[高温,低温], title温度变化趋势) fig.show()6. 项目扩展方向在实际应用中这个基础项目可以延伸出多个有价值的扩展多城市对比分析采集3-5个城市数据比较气候差异气象预警分析结合极端天气事件分析预警规律预测模型构建使用历史数据训练简单的温度预测模型自动化报告生成用Python-docx自动生成月度气象报告我最近完成的一个扩展项目是结合天气数据与农产品价格数据帮助客户分析气候因素对市场价格的影响。关键是要明确分析目标避免陷入数据采集的细节而忽略业务价值。