【爬虫+数据清洗+可视化】用Python分析“淄博烧烤“的评论数据
一、背景介绍
您好,我是@马哥python说 ,一枚10年程序猿。
自从2023.3月以来,"淄博烧烤"现象持续占领热搜流量,体现了后疫情时代众多网友对人间烟火气的美好向往,本现象级事件存在一定的数据分析实践意义。
我用Python爬取并分析了B站众多网友的评论,并得出一系列分析结论。
二、爬虫代码
2.1 展示爬取结果
首先,看下部分爬取数据:

爬取字段含:视频链接、评论页码、评论作者、评论时间、IP属地、点赞数、评论内容。
2.2 爬虫代码讲解
导入需要用到的库:
import requests # 发送请求
import pandas as pd # 保存csv文件
import os # 判断文件是否存在
import time
from time import sleep # 设置等待,防止反爬
import random # 生成随机数
定义一个请求头:
# 请求头
headers = {
'authority': 'api.bilibili.com',
'accept': 'application/json, text/plain, */*',
'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
# 需定期更换cookie,否则location爬不到
'cookie': "需换成自己的cookie值",
'origin': 'https://www.bilibili.com',
'referer': 'https://www.bilibili.com/video/BV1FG4y1Z7po/?spm_id_from=333.337.search-card.all.click&vd_source=69a50ad969074af9e79ad13b34b1a548',
'sec-ch-ua': '"Chromium";v="106", "Microsoft Edge";v="106", "Not;A=Brand";v="99"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Windows"',
'sec-fetch-dest': 'empty',
'sec-fetch-mode': 'cors',
'sec-fetch-site': 'same-site',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.47'
}
请求头中的cookie是个很关键的参数,如果不设置cookie,会导致数据残缺或无法爬取到数据。
那么cookie如何获取呢?打开开发者模式,见下图:

由于评论时间是个十位数:

所以开发一个函数用于转换时间格式:
def trans_date(v_timestamp):
"""10位时间戳转换为时间字符串"""
timeArray = time.localtime(v_timestamp)
otherStyleTime = time.strftime("%Y-%m-%d %H:%M:%S", timeArray)
return otherStyleTime
向B站发送请求:
response = requests.get(url, headers=headers, ) # 发送请求
接收到返回数据了,怎么解析数据呢?看一下json数据结构:

0-19个评论,都存放在replies下面,replies又在data下面,所以,这样解析数据:
data_list = response.json()['data']['replies'] # 解析评论数据
这样,data_list里面就是存储的每条评论数据了。
接下来吗,就是解析出每条评论里的各个字段了。
我们以评论内容这个字段为例:
comment_list = [] # 评论内容空列表
# 循环爬取每一条评论数据
for a in data_list:
# 评论内容
comment = a['content']['message']
comment_list.append(comment)
其他字段同理,不再赘述。
最后,把这些列表数据保存到DataFrame里面,再to_csv保存到csv文件,持久化存储完成:
# 把列表拼装为DataFrame数据
df = pd.DataFrame({
'视频链接': 'https://www.bilibili.com/video/' + v_bid,
'评论页码': (i + 1),
'评论作者': user_list,
'评论时间': time_list,
'IP属地': location_list,
'点赞数': like_list,
'评论内容': comment_list,
})
# 把评论数据保存到csv文件
df.to_csv(outfile, mode='a+', encoding='utf_8_sig', index=False, header=header)
注意,加上encoding='utf_8_sig',否则可能会产生乱码问题!
下面,是主函数循环爬取部分代码:(支持多个视频的循环爬取)
# 随便找了几个"淄博烧烤"相关的视频ID
bid_list = ['BV1dT411p7Kd', 'BV1Ak4y1n7Zb', 'BV1BX4y1m7jP']
# 评论最大爬取页(每页20条评论)
max_page = 30
# 循环爬取这几个视频的评论
for bid in bid_list:
# 输出文件名
outfile = 'b站评论_{}.csv'.format(now)
# 转换aid
aid = bv2av(bid=bid)
# 爬取评论
get_comment(v_aid=aid, v_bid=bid)
三、可视化代码
为了方便看效果,以下代码采用jupyter notebook进行演示。
3.1 读取数据
用read_csv读取刚才爬取的B站评论数据:

查看前3行及数据形状:

3.2 数据清洗
处理空值及重复值:

3.3 可视化
3.3.1 IP属地分析-柱形图

结论:从柱形图来看,山东位居首位,说明淄博烧烤也受到本地人大力支持,其次是四川、广东等地讨论热度最高。
3.3.2 评论时间分析-折线图

结论:从折线图来看,4月26日左右达到讨论热度顶峰,其次是5月1号即五一劳动节假期第一天,大量网友的"进淄赶烤"也制造了新的讨论热度。
3.3.3 点赞数分布-箱线图
由于点赞数大部分为0或个位数情况,个别点赞数到达成千上万,箱线图展示效果不佳,因此,仅提取点赞数<10的数据绘制箱线图。

结论:从箱线图来看,去除超过10个点赞数评论数据之后,大部分评论集中在0-3个点赞之间,也就是只有少量评论引起网友的点赞共鸣和认可。
3.3.4 评论内容-情感分布饼图
针对中文评论数据,采用snownlp开发情感判定函数:

情感分布饼图,如下:

结论:从饼图来看,积极和消极分别占比不到一半,说明广大网友在认可淄博烧烤现象的同时,也有大量负面讨论存在,比如讨论烧烤的价格略高、住宿条件欠佳、环境污染等负面话题。
3.3.5 评论内容-词云图
由于评论内容中存在很多"啊"、"的"、"了"等无意义的干扰词,影响高频词的提取,因此,采用哈工大停用词表作为停用词词典,对干扰词进行屏蔽:

然后,绘制词云图:

结论:从词云图来看,"淄博"、"烧烤"、"山东"、"好吃"、"城市"、"好"、"物价"等正面词汇字体较大,体现出众多网友对以「淄博烧烤」为代表的后疫情时代人间烟火的美好向往。
四、技术总结
「淄博烧烤」案例完整开发流程:
- requests爬虫
- json解析
- pandas保存csv
- pandas数据清洗
- snownlp情感分析
- matplotlib可视化,含:
1)IP属地分析-柱形图Bar
2)评论时间分析-折线图Line
3)点赞数分布-箱线图Boxplot
4)评论内容-情感分布饼图Pie
5)评论内容-词云图WordCloud
五、演示视频
代码演示视频:https://www.bilibili.com/video/BV18s4y1B71z
六、完整源码
完整源码:【爬虫+数据清洗+可视化分析】舆情分析"淄博烧烤"的B站评论
我是 @马哥python说 ,持续分享python源码干货中!
【爬虫+数据清洗+可视化】用Python分析“淄博烧烤“的评论数据的更多相关文章
- 【爬虫+数据清洗+可视化分析】舆情分析哔哩哔哩"狂飙"的评论
目录 一.背景介绍 二.爬虫代码 2.1 展示爬取结果 2.2 爬虫代码讲解 三.可视化代码 3.1 读取数据 3.2 数据清洗 3.3 可视化 3.3.1 IP属地分析-柱形图 3.3.2 评论时间 ...
- 【可视化分析案例】用python分析B站Top100排行榜数据
一.数据源 之前,我分享过一期爬虫,用python爬取Top100排行榜: 最终数据结果,是这样的: 在此数据基础上,做python可视化分析. 二.数据读取 首先,读取数据源: # 读取csv数据 ...
- 用Python分析北京市蛋壳公寓租房数据
本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 近期,蛋壳公寓"爆雷"事件持续发酵,期间因拖欠房东房租与租客退款,蛋壳公寓陷入讨 ...
- EDG夺冠!用Python分析22.3万条数据:粉丝都疯了!
一.EDG夺冠信息 11月6日,在英雄联盟总决赛中,EDG战队以3:2战胜韩国队,获得2021年英雄联盟全球总决赛冠军,这个比赛在全网各大平台也是备受瞩目: 1.微博热搜第一名,截止2021-11-1 ...
- 2020不平凡的90天,Python分析三个月微博热搜数据带你回顾
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:刘早起早起 PS:如有需要Python学习资料的小伙伴可以加点击下方链 ...
- 【Python爬虫案例学习】Python爬取天涯论坛评论
用到的包有requests - BeautSoup 我爬的是天涯论坛的财经论坛:'http://bbs.tianya.cn/list.jsp?item=develop' 它里面的其中的一个帖子的URL ...
- Python爬虫入门教程 32-100 B站博人传评论数据抓取 scrapy
1. B站博人传评论数据爬取简介 今天想了半天不知道抓啥,去B站看跳舞的小姐姐,忽然看到了评论,那就抓取一下B站的评论数据,视频动画那么多,也不知道抓取哪个,选了一个博人传跟火影相关的,抓取看看.网址 ...
- Python爬虫实战练习:爬取美团旅游景点评论数据
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 今年的国庆节还有半个月就要来了,相信很多的小伙伴还是非常期待这个小长假的.国庆节是一年中的小 ...
- 一篇文章教会你用Python爬取淘宝评论数据(写在记事本)
[一.项目简介] 本文主要目标是采集淘宝的评价,找出客户所需要的功能.统计客户评价上面夸哪个功能多,比如防水,容量大,好看等等. 很多人学习python,不知道从何学起.很多人学习python,掌握了 ...
- 五月天的线上演唱会你看了吗?用Python分析网友对这场线上演唱会的看法
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:CDA数据分析师 豆瓣9.4分!这场线上演唱会到底多好看? 首先让我 ...
随机推荐
- 依图在实时音视频中语音处理的挑战丨RTC Dev Meetup
前言 「语音处理」是实时互动领域中非常重要的一个场景,在声网发起的「RTC Dev Meetup丨语音处理在实时互动领域的技术实践和应用」 活动中,来自百度.寰宇科技和依图的技术专家,围绕该话题进行了 ...
- Java 序列化的缺点
Java 提供的对象输入流(ObjectInputStream)和输出流(ObjectOutputStream),可以直接把 Java 对象作为可存储的字节数据写入文件,也可以传输到网络上.对于程序员 ...
- 集成Health Kit时因证书问题出现错误码50063的解决方案
一.问题描述及操作 应用集成Health Kit SDK后,在华为手机上进行登录授权时,返回错误码50063. 1.查看相关错误码.'50063'在Health Kit错误码中的描述是"安装 ...
- 【LeetCode动态规划#05】背包问题的理论分析(基于代码随想录的个人理解,多图)
背包问题 问题描述 背包问题是一系列问题的统称,具体包括:01背包.完全背包.多重背包.分组背包等(仅需掌握前两种,后面的为竞赛级题目) 下面来研究01背包 实际上即使是最经典的01背包,也不会直接出 ...
- Mac基本命令操作
Mac使用常见命令 删除空目录:rmdir 目录 删除文件夹:rm -rf 文件夹 创建一个文件夹:mkdir 文件名 创建一个文件:touch 文件 修改一个文件:vi 文件名 重命名文件 mv 原 ...
- 人人都学会APP开发 提高就业竞争力 简单实用APP应用 安卓浏览器APP 企业内部通用APP制作 制造业通用APP
安卓从2009年开始流程于手机.平板,已经是不争的非常强大生产力工具,更为社会创造非常高的价值, 现在已经是202X年,已经十几年的发展,安卓平台已经无所不在. 因此建议人人都学学APP制作,简易入门 ...
- vue之过滤、筛选功能的实现
目录 需求 代码 需求 给定一个列表(模拟数据),根据用户输入,自动筛选输入的内容并输出到屏幕 代码 <!DOCTYPE html> <html lang="en" ...
- 迁移学习《Cluster-Guided Semi-Supervised Domain Adaptation for Imbalanced Medical Image Classification》
论文信息 论文标题:Cluster-Guided Semi-Supervised Domain Adaptation for Imbalanced Medical Image Classificati ...
- [git] 规范Commit格式
规范Commit格式 Jenkins根据对比当次构建和上次构建的Commit信息来生成ChangeLog,但因为我们目前的提交不够规范,经常有类似"#","update& ...
- Linux(五)用户管理与文件权限
1 常用的基本命令 Shell可以看作一个命令解释器,为我们提供一个交互式的文本控制台界面,可以通过终端控制台来输入命令,由shell进行解释并最终交给linux内核运行.可以看作用户和硬件的桥梁. ...