手把手教你用Python爬取全国天气数据(附可视化技巧)
爬虫虽好,可不要贪杯哦~(你懂的!遵守网站robots协议控制请求频率不要用于商业用途及时删除敏感数据遇到问题欢迎评论区交流,代码亲测有效,赶紧跑起来试试吧!
·
文章目录
一、需求分析(先想清楚要什么!)
做爬虫项目第一步永远不是写代码!!!先明确目标:我们要获取中国主要城市最近7天的天气数据,包含以下信息:
- 城市名称(比如北京、上海)
- 日期(2023-12-01格式)
- 最高/最低温度(带摄氏度符号)
- 天气状况(晴/多云/雨等)
- 风力风向(东北风3-4级)
二、技术选型(工具选对,事半功倍!)
- Requests库:发送HTTP请求的神器(比urllib好用100倍!)
- BeautifulSoup4:HTML解析界的瑞士军刀
- Pandas:数据处理的扛把子
- Pyecharts:可视化装X利器(比Matplotlib更酷炫!)
安装命令(先准备好这些武器):
pip install requests beautifulsoup4 pandas pyecharts
三、实战开始(系好安全带!)
3.1 锁定目标网站
推荐使用中国天气网(www.weather.com.cn),该网站:
- 数据权威可靠
- 页面结构清晰
- 反爬措施相对宽松(新手友好!)
3.2 网页结构分析(关键步骤!)
以北京天气页面为例,按F12打开开发者工具:
- 城市名称在
<div class="crumbs fl">下的最后一个<a>标签 - 日期在
<ul class="t clearfix">下的<h1>标签 - 温度数据藏在
<div class="tem">的<span>和<i>标签 - 天气状况在
<p class="wea">
3.3 代码实现(核心代码来了!)
import requests
from bs4 import BeautifulSoup
import pandas as pd
def get_weather(city_code):
url = f'http://www.weather.com.cn/weather/{city_code}.shtml'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
try:
response = requests.get(url, headers=headers)
response.encoding = 'utf-8'
soup = BeautifulSoup(response.text, 'html.parser')
# 解析城市名称
city = soup.select('.crumbs.fl a')[-1].text
# 解析7天数据
weather_list = []
for item in soup.select('.t.clearfix li'):
date = item.h1.text
temp = item.select_one('.tem').text.strip().replace('\n', '/')
wea = item.select_one('.wea').text
wind = item.select_one('.win i').text
weather_list.append({
'城市': city,
'日期': date,
'温度': temp,
'天气': wea,
'风力': wind
})
return pd.DataFrame(weather_list)
except Exception as e:
print(f'抓取出错啦!错误信息:{e}')
return None
# 示例:获取北京天气(城市代码101010100)
df = get_weather('101010100')
print(df.head())
3.4 数据存储(存好了才安心)
把数据保存到CSV:
df.to_csv('weather_data.csv', index=False, encoding='utf-8-sig')
四、可视化展示(让数据说话!)
4.1 温度变化折线图
from pyecharts.charts import Line
line = Line()
line.add_xaxis(df['日期'].tolist())
line.add_yaxis('最高温度', [int(x.split('/')[0]) for x in df['温度']])
line.add_yaxis('最低温度', [int(x.split('/')[1]) for x in df['温度']])
line.set_global_opts(title_opts={"text": "北京近7日温度变化"})
line.render('temperature.html')
4.2 天气分布饼图
from pyecharts.charts import Pie
weather_count = df['天气'].value_counts()
pie = Pie()
pie.add("", [list(z) for z in zip(weather_count.index, weather_count.values)])
pie.set_global_opts(title_opts={"text": "天气类型分布"})
pie.render('weather_pie.html')
五、避坑指南(血泪经验!)
- User-Agent一定要设置!否则秒被识别为爬虫
- 注意编码格式!中文网站常用gbk/gb2312/utf-8
- 控制请求频率!加个time.sleep(2)更安全
- 异常处理要完善!网络波动、元素不存在都要考虑
- 城市代码表需要提前整理(文末附常见城市代码)
六、扩展玩法(玩点更酷的!)
- 定时爬取:用schedule库每天自动抓取
- 发送邮件:用smtplib把天气数据发到自己邮箱
- 微信推送:通过Server酱推送到手机
- 语音播报:用pyttsx3实现语音天气预报
附:常用城市代码表
| 城市 | 代码 |
|---|---|
| 北京 | 101010100 |
| 上海 | 101020100 |
| 广州 | 101280101 |
| 深圳 | 101280601 |
| 杭州 | 101210101 |
(完整城市代码表可以访问国家气象信息中心官网获取)
写在最后
爬虫虽好,可不要贪杯哦~(你懂的!)建议:
- 遵守网站robots协议
- 控制请求频率
- 不要用于商业用途
- 及时删除敏感数据
遇到问题欢迎评论区交流,代码亲测有效,赶紧跑起来试试吧!
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)