文章目录
前言:为什么选择天气数据?
最近帮学妹做课程设计(她居然想用Excel手动录入天气数据!),果断祭出Python爬虫大法。相比其他数据源,天气数据有三大优势:① 数据更新频率高 ② 结构化程度好 ③ 学习价值大(包含时间、地点、数值多维信息)!!!
一、准备你的"挖矿工具"
1.1 基础装备清单
- Python 3.8+(别用老版本自找麻烦)
- requests库(网络请求必备神器)
- BeautifulSoup4(HTML解析老司机)
- pandas(数据整理大杀器)
- 你的浏览器开发者工具(F12打开新世界)
1.2 超实用技巧
# 安装依赖一条龙
pip install requests bs4 pandas --user -i https://pypi.tuna.tsinghua.edu.cn/simple
(重要提示)国内用户一定要用清华镜像源!速度直接起飞🛫
二、锁定目标网站
这里以【中国天气网】为例(www.weather.com.cn),注意看它的robots.txt文件:
User-agent: *
Disallow: /e/
Disallow: /m/
(划重点)我们要爬的市级页面在/www/weather/目录下,完全合规!!!
三、实战代码分解
3.1 获取网页源代码
import requests
url = 'http://www.weather.com.cn/weather/101020100.shtml'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
response = requests.get(url, headers=headers)
response.encoding = 'utf-8' # 解决中文乱码问题
print(response.text[:500]) # 预览前500字符
(避坑指南)遇到403错误?八成是User-Agent被识别为爬虫,把headers伪装得更像浏览器!
3.2 解析数据的关键XPath
用开发者工具定位元素,发现天气数据在:
<div class="c7d">
<ul class="t clearfix">
<li>
<h1>14日(今天)</h1>
<p class="wea">多云</p>
<p class="tem">28℃</p>
</li>
<!-- 后续日期结构相同 -->
</ul>
</div>
3.3 完整解析代码
from bs4 import BeautifulSoup
soup = BeautifulSoup(response.text, 'html.parser')
weather_list = []
for item in soup.select('.t.clearfix li'):
date = item.h1.text
weather = item.select_one('.wea').text
temp = item.select_one('.tem').text.strip()
weather_list.append({
'日期': date.split('(')[0],
'星期': date.split('(')[1][:-1],
'天气': weather,
'温度': temp.replace('\n', '')
})
print(weather_list[:3]) # 查看前3天数据
(神操作)用split()处理日期中的括号,比正则表达式更简单高效!
四、数据存储与可视化
4.1 保存到CSV
import pandas as pd
df = pd.DataFrame(weather_list)
df.to_csv('shanghai_weather.csv', index=False, encoding='utf_8_sig')
4.2 温度变化折线图
import matplotlib.pyplot as plt
# 清洗温度数据
df['最高温'] = df['温度'].str.split('/').str[0].str.replace('℃','').astype(int)
df['最低温'] = df['温度'].str.split('/').str[1].str.replace('℃','').astype(int)
plt.figure(figsize=(10,6))
plt.plot(df['日期'], df['最高温'], label='最高温度', marker='o')
plt.plot(df['日期'], df['最低温'], label='最低温度', marker='x')
plt.title('上海未来7天气温趋势')
plt.xticks(rotation=45)
plt.legend()
plt.savefig('weather_trend.png')
(效果预览)生成的折线图能清晰看到温差变化,学妹直呼专业!
五、高级技巧扩展
5.1 自动获取城市代码
中国天气网的城市代码规律:
- 北京:101010100
- 上海:101020100
- 广州:101280101
发现规律了吗?前三位是区号+01结尾!
5.2 多城市批量爬取
city_codes = {
'北京': '101010100',
'上海': '101020100',
'广州': '101280101'
}
all_data = []
for city, code in city_codes.items():
url = f'http://www.weather.com.cn/weather/{code}.shtml'
# 爬取逻辑同上...
all_data.extend(city_data)
5.3 应对反爬策略
- 随机User-Agent池
- 代理IP轮换
- 随机访问间隔
- 禁用Cookie
(血泪教训)千万别用time.sleep(1)这种固定间隔,用random.uniform(0.5, 3)更安全!
六、常见问题FAQ
Q:返回的数据是乱码怎么办?
A:先检查response.encoding是否正确,或者用response.content.decode(‘utf-8’)
Q:突然获取不到数据了?
A:八成是网站改版了,用浏览器F12查看新结构,及时调整CSS选择器
Q:想爬历史天气数据?
A:试试这个接口:http://d1.weather.com.cn/calendar/2023/101020100_202303.html
(机密透露)带__参数的需要处理JavaScript加密,下次教大家破解方法!
结语:你的第一个天气数据集
按照本教程,你可以轻松获得:
- 结构化天气数据CSV文件
- 可视化温度趋势图
- 多城市天气比对能力
赶紧用这些数据做个天气分析APP,或者结合机器学习预测天气变化吧!遇到问题欢迎评论区交流~