文章目录
一、爬虫+可视化=超能力组合?
最近有个00后实习生问我:“哥,光会爬数据有啥用?还不是一堆乱码!”(笑)这问题可太真实了!今天咱们就来解锁爬虫的正确打开方式——让冷冰冰的数据变成会说话的图表!
先剧透下今天的知识地图:
- 快速抓取实时天气数据 🌦️
- 数据清洗的三大绝招
- 用Pyecharts制作动态图表
- 避坑指南(都是血泪教训)
二、实战开始!抓取天气数据
2.1 目标网站分析
我们以「中国天气网」为例(注意:请遵守网站robots协议),按F12打开开发者工具,发现数据藏在<ul class="t clearfix">这个标签里。
2.2 代码三件套
import requests
from bs4 import BeautifulSoup
import pandas as pd
# 伪装浏览器(重要!)
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
url = 'http://www.weather.com.cn/weather/101280101.shtml'
response = requests.get(url, headers=headers)
response.encoding = 'utf-8' # 解决中文乱码
soup = BeautifulSoup(response.text, 'html.parser')
weather_list = soup.find('ul', class_='t clearfix').find_all('li')
data = []
for day in weather_list:
date = day.find('h1').text
weather = day.find('p', class_='wea').text
temp = day.find('p', class_='tem').text.replace('\n', '')
data.append([date, weather, temp])
df = pd.DataFrame(data, columns=['日期', '天气', '温度'])
2.3 遇到反爬怎么办?!
- 现象:返回403错误
- 解决方案金字塔:
- 更换User-Agent(推荐fake_useragent库)
- 添加Referer头
- 使用代理IP(推荐快代理的免费API)
- 设置请求间隔时间(time.sleep(random.uniform(1,3)))
三、数据清洗的三大绝招
3.1 温度数据拆分
原始数据:“25℃/18℃” → 拆分为最高温和最低温
# 用正则表达式提取数字
df['最高温'] = df['温度'].apply(lambda x: re.findall(r'\d+', x)[0])
df['最低温'] = df['温度'].apply(lambda x: re.findall(r'\d+', x)[1])
3.2 异常值处理
发现某天温度记录为"null"怎么办?
# 填充相邻两天的平均值
df['最高温'] = pd.to_numeric(df['最高温'], errors='coerce')
df['最高温'].fillna(method='ffill', inplace=True)
3.3 数据存储
推荐两种方式:
# CSV格式(适合小数据)
df.to_csv('weather.csv', index=False)
# MySQL存储(适合长期积累)
from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://user:password@localhost:3306/weather')
df.to_sql('daily', con=engine, if_exists='append')
四、让数据动起来!Pyecharts可视化
4.1 安装这个神器
pip install pyecharts
4.2 折线图代码示例
from pyecharts.charts import Line
line = Line()
line.add_xaxis(df['日期'].tolist())
line.add_yaxis("最高温", df['最高温'].tolist())
line.add_yaxis("最低温", df['最低温'].tolist())
line.set_global_opts(title_opts={"text": "广州七日气温变化"})
# 生成HTML文件
line.render("temperature.html")
4.3 高级技巧:动态温度区间
# 添加辅助线
line.extend_axis(
yaxis=opts.AxisOpts(
type_="value",
name="体感温度",
min_=15,
max_=35,
position="right"
)
)
# 添加自定义提示框
line.set_series_opts(
label_opts=opts.LabelOpts(is_show=False),
markpoint_opts=opts.MarkPointOpts(
data=[
opts.MarkPointItem(type_="max", name="最高温"),
opts.MarkPointItem(type_="min", name="最低温")
]
)
)
五、新手必看的避坑指南
5.1 法律红线(超级重要!)
- 不要爬取个人隐私数据
- 遵守robots.txt协议
- 控制请求频率(建议≥3秒/次)
5.2 常见报错解决方案
- 乱码问题:检查网页编码,尝试
response.encoding = 'gbk' - SSL错误:
requests.get(url, verify=False)(临时方案) - 元素找不到:先用
print(soup.prettify())确认网页结构
5.3 性能优化技巧
- 使用多线程(推荐ThreadPoolExecutor)
- 缓存已爬取页面(用Shelve模块)
- 增量式爬虫(记录最后爬取时间)
六、还能怎么玩?创意拓展
- 结合微信机器人:每天推送天气图表到微信群
- 历史数据对比:分析近五年气温变化
- 预警系统:当温度超过阈值时发送邮件提醒
- 可视化大屏:用Flask+Echarts搭建监控系统
七、说点心里话
最近帮公司做疫情数据可视化,发现几个真理:
- 干净的数据比复杂算法更重要(80%时间在清洗数据!)
- 动态图表真的能让老板眼前一亮
- 学会用
try...except能少掉50%头发
最后送大家一句话:爬虫不是目的,让数据产生价值才是终极奥义!下次咱们可以聊聊怎么用爬虫+机器学习预测股票(当然只是技术探讨哈)~
611

被折叠的 条评论
为什么被折叠?



