零、引言
笔者近日与队友们合作完成了《基于b站弹幕的数据分析》这一数据分析与可视化项目,也借此机会学到了许多有用的技术,收获颇丰。本文将重点对这些技术进行总结,并与诸位分享,希望能一同在数据分析之路上成长。
一、数据获取
【实现工具】
Python(编写爬虫代码)、Excel(存储及处理所获取的数据)
【实现步骤】
-
数据寻找
在此项目中,我们需要获取的数据是b站视频的弹幕信息(如下图红框圈起来的部分所示——弹幕在视频中出现的时间、弹幕内容、弹幕发送时间)。
我们尝试对所在的这个网页进行爬虫获取以上信息。然而,得到如下图所示结果。
这说明利用爬虫爬取该网页会被网页的验证码拦截,无法从中获取数据。
我们尝试寻找别的可行网页:在原网址的“bilibili”前加“i”,跳转到如下网址,并进一步进到下图红框圈起来的网址。


我们可以看到以上界面,从第9行开始,每行黑色字表示弹幕内容;而蓝色字的各个参数依次表示:(根据所在列数)
1、弹幕在视频中出现时间(秒)
2、弹幕类型(若小于7则为普通弹幕)
3、字号
4、文字颜色
5、发送时间戳(代表了日期及时间,可转换成2023/12/10 10:00这种格式)
7、弹幕池ID
8、发送人ID
9、数据库记录ID
可知我们需要获取其中的第一列、第五列、及黑色字对应的数据。
-
代码实现
——基于requests库实现的爬虫
1、导入所需要的库
import requests import xml.etree.ElementTree as ET import pandas as pd
讯享网
2、获取弹幕
讯享网#获取弹幕 def get_bilibili_danmaku(cid): url = f"https://comment.bilibili.com/{cid}.xml" #f前缀代表格式化字符串,里面可以包含{cid}这种占位符,使其之后能被替换 response = requests.get(url) if response.status_code == 200: return response.content else: print(f"Error accessing the API. Status Code: {response.status_code}") return None
3、解析弹幕
#解析弹幕 def parse_danmaku(xml_content): root = ET.fromstring(xml_content) #解析xml格式的字符串 danmaku_list = [] for d in root.iter('d'): #遍历xml树中所有标签为'd'的元素 danmaku_text = d.text danmaku_attr = d.attrib #返回d的属性字典 time_info = danmaku_attr.get('p', '').split(',') if len(time_info) > 0: video_time = int(float(time_info[0])) # #弹幕在视频中的出现时间(秒),转为整数秒 hours = video_time // 3600 minutes = (video_time % 3600) // 60 seconds = video_time % 60 real_time = f"{hours}:{minutes}:{seconds}" # 格式化时间,取整到小时、分钟、秒''' date = time_info[4] danmaku_list.append({ '弹幕': danmaku_text, '视频中时间': video_time, '发送时间戳': date }) return danmaku_list
4、将获取的弹幕存储到excel
讯享网#将获取的弹幕信息保存到excel中 def save_danmaku_to_excel(danmaku_list, filename): df = pd.DataFrame(danmaku_list) df.to_excel(filename, index=False, engine='openpyxl') print(f"保存了 {len(danmaku_list)} 条弹幕到 {filename}")
-
数据处理
运行以上的代码,我们可以获取这样形式的excel文件:

然而,我们希望能得到日期格式的发送时间,便于后续的直观分析。因此我们在excel里编写函数并调整数字格式,将“发送时间戳”转为所需要的形式,如下图所示:

二、情感分析
我们在python中调用snownlp这一情感分析的库,对每一个视频的弹幕进行情感分析,并计算出每个视频弹幕中积极、消极或中立情绪的占比,利用matplotlib的子库pyplot绘制出相应的饼图。
-
代码实现
1、导入所需要的库
from snownlp import SnowNLP import matplotlib.pyplot as plt #导入画图的库(pyplot是子库)
2、读取弹幕数据
讯享网file = open('{xxx.csv}', encoding = 'utf-8') text = [] for line in file.readlines(): #依次读入弹幕文件的每一行 content = line.split(',') text.append(content[0])
3、情感分析
emotions = {'positive':0, 'negative':0, 'neutral':0} for item in text: s = SnowNLP(item) if s.sentiments > 0.6: emotions['positive'] += 1 elif s.sentiments < 0.4: emotions['negative'] += 1 else: emotions['neutral'] += 1
4、绘制饼图
讯享网plt.style.use('fivethirtyeight') plt.pie(emotions.values(), labels = emotions.keys(), autopct = '%1.1f%%') plt.tight_layout() #设置字体,显示为中文(否则会出现乱码) plt.rcParams['font.family'] = ['sans-serif'] plt.rcParams['font.sans-serif'] = ['SimHei'] plt.title("弹幕情感分析饼图") #添加标题 plt.savefig("弹幕情感分析饼图.jpg") #保存图片 plt.show() #运行时显示
例如,我们对b站排行榜前十的视频获取了弹幕,并根据上述代码进行处理,便可以得到如下所示的情感分析饼图:

三、弹幕词云
词云图可以较好地反映在众多词句中,各种词句出现的频率如何。在python中,我们调用wordcloud库来绘制词云。
-
代码实现
1、导入所需的库
from wordcloud import WordCloud import csv import imageio.v2 as imageio
2、读取弹幕数据
讯享网file = open('{xxx.csv}','r',encoding = 'utf-8') lst =[] for line in file.readlines(): content = line.split(',') lst.append(content[0]) txt = str(lst)
3、生成词云图
img = imageio.imread('{xxx.jpg}') #词云模板 #自定义词云图的参数 wc = WordCloud(width = 10000, height =10000, background_color = 'white', font_path = 'C:\Windows\Fonts\msyh', mask = img) wc.generate(txt) wc.to_file('{xx.jpg}') #存储词云图
在生成词云图中,我们可以自定义其参数,如分辨率、图片背景、图片模板等。
(有关参数的详细介绍可参考这篇文章:https://blog.csdn.net/weixin_/article/details/?spm=1001.2014.3001.5506)
例如,我们用下面左边的图为模板,生成了下面右边的弹幕词云图,其形状确为蜡笔小新的形状。


四、问题发现
-
不足之处
首先,在对弹幕进行情感分析时,我们发现snownlp库可能存在对语义理解有误的情况,例如某个视频很多弹幕是有关“致敬”的,但由其分析出的积极情绪只占了约27%,明显是不符合常理的。
-
改进方法
对于弹幕的情感分析,我们日后会寻找更针对中文语言的情感分析库,从而更准确地界定词句的情感,提升结果可靠性。
五、心得体会
非常有幸能通过此次项目接触到Python各种各样的库以及爬虫的知识,也对数据分析的主要技术和流程有了了解。
在如今的数字时代,我们将积极学习新兴知识,并把所学应用到实际中去,为数字社会贡献自己的力量!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/51684.html