兄弟们,我们是冠军,EDG是S11世界总冠军!
世界上没有无法征服的高峰,只有永不退缩一往无前的骑士!
真的,我赛前的心理预期非常低,我一直想的是EDG能赢一局就好,赢两局血赚,结果一路打到第五局的时候,我心理已经就一个词:冠军。
整个比赛过程深受全网关注:
微博热搜第一名,显示有8194万观看;
bilibili平台,吸引3.5亿人气,满屏弹幕;
腾讯视频600万人看过;
斗鱼和虎牙平台的热度也是居高不下;
赛后,央视新闻也发微博祝贺EDG战队夺冠;
既然比赛热度这么高,那大家都说了点啥?
我们用Python分析了31000条弹幕数据,满屏都是粉丝的祝福与感受。
首先我们打开B站热门排行榜,我们先来分析网页,找到评论数据所在地方。
目标获取
我们此次获取的目标是EDG我们是冠军视频的60000+评论
网页分析
首先我们F12找到如下评论数据
观察发现,我们所有爬取的评论信息全在在一个不规则的json文件当中
不规则是因为前面多了一串jQuery的字符串,后面多了一个')'
正中内容才是一个标准的json数据集。
发送请求
先来获取单页数据,在此之前我们先要获取浏览器headers信息,防止被网站反爬。
url = f'https://api.bilibili.com/x/v2/reply/main?callback=jQuery17205690584633020348_{1636423610452 + page}&jsonp=jsonp&next={page}&type=1&oid=336587753&mode=3&plat=1&_={time_thick}'
headers = {
"cookie": "b_ut=-1; i-wanna-go-back=-1; _uuid=19DF1EDB-20B7-FF74-A700-9DF415B2429530977infoc; buvid3=AAD6C6C7-FB31-40E7-92EC-7A6A7ED3920C148814infoc; sid=jzp2723t; fingerprint=2e74a5bc11a3adec2616987dde475370; buvid_fp=AAD6C6C7-FB31-40E7-92EC-7A6A7ED3920C148814infoc; buvid_fp_plain=AAD6C6C7-FB31-40E7-92EC-7A6A7ED3920C148814infoc; DedeUserID=434541726; DedeUserID__ckMd5=448fda6ab5098e5e; SESSDATA=1fe46ad7%2C1651971297%2Ceb583*b1; bili_jct=5bcd45718996ac402a29c7f23110984d; video_page_version=v_new_home_14; blackside_state=1; rpdid=|(u)YJlJmmu|0J'uYJYRummJm; bp_t_offset_434541726=590903773845625600; bp_video_offset_434541726=590903773845625600; bsource=search_baidu; innersign=1; CURRENT_BLACKGAP=0; CURRENT_FNVAL=80",
'referer': 'https://www.bilibili.com/video/BV12R4y1E7kn?spm_id_from=333.934.0.0',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.8 Safari/537.36'
}
resp = requests.get(url, headers=headers)
if resp.status_code == requests.codes.ok:
# 获取resp响应
text = resp.text
如我们所想,获取到的数据就是不个不规则的json数据,接下来我们将其转换成标准版的json数据便于我们接下来获取数据
如下我们得到了一个标准的json数据集,接下来就可以获取我们的评论数据了
# 获取resp响应
text = resp.text[41:-1]
# 转换json格式
json_data = json.loads(text)
ic(json_data)
'''
ic| json_data: {'code': 0,
'data': {'assist': 0,
'blacklist': 0,
'callbacks': None,
'cm': {},
'cm_info': {'ads': None},
'config': {'read_only': False,
'show_del_log': True,
'show_up_flag': True,
'showadmin': 1,
'showentry': 1,
'showfloor': 0,
'showtopic': 1},
'control': {'answer_guide_android_url': 'https://www.bilibili.com/h5/newbie/entry?navhide=1&re_src=6',
'answer_guide_icon_url': 'http://i0.hdslb.com/bfs/emote/96940d16602cacbbac796245b7bb99fa9b5c970c.png',
'answer_guide_ios_url': 'https://www.bilibili.com/h5/newbie/entry?navhide=1&re_src=12',
'answer_guide_text': '需要升级成为lv2会员后才可以评论,先去答题转正吧!',
'bg_text': '看看下面~来发评论吧',
'child_input_text': '',
'giveup_input_text': '不发没关系,请继续友善哦~',
'input_disable': False,
'root_input_text': '发一条友善的评论',
'show_text': '',
'show_type': 1,
'web_selection': False},
'''
我们此次要获取的数据有如下五个,评论作者、性别、时间、评论点赞人数和评论内容
# 获取所有评论
datas = json_data['data']['replies']
for item in datas:
# 评论者
name = item['member']['uname']
# 性别
sex = item['member']['sex']
# 评论时间
ctime = item.get('ctime')
content_time = time.strftime('%Y-%m-%d %H:%M', time.localtime(ctime))
# 点赞人数
star = item['like']
# 评论内容
cmts = item['content']['message']
数据存储
我们后续还要对数据进行清洗处理然后可视化分析,所以这里我们使用openpyxl将数据存储在excel中。
这个应该都是老生常谈了,毕竟之前我们经常都是将数据存储在excel中,
直接看代码
ws = op.Workbook()
wb = ws.create_sheet(index=0)
wb.cell(row=1, column=1, value='评论者')
wb.cell(row=1, column=2, value='性别')
wb.cell(row=1, column=3, value='评论时间')
wb.cell(row=1, column=4, value='点赞人数')
wb.cell(row=1, column=5, value='评论内容')
count = 2
wb.cell(row=count, column=1, value=name)
wb.cell(row=count, column=2, value=sex)
wb.cell(row=count, column=3, value=content_time)
wb.cell(row=count, column=4, value=star)
wb.cell(row=count, column=5, value=cmts)
count += 1
ws.save('哔哩哔哩.xlsx')
效果如下:
多页获取
单页数据获取完毕,接下来我们分析多页数据。你们呢一般是如何分析的?
我是直接获取多个url进行对比查找规律
https://api.bilibili.com/x/v2/reply/main?callback=jQuery17205690584633020348_1636423610452&jsonp=jsonp&next=0&type=1&oid=336587753&mode=3&plat=1&_=1636423611589
https://api.bilibili.com/x/v2/reply/main?callback=jQuery17205690584633020348_1636423610453&jsonp=jsonp&next=2&type=1&oid=336587753&mode=3&plat=1&_=1636424178396
https://api.bilibili.com/x/v2/reply/main?callback=jQuery17205690584633020348_1636423610454&jsonp=jsonp&next=3&type=1&oid=336587753&mode=3&plat=1&_=1636424183583
https://api.bilibili.com/x/v2/reply/main?callback=jQuery17205690584633020348_1636423610455&jsonp=jsonp&next=4&type=1&oid=336587753&mode=3&plat=1&_=1636424187787
规律如下:
规律找到了所以我们构造多页链接如下,先获取它个100页~
for page in range(1, 100 + 1):
print(f'-----------------正在爬取第{page}页数据-----------------')
time_thick = int(time.time() * 1000)
url = f'https://api.bilibili.com/x/v2/reply/main?callback=jQuery17205690584633020348_{1636423610452 + page}&jsonp=jsonp&next={page}&type=1&oid=336587753&mode=3&plat=1&_={time_thick}'
100页数据已经成功存储到excel中,如下:
数据预处理
我们先对评论数据先做清洗处理。
去重去空,然后随机抽样五条数据进行展示
# 读取数据
rcv_data = pd.read_excel('哔哩哔哩.xlsx')
# 删除重复记录和缺失值
rcv_data = rcv_data.drop_duplicates()
rcv_data = rcv_data.dropna()
# 抽样展示
print(rcv_data.sample(5))
'''
评论者 性别 评论时间 点赞人数 评论内容
9 Doctor罗洛洛 保密 2021-11-07 10:44 10832 恭喜,寻思啥呢,赶紧把麦克风给大伙放出来 兄弟萌送我上去,点赞里抽两个冠军皮肤记住我
820 变成光守护嘉然的貢品 保密 2021-11-07 02:32 157 路人差不多得了,求各位在宿舍的大爷们,大娘们,别乱叫了,有些淀粉要睡觉,有些不敢看直播的老淀...
960 华为云 保密 2021-11-08 00:22 5 热词系列我们是冠军热词系列燃起来了
923 嘉然今天吃华为 保密 2021-11-07 16:09 5 点赞抽一个送我大会员
849 我的小鱼你睡着了对吧 女 2021-11-07 02:13 225 那一年的总决赛是对,最终比分31。当时我看见坐在椅子上笑得合不拢嘴,那一刻我就在想如果我能对...
'''
词频展示
我们从评论数据中获取到前十大高频词汇如下:
# 词频设置
all_words = [word for word in result.split(' ') if len(word) > 1 and word not in stop_words]
wordcount = Counter(all_words).most_common(10)
x1_data, y1_data = list(zip(*wordcount))
print(x1_data)
print(y1_data)
'''
('冠军', '点赞', '中国', '人送', '年度', '夺冠', '关注', '评论', '个人', '多少')
(749, 687, 470, 315, 254, 220, 151, 149, 141, 123)
'''
分别使用气泡图、树状图、饼图、突出显示表和折线图分别来可视化。
词云展示
接下来我们使用stylecloud来生成多样形式的词云
wordlist = jieba.cut(''.join(c_title))
result = ' '.join(wordlist)
pic = 'img1.jpg'
gen_stylecloud(text=result,
icon_name='fab fa-windows',
font_path='msyh.ttc',
background_color='white',
output_name=pic,
)
print('绘图成功!')
1. 本文详细介绍了如何使用python获取B站评论信息并且存储处理数据到最后的可视化
有兴趣的读者可以尝试自己动手练习一下。
2. 本文仅供读者学习使用,不做其他用途!