手把手教你用Python爬虫实现数据可视化(实战向)

一、爬虫+可视化=超能力组合?

最近有个00后实习生问我:“哥,光会爬数据有啥用?还不是一堆乱码!”(笑)这问题可太真实了!今天咱们就来解锁爬虫的正确打开方式——让冷冰冰的数据变成会说话的图表!

先剧透下今天的知识地图:

  1. 快速抓取实时天气数据 🌦️
  2. 数据清洗的三大绝招
  3. 用Pyecharts制作动态图表
  4. 避坑指南(都是血泪教训)

二、实战开始!抓取天气数据

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错误
  • 解决方案金字塔:
    1. 更换User-Agent(推荐fake_useragent库)
    2. 添加Referer头
    3. 使用代理IP(推荐快代理的免费API)
    4. 设置请求间隔时间(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搭建监控系统

七、说点心里话

最近帮公司做疫情数据可视化,发现几个真理:

  1. 干净的数据比复杂算法更重要(80%时间在清洗数据!)
  2. 动态图表真的能让老板眼前一亮
  3. 学会用try...except能少掉50%头发

最后送大家一句话:爬虫不是目的,让数据产生价值才是终极奥义!下次咱们可以聊聊怎么用爬虫+机器学习预测股票(当然只是技术探讨哈)~

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值