《请回答1988》弹幕分析

本文介绍从B站提取《请回答1988》弹幕并生成词云图的过程,涵盖弹幕数据抓取、解析及词云生成的Python代码实现。
部署运行你感兴趣的模型镜像

本文是从B站提取弹幕,并生成《请回答1988》用户点评的词云图,具体代码参见请回答1988弹幕词云

在这里插入图片描述

B站弹幕提取

首先,通过b站网址,查看到《请回答1988》木鱼水心弹幕最多的一集,其URL如下:

https://www.bilibili.com/video/BV1g7411d7v7?from=search&seid=4258323448425596581

通过b站的如下api接口,获取视频片段信息:

https://api.bilibili.com/x/player/pagelist?bvid=BV1g7411d7v7&jsonp=jsonp

得到的json形式结果如下:

{
  "code": 0,
  "message": "0",
  "ttl": 1,
  "data": [
    {
      "cid": 166505309,
      "page": 1,
      "from": "vupload",
      "part": "请回答1988 P6修正",
      "duration": 4366,
      "vid": "",
      "weblink": "",
      "dimension": {
        "width": 1280,
        "height": 720,
        "rotate": 0
      }
    }
  ]
}

将上述结果中的cid,作为下面api接口中的oid参数,传入到接口调用中

https://api.bilibili.com/x/v1/dm/list.so?oid=166505309

该调用会返回如下形式的弹幕xml结果:

<i>
    <chatserver>chat.bilibili.com</chatserver>
    <chatid>166505309</chatid>
    <mission>0</mission>
    <maxlimit>8000</maxlimit>
    <state>0</state>
    <real_name>0</real_name>
    <source>e-r</source>
    <d p="3476.34000,1,25,16777215,1584938994,0,3db21a6b,30302178995863555">吸吸吸吸吸</d>
    <d p="1885.60400,1,25,16777215,1584939023,0,571b43d9,30302194189729799">这算什么交往哈哈哈哈</d>
    <d p="1919.24700,1,25,16777215,1584939057,0,571b43d9,30302211817865221">关二哥</d>
    <d p="1936.11400,1,25,16777215,1584939084,0,571b43d9,30302226084265987">化妆了</d>
    <d p="3444.53200,1,25,16777215,1584939135,0,c2a058d,30302253026902021">请务必这样做</d>
    <d p="4342.22900,1,25,16777215,1584939534,0,74eee2ec,30302461728653317">三连催更</d>
</i>

到此,我们就取到了具体弹幕信息了。

弹幕数据解析

以下是采用python来实现弹幕解析,并存储到本地txt文件中:

首先,需要先安装相关依赖包,例如requests、chardet等,我当前是采用的pycharm,直接在 setting的project中安装即可。

提示:安装前,可以增加一些镜像站,否则直接访问国外镜像很容易出现超时异常。我当前添加的是清华的镜像https://pypi.tuna.tsinghua.edu.cn/simple

具体实现代码如下:

# 实现B站弹幕信息的解析和保存
import requests
import json
import chardet
import re


# 1.根据bvid获取cid
def get_cid():
    url = 'https://api.bilibili.com/x/player/pagelist?bvid=BV1g7411d7v7&jsonp=jsonp'
    # 获取url请求响应结果
    res_text = requests.get(url).text
    json_obj = json.loads(res_text)
    return json_obj['data'][0]['cid']


# 2.根据cid调用api,获取弹幕信息,并保存到txt数据文件中
def save_danm(cid):
    url = 'https://api.bilibili.com/x/v1/dm/list.so?oid=' + str(cid)
    res = requests.get(url)
    # 基于返回结果制定编码,避免乱码
    res.encoding = chardet.detect(res.content)['encoding']
    res_text = res.text
    # *?模式是将*的贪婪匹配修改为惰性匹配,也就按最小匹配模式
    pattern = re.compile('<d.*?>(.*?)</d>')
    dan_mu_list = pattern.findall(res_text)
    with open('../resources/dan_mu.txt', mode='w', encoding='utf-8') as f:
        for d in dan_mu_list:
            # 逐行写入弹幕
            f.write(d + '\n')
    print('dan_mu.txt done')


# 调用方法,获取cid
cid = get_cid()
# 调用方法,保存弹幕
save_danm(cid)

弹幕词云生成

特别提示:在安装wordcloud库之前,需要先安装VC_redist.x64.exe 另外,停用词目前是用的哈工大的版本,具体见后文。

具体词云生成代码如下:

# 实现将弹幕生成为词云图
import pandas as pd
import jieba
from wordcloud import WordCloud
import matplotlib.pyplot as plt
from imageio import imread

# 读取文本文件,并进行分词
with open('resources/dan_mu.txt', encoding='utf-8') as f:
    txt = f.read()
# 将读取的内容,自动按行拆分为列表
txt_list = txt.split()
# 将每句弹幕进行分词
txt_cut = [jieba.lcut(x) for x in txt_list]
# 读取停用词表
with open('resources/stopwords.txt', encoding='utf-8') as f:
    stop_words = f.read()
stop_words = stop_words.split()

# 创建一维数组
s_txt_cut = pd.Series(txt_cut)
# 分词结果中去除停用词
txt_last = s_txt_cut.apply(lambda x: [i for i in x if i not in stop_words])

# 词频统计
txt_stat = []
for i in txt_last:
    txt_stat.extend(i)
txt_count = pd.Series(txt_stat).value_counts()

# 词云图绘制
back_img = imread(r"love.jpg")
wc_obj = WordCloud(font_path='resources/msyh.ttc', background_color='white', max_words=1800, mask=back_img,
                   max_font_size=200,
                   random_state=42)
wc_fit = wc_obj.fit_words(txt_count)

plt.figure(figsize=(16, 9))
plt.imshow(wc_fit)
plt.axis('off')
plt.show()
wc_obj.to_file('word_cloud_1988.png')

其他操作

升级pip

以管理员权限运行powershell,分别执行如下命令:

python -m ensurepip
python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pip -U

pycharm

pycharm安装后,目前主要配置有:

  • 安装 saveaction插件,时间保存时自动格式化代码
  • 调整字号大小
  • 修改单行删除的快捷键,由 ctrl+Y 修改为 ctrl+d

参考资料

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

moto-txt4.0操作说明: 菜单界面中键位 上下键-进行菜单循环 左键-取消当前操作(返回上一级) 右键-确定当前选择 中键-调出操作菜单(或者确定) *键-关闭(打开)背景灯 文件阅读界面中使用手机数字键进行操作 2键向上滚屏(摇杆上) 长按2键快速向上滚屏 8键向下滚屏(摇杆下) 长按8键快速向下滚屏 4键向上翻页(摇杆左) 长按4键快速向上翻 6键向下翻页(摇杆右) 长按6键快速向下翻 7键返回目录浏览界面(或者通话键) 9键添加书签 1键查看当前时间 0键进行自动滚屏设置 *键关闭背景灯 #键反转当前颜色设置 当2分钟内没进行任何操作时自动关闭背景灯 motorola手机安装说明下载解压后得到moto.jar moto.jad两个文件,然后使用软件 MotoMidMan安装即可! 注意:motorola手机必须使用MotoMidMan这个软件来进行安装moto-txt,否则将会无法使用!!! 在此鸣谢dwALX朋友制作了MotoMidMan这么优秀的java安装软件!感谢chinawrc汉化了这个软件! E2手机的安装方法 A1200手机的安装方法和E2一样 E680 E680I A780安装方法 motorola手机终极安装方法:(此方法几乎支持所有motorola手机) 点击下载j2me_domain_registry.rar文件,解压后将j2me_domain_registry.sm覆盖到你的手机的 a/mobile/certs/root/x509/kjava/ 文件夹下,然后重启手机,正常安装moto-txt即可。 NOKIA索爱 手机安装说明 1.解压缩包后得到moto.jar moto.jad 二个文件; 2.用各品牌手机安装JAVA软件的方法正常安装软件。 NOKIA手机设置: 第一步:和装普通的JAVA一样先装在手机上 第二步:在MOTO-TXT软件的"应用软件接入"里的"手机接入"里的"增加和编辑数据"里由“不允许”改选为“每次询问",然后打开MOTO-TXT访问目录时会提示,你就按确定就可以访问目录了.   重要说明: 因为触摸屏手机没有数字键盘,许多moto-txt的阅读操作是需要数字键盘才能完成的,所以MOTO-TXT为触摸屏手机设计了一个模拟数字键盘,以此来保持moto-txt的按键操作风格。 触摸屏手机调用模拟数字键盘的方法:在阅读界面中点击触摸屏任意位置调出模拟键盘,再次点击触摸屏空白处关闭模拟键盘! 阅读繁体中文的文本文件时,将文本文件的编码更改为UNICODE,MOTO-TXT就可以完美的支持了!!! 常见问题解答: 安装MOTO-TXT后看不见文件列表?答:如果你的是motorola的手机,那就是你没有进行java软件访问手机文件系统的授权操作,大部分的motorola手机可以使用MotoMidMan这个软件进行授权,具体如何使用MotoMidMan,在百度上搜搜就知道了!! MOTO-TXT支持motorola V3i手机吗?答:V3i可以使用moto-txt3.10,安装方法见网站的“安装方法”页面中的“motorola手机终极安装方法"。 为什么我在MOTO-TXT中修改了字号的大小,但却没有什么用?答:因为你的手机只有一种字号的字库,所有MOTO-TXT中修改字体大小的功能无法使用! 为什么有许多字MOTO-TXT无法显示?答:因为有许多汉字并没有包含在GB2312编码标准中,所以如果你看的TXT文件的编码是GB2312,就有汉字可能无法显示。解决办法为:在电脑中用记事本打开TXT文件,选择另存为菜单,在编码选项中选择为Unicode编码就一且正常了。MOTO-TXT对Unicode编码的支持是最好的!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值