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

本文详述了使用Python爬取B站EDG夺冠视频的评论信息,并进行数据清洗、预处理和词频分析的过程。通过分析31000条弹幕数据,展示了粉丝的热烈反应。数据获取涉及多页链接的构造,存储于Excel文件,并通过词云和多种图表进行可视化展示,包括气泡图、树状图、饼图和折线图。
摘要由CSDN通过智能技术生成

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

途途途途

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值