兄弟们,我们是冠军,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. 本文仅供读者学习使用,不做其他用途!