用Python分析S11决赛EDGvsDK,教你怎么硬核吹EDG!

兄弟们,我们是冠军,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)

ifresp.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']

foritemindatas:

# 评论者

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页~

forpageinrange(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 = [wordforwordinresult.split(' ')iflen(word) >1andwordnotinstop_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. 本文仅供读者学习使用,不做其他用途!

你可能感兴趣的:(用Python分析S11决赛EDGvsDK,教你怎么硬核吹EDG!)