首页 > 编程语言 >EDG夺冠,用Python分析一波:粉丝都炸锅了

EDG夺冠,用Python分析一波:粉丝都炸锅了

时间:2022-10-11 14:33:10浏览次数:70  
标签:EDG cid Python res oid 炸锅 url data final


本文禁止转载

EDG夺冠,粉丝炸锅了!

北京时间11月6日,在英雄联盟S11总决赛中,中国LPL赛区战队EDG电子竞技俱乐部以3∶2战胜韩国LCK赛区战队DK,获得2021年英雄联盟全球总决赛冠军。

这个比赛也是备受全网瞩目:

  • 微博热搜第一名,显示有8194万观看;
  • bilibili平台,吸引3.5亿人气,满屏弹幕;
  • 腾讯视频600万人看过;
  • 斗鱼和虎牙平台的热度也是居高不下;
  • 比赛结束后,央视新闻也发微博祝贺EDG战队夺冠;

EDG夺冠,用Python分析一波:粉丝都炸锅了_词云


既然比赛热度这么高,那大家都说了点啥?我们用Python分析了31000条弹幕数据,满屏都是粉丝的祝福与感受。

EDG夺冠,用Python分析一波:粉丝都炸锅了_数据_02


我们不仅可以通过直播和新闻来感受比赛的整个过程,也可以通过Python来分析热点来感受粉丝的热情。

文中用到的源代码、字体文件、停用词文件、背景图,均可添加好友领取!

手把手教你获取弹幕数据

1. 简单说明

没看过直播的朋友不要紧,有回放呀!整个视频已经为大家整理好了,从开幕式,到五场比赛,再到夺冠时刻,一共7个视频。

EDG夺冠,用Python分析一波:粉丝都炸锅了_词云_03


每个视频中,都有粉丝发布的弹幕。今天要做的,就是获取每个视频里面的弹幕数据,看看粉丝在躁动的心情下,说了点啥?

不得不说,B站网页的变化速度真快,我记得去年还是很容易找到的。但是今天却一直没有找到。

但是没有关系,我们直接将以前的弹幕​​数据网址接​​口拿过来使用就行。

API:​ https://api.bilibili.com/x/v1/dm/list.so?oid=XXX​

这个oid其实就是一串数字,每个视频都有一个独特的oid。

2. oid数据找寻

本小节就带着大家一步步找寻这个oid。要找到oid,首先要找到一个叫做​​cid​​的东西。

点击F12,先打开开发者工具,按照图中提示,完成1-5处的操作。

EDG夺冠,用Python分析一波:粉丝都炸锅了_数据_04

  • 第3处:这个页面有很多个请求,但是你需要找到这个以​​pagelist​​开头的请求。
  • 第4处:观察对应的​​Header​​下方,有一个Request URL,我们要的cid就在这个网址中。
  • 第5处:观察对应的​​Preview​​下方,就是请求Request URL,响应给我们的结果,图中圈起来的就是我们要的cid数据。

2. cid数据获取

上述我们已经找到了Request URL,下面我们只需要发起请求,获取里面的cid数据即可。

import requests
import json

url = 'https://api.bilibili.com/x/player/pagelist?bvid=BV1EP4y1j7kV&jsonp=jsonp'
res = requests.get(url).text
json_dict = json.loads(res)
#pprint(json_dict)

for i in json_dict["data"]:
oid = i["cid"]
print(oid)

结果如下:

EDG夺冠,用Python分析一波:粉丝都炸锅了_python_05


其实,这里cid对应的数字串,就是oid后面的数字串。

3. 拼接url

我们不仅有了弹幕api接口,也有了cid数据,接下来将它们进行拼接,就可以得到最终的url。

url = 'https://api.bilibili.com/x/player/pagelist?bvid=BV1EP4y1j7kV&jsonp=jsonp'
res = requests.get(url).text
json_dict = json.loads(res)
#pprint(json_dict)

for i in json_dict["data"]:
oid = i["cid"]
api = "https://api.bilibili.com/x/v1/dm/list.so?oid="
url = api + str(oid)
print(url)

结果如下:

EDG夺冠,用Python分析一波:粉丝都炸锅了_json_06


一共有7个网址,分别对应7个视频里面的弹幕数据。随便点开一个查看:

EDG夺冠,用Python分析一波:粉丝都炸锅了_python_07

4. 正则提取弹幕数据并保存

有了完整的url后,我们要做的就是提取里面的数据,这里还是直接采用正则表达式。我们以其中一个视频为例,为大家讲解。

final_url = "https://api.bilibili.com/x/v1/dm/list.so?oid=437729555"
final_res = requests.get(final_url)
final_res.encoding = chardet.detect(final_res.content)['encoding']
final_res = final_res.text
pattern = re.compile('<d.*?>(.*?)</d>')
data = pattern.findall(final_res)

with open("弹幕.txt", mode="w", encoding="utf-8") as f:
for i in data:
f.write(i)
f.write("\n")

结果如下:

EDG夺冠,用Python分析一波:粉丝都炸锅了_数据_08


这只是其中一页的数据,共有7200条数据。

完整代码

上述我已经分步为大家讲解了每一步过程,这里我直接将代码封装成函数。

import os
import requests
import json
import re
import chardet

# 获取cid
def get_cid():
url = 'https://api.bilibili.com/x/player/pagelist?bvid=BV1EP4y1j7kV&jsonp=jsonp'
res = requests.get(url).text
json_dict = json.loads(res)
cid_list = []
for i in json_dict["data"]:
cid_list.append(i["cid"])
return cid_list

# 拼接url
def concat_url(cid):
api = "https://api.bilibili.com/x/v1/dm/list.so?oid="
url = api + str(cid)
return url

# 正则提取数据
def get_data(url):
final_res = requests.get(url)
final_res.encoding = chardet.detect(final_res.content)['encoding']
final_res = final_res.text
pattern = re.compile('<d.*?>(.*?)</d>')
data = pattern.findall(final_res)
return data

# 保存数据
def save_to_file(data):
with open("弹幕数据.txt", mode="a", encoding="utf-8") as f:
for i in data:
f.write(i)
f.write("\n")

cid_list = get_cid()
for cid in cid_list:
url = concat_url(cid)
data = get_data(url)
save_to_file(data)

结果如下:

EDG夺冠,用Python分析一波:粉丝都炸锅了_词云_09


确实很棒,一共3.1w数据!

保姆级词云图制作教程

对于获取到了 数据,我们 利用EDG背景图,制作一个好看的词云图。

# 1 导入相关库
import pandas as pd
import jieba
from wordcloud import WordCloud
import matplotlib.pyplot as plt
from imageio import imread

import warnings
warnings.filterwarnings("ignore")

# 注意:动态添加词语集
for i in ["EDG","永远的神","yyds","牛逼","发来贺电"]
jieba.add_word(i)

# 2 读取文本文件,并使用lcut()方法进行分词
with open("弹幕数据.txt",encoding="utf-8") as f:
txt = f.read()
txt = txt.split()
txt = [i.upper() for i in txt]
data_cut = [jieba.lcut(x) for x in txt]

# 3 读取停用词
with open("stoplist.txt",encoding="utf-8") as f:
stop = f.read()
stop = stop.split()
stop = [" "] + stop

# 4 去掉停用词之后的最终词
s_data_cut = pd.Series(data_cut)
all_words_after = s_data_cut.apply(lambda x:[i for i in x if i not in stop])

# 5 词频统计
all_words = []
for i in all_words_after:
all_words.extend(i)
word_count = pd.Series(all_words).value_counts()

# 6 词云图的绘制
# 1)读取背景图片
back_picture = imread("EDG.jpg")

# 2)设置词云参数
wc = WordCloud(font_path="simhei.ttf",
background_color="white",
max_words=1000,
mask=back_picture,
max_font_size=200,
random_state=42
)
wc2 = wc.fit_words(word_count)

# 3)绘制词云图
plt.figure(figsize=(16,8))
plt.imshow(wc2)
plt.axis("off")
plt.show()
wc.to_file("ciyun.png")

结果如下:

EDG夺冠,用Python分析一波:粉丝都炸锅了_数据_02


标签:EDG,cid,Python,res,oid,炸锅,url,data,final
From: https://blog.51cto.com/u_14346314/5746304

相关文章

  • 小猪佩奇的4种python玩法,带你趣味学python!
    本文说明为什么要学习python?是因为不仅社会上很多工作需要用到python,同时我们可以利用python做很多好玩儿的事儿,比如说:利用爬虫数据进行数据分析,得到一些有趣的结论;利用pyth......
  • python之路径 | 11
    写程序的时候,常常需要用到不同得出文件。如果之前保存的比较混乱,找起来真的是一件头疼的事情。如果我们能用python中的路径导入文件,就不会有这种烦扰啦,今天小编就来大家一起......
  • 10个Python脚本来自动化你的日常任务
    在这个自动化时代,我们有很多重复无聊的工作要做。想想这些你不再需要一次又一次地做的无聊的事情,让它自动化,让你的生活更轻松。那么在本文中,我将向您介绍10个Python自......
  • python内置模块loggin日志实现单例封装
    1importlogging2fromconfigs.global_dataimportLogger345classLogHandler:6obj=None78def__init__(self):9self.file......
  • (Python)使用 HTMLTestRunner 实现 unittest 报告生成
    1.下载HTMLTestRunner文件地址: http://tungwaiyip.info/software/HTMLTestRunner.html 2.将.py文件保存到 \Python37\Lib\site-packages 3.将 HTMLTestRu......
  • Python数据分析-基于pandas的数据清洗
    一、处理丢失数据(1)丢失数据的类型1)None2)np.nan(NaN)两种丢失数据的区别:type(None)NoneTypetype(np.nan)float 为什么在......
  • nginx python webpy 配置安装
    安装webpy$wgethttp://webpy.org/static/web.py-0.34.tar.gz$tarxvzfweb.py-0.34.tar.gz$cdweb.py-0.34$sudopythonsetup.pyinsta......
  • Python函数-5
    Python函数-4的补充和修订:修正一下上个博客的代码块中的del应改为def,深感歉意。补充一下返回值函数的样式:def函数名:return代码(值)一.函数的作用域有两种,一个......
  • python 联邦学习库 syft安装
    python联邦学习库syft安装新建一个新的环境(注意先不用安装pytorch,容易有pysyft和pytorch版本不对应,或者有些pytorch版本不支持pysyft的情况,然后报错):      ......
  • Python文件和目录操作
    创建目录1、os.makedirs可以递归的创建目录结构例如:importosos.makedirs('路径(可以是相对路径也可以是绝对路径)',exist_ok=True)exist_ok=True指定了,如果某个要......