爬取B站弹幕并进行情感分析

一.选题背景

随着互联网的发展,视频弹幕网站(如bilibili, youtube等)越来越流行,弹幕的信息通过视频在用户间分享流转,使弹幕具有了传播的特点。弹幕的信息包含了用户的主观情感,用户能在文字中加入情感色彩的词藻,使弹幕具有了描述人类主观喜好、赞赏、感觉等情感的特点。弹幕在传播过程中可能会在某个时间节点或者某个用户参与后,其热议程度呈井喷式增长。因此,对弹幕的各项信息进行分析对视频创造者和视频平台都具有重大的意义。

二.主题式网络爬虫设计方案

该网络爬虫为Bilibili弹幕数据爬虫,旨在爬取Bilibili的弹幕文本数据,以及发布时间,对文本进行情感极性分析,对弹幕发布日期进行统计,总结相关规律,为Up主及相关运营工作人员提供参考。

设计方案:

首先分析B站网页端结构,寻找规律,找出弹幕位于网页的位置。

再将爬取的数据进行持久化处理,后进行各项分析。

三.主题页面的结构特征分析

Bilibili的弹幕数据虽然出现在视频上的。实际上在网页中,弹幕是被隐藏在源代码中,以XML的数据格式进行加载。且弹幕数据的文档链接构成为https://comment.bilibili.com/cid.xml,即以一个固定的url地址+视频的cid+.xml组成。只要找到你想要的视频cid,替换这个url就可以爬取所有弹幕。而视频的cid可以在网页源代码中通过搜索cid轻松查询到。

获取到的cid=1054910356

获取到的弹幕xml文件如下所示:

其中各个参数分别表示:

stime: 弹幕出现时间 (s)

mode: 弹幕类型 (< 7 时为普通弹幕)

size: 字号

color: 文字颜色

date: 发送时间戳

pool: 弹幕池ID

author: 发送者ID

dbid: 数据库记录ID(单调递增)

使用正则表达式,从xml文件中筛选出关键信息,数据获取环节结束。

四.网络爬虫代码实现

4.1获取弹幕:

4.2解析弹幕:

4.3将获取的弹幕信息保存到csv中

数据收集结果展示:

由于Bili弹幕爬取限制,只爬取到了7200条弹幕,并在csv文件的D栏生成时间戳对应的时间

五.数据预处理

词云是一种可视化技术,用于显示文本数据中的关键词。通过词云,我们可以快速了解文本数据中哪些词汇出现频率较高,从而窥探出数据的一些关键主题和趋势。

 词云以视觉化的方式展示了文本数据中关键词的频率,使人们能够直观地了解哪些词汇在文本中出现得更为频繁。通过词云,我们可以快速识别出文本数据中的主题和趋势,从而更深入地理解数据所传达的信息。词云可以作为数据分析的起点,帮助研究人员快速确定感兴趣的主题或关键词,从而引导进一步的深入分析和研究。

总的来说,词云是一种简单而直观的工具,能够帮助人们快速理解文本数据中的主要内容和趋势,

预处理相关代码:

去除自定义的停用词:

stopwords = ['的', '了', '啊', '吗', '呀', '呢', '额', '还','也', ',', '。', '!', '?', ':'],

读取弹幕数据:

data = pd.read_csv('danmaku_list_.csv', encoding='utf-8', sep=',')

提取弹幕文本:

text = ' '.join(data['弹幕'].tolist())

使用jieba进行分词:

text_list = jieba.lcut(text)

将分词结果转换为字符串:

text_str = ' '.join(text_list)

读取图片作为词云形状:

mask_image = imageio.imread('1.png')

生成词云:

wc = WordCloud(width=800,

               height=800,

               background_color='white',

               font_path='C:/Users/10303/AppData/local/Microsoft/Windows/Fonts/SIMLI.TTF',

               stopwords = ['的', '了', '啊', '吗', '呀', '呢', '额', '还','也', ',', '。', '!', '?', ':'],

               mask=mask_image)

wc.generate(text_str)

wc.to_file('词云.png')

词云相关的原图片:

生成的词云图:

   分析:从该词云图片信息可以知道,大量弹幕中都出现了就是人类、ai,GPT,学习等词眼,弹幕中的高频关键词反映了对GPT-4和AI技术的广泛讨论和评价。人们普遍认为GPT-4代表着一场重大的技术变革,其智能程度可能可与人类相媲美,这引发了对AI与人类智能的比较和对AI带来的巨大变革的讨论。此外,弹幕中频繁出现的词汇如“学习”也表明人们对于AI技术的学习和应用方式进行了讨论。综合来看,这些关键词反映了对GPT-4和AI技术在社会中的重要性和影响的认知,并促使人们思考如何应对这一变革。

六.弹幕情感分析

我们在python中调用snownlp这一情感分析的库,对每一个视频的弹幕进行情感分析,并计算出每个视频弹幕中积极、消极或中立情绪的占比,利用matplotlib的子库pyplot绘制出相应的饼图。

6.1.1读取弹幕数据

6.1.2饼状图情感分析

6.1.3绘制饼图

6.1.4得到饼状图

                

由获得的饼状图可知:情感评分<0.4的弹幕情感是消极的,占了23.6%,情感评分>0.4且<0.6的弹幕情感是中立的,占了20.9%,情感评分>0.6的弹幕情感是积极的,占了55.5%

得出以下结论:

消极情绪存在但不主导: 根据情感评分小于0.4的弹幕占比达到23.6%,我们可以看到一部分观众在讨论中表达了消极情绪。这可能是因为他们对于GPT-4带来的技术变革和社会影响持有负面看法,担心其可能带来的问题或挑战。

中立情绪态度保持稳定: 情感评分在0.4到0.6之间的弹幕占比为20.9%,显示出一部分观众对于GPT-4的态度相对中立,既不完全积极也不完全消极。这些观众可能持观望态度,或者对GPT-4的影响尚无明确看法。

积极情绪占据主导地位: 弹幕情感评分大于0.6的占比达到55.5%,显示出大多数观众对于GPT-4持有积极的态度。他们可能看好GPT-4所带来的技术进步和社会发展,并期待其在各个领域的应用和改进。

综合来看,这项情感分析表明,虽然存在一部分观众持有消极态度,但大多数观众对于GPT-4持有积极的态度。这可能是因为他们认为GPT-4代表着一场重大的技术变革,有望带来更多的创新和便利,但也需要面对潜在的挑战和问题。因此,该视频引发了公众对于AI技术发展和社会影响的深入思考和讨论。

6.2.1柱状图情感分析

6.2.2绘制柱状图

6.2.3得到柱状图

由此柱状图可知:情感评分在[0,0.2)有660条,情感评分在[0.2,0.4)有1038条,情感评分在[0.4,0.6)有1507条,情感评分在[0.6,0.8)有1186条,情感评分在[0.8,1]有2810条,

通过这个柱状图的情感分析,我们可以得出以下结论:

1.弹幕中的情感评分普遍分布在较高区间:从情感评分在[0,0.2)到[0.8,1]的弹幕数量逐渐增加的趋势来看,大部分弹幕的情感评分都集中在中高水平。

2.大量弹幕表达了积极情绪:情感评分在[0.8,1]的弹幕数量最多,达到了2810条,显示出大部分观众对于视频内容或者GPT-4持有积极的态度。

3.中立情绪也有一定比例:情感评分在[0.4,0.6)的弹幕数量为1507条,居于第三高的位置,这说明一部分观众对于视频内容或者GPT-4的态度比较中立,既不完全积极也不完全消极。

4.消极情绪存在但较少:情感评分在[0,0.4)的弹幕数量总共为1698条,相比起其他区间来说,属于相对较少的部分,但仍然有一定数量的弹幕表达了消极情绪。

综上所述,通过这个情感分析柱状图,我们可以得出观众对于《渐构》视频内容以及GPT-4的情感倾向主要是积极的,但也存在一定比例的中立和消极情绪。整体上,该视频引发了观众广泛的讨论和情感反应,呈现出了一个多元化的观点和态度。

### 数据采集与分析流程 #### 1. 弹幕数据的获取 B弹幕通常以XML或JSON格式存储。对于目标视频,可以通过其CID(Content ID)访问对应的弹幕文件。以下是具体操作: - **通过API抓取** B提供了公开接口用于获取弹幕数据。例如,`https://api.bilibili.com/x/v1/dm/list.so?oid=<cid>` 是一个常见的请求地址[^1]。将 `<cid>` 替换为目标视频的实际 CID 即可下载 XML 文件。 - **解析XML结构** 在 XML 文件中,每条弹幕由 `<d>` 标签表示,其中 `text` 部分为弹幕内容,而 `p` 属性包含了时间戳、颜色、模式等信息[^3]。可以使用 Python 的标准库 `xml.etree.ElementTree` 或第三方库 `lxml` 来解析这些字段。 ```python import xml.etree.ElementTree as ET def parse_danmu_xml(xml_file_path): tree = ET.parse(xml_file_path) root = tree.getroot() danmus = [] for child in root: p_values = child.attrib["p"].split(",") content = child.text.strip() if child.text else "" danmus.append({ "content": content, "timestamp": float(p_values[0]), "mode": int(p_values[1]), "fontsize": int(p_values[2]), "color": int(p_values[3]) }) return danmus ``` #### 2. JSON格式处理 如果弹幕是以 JSON 形式返回,则可以直接加载提取所需字段。以下是一个基于 JSONPath 的例子[^4]: ```python import json from jsonpath import jsonpath with open('danmu.json', 'r', encoding='utf-8') as f: data = json.load(f) fields = jsonpath(data, '$..DanmakuElem[*].fields') for field in fields: print(field) ``` --- #### 3. 数据清洗与预处理 原始弹幕可能包含大量无意义的内容(如表情符号、广告语),需对其进行清理。常用的方法包括但不限于: - 去除空白字符和特殊符号。 - 过滤掉重复弹幕。 - 提取关键词或短语。 示例代码如下: ```python import re def clean_text(text): text = re.sub(r'[^\u4e00-\u9fa5a-zA-Z0-9]', '', text) # 移除非中文/英文/数字字符 return text.lower().strip() cleaned_data = [clean_text(d['content']) for d in danmus if d['content']] ``` --- #### 4. 数据分析方法 完成数据收集后,可根据需求执行多种类型的分析: ##### (1)情感分析 利用自然语言处理技术评估弹幕的情感倾向。可以选择现成模型(如 SnowNLP 或 TextBlob)或者训练自定义分类器。 ```python from snownlp import SnowNLP sentiments = [(SnowNLP(clean).sentiments, clean) for clean in cleaned_data[:10]] print(sentiments) ``` ##### (2)词频统计 计算高频词汇及其分布情况,帮助了解观众关注点。 ```python from collections import Counter words = [word for sentence in cleaned_data for word in jieba.lcut(sentence)] counter = Counter(words) most_common_words = counter.most_common(10) print(most_common_words) ``` ##### (3)时间序列分析 观察特定时间段内的弹幕密度变化趋势。 ```python import matplotlib.pyplot as plt timestamps = [d['timestamp'] for d in danmus] plt.hist(timestamps, bins=50) plt.xlabel('Timestamp (seconds)') plt.ylabel('Number of Danmakus') plt.title('Distribution of Danmakus Over Time') plt.show() ``` --- #### 工具推荐 除了上述提到的技术外,还可以借助一些可视化工具提升效果展示能力: - Matplotlib 和 Seaborn:绘制图表。 - WordCloud:生成词云图。 - Pandas:高效管理大规模表格型数据。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值