一、前言
在日常观看B站视频时,我们经常会看到视频下方的弹幕。弹幕不仅仅是观众的互动,它还蕴含着大量的信息,通过分析弹幕内容,我们可以挖掘出视频的情感趋势、用户的情感态度等有价值的数据。今天,我们将带着大家一起爬取B站的视频弹幕,并对弹幕进行情感分析和关键词提取。
二、环境准备
在开始之前,我们需要安装一些基础的 Python 库:
pip install requests
pip install snownlp
pip install jieba
pip install gensim
pip install pyecharts
三、爬取B站弹幕
B站的弹幕数据是通过API接口返回的,我们只需要向指定的API发送请求,获取到视频ID对应的弹幕数据即可。
import requests
# B站弹幕API链接(通过视频ID获取弹幕)
oid = '25750933691' # 视频ID(可以从视频链接中获取)
url = f'https://api.bilibili.com/x/v1/dm/list.so?oid={oid}'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',
'Cookie': 'your_cookie_here' # 这里填写你的Cookie信息
}
# 获取弹幕数据
response = requests.get(url, headers=headers)
if response.status_code == 200:
with open('danmu.xml', 'wb') as f:
f.write(response.content)
print("弹幕保存成功!")
else:
print("获取弹幕失败")
解释:
oid
:视频的ID,通常可以从B站视频链接中获取。url
:弹幕API的链接。headers
:请求头部信息,需包括 Cookie,你可以通过浏览器开发者工具获得。danmu.xml
:保存获取到的弹幕数据,格式是 XML。
四、弹幕情感分析
爬取到弹幕后,我们可以通过 SnowNLP 库进行情感分析。SnowNLP 是一个中文情感分析工具,它能够将文本分为积极、消极两类。
from snownlp import SnowNLP
# 读取爬取到的弹幕文件
with open('danmu.txt', 'r', encoding='utf-8') as file:
data = file.readlines()
# 情感分析
sentiments = []
for line in data:
s = SnowNLP(line)
sentiments.append(s.sentiments) # 获取情感得分
# 打印情感得分
for sentiment in sentiments:
print(f"情感得分: {sentiment}")
解释:
SnowNLP
提供了一个.sentiments
属性,它返回一个 0 到 1 的情感得分,越接近 1 代表情感越积极。
五、关键词提取和词向量训练
使用 jieba 分词和 Word2Vec 进行关键词提取和词向量训练。
import jieba
from gensim.models import Word2Vec
# 分词处理
corpus = []
for line in data:
words = jieba.lcut(line) # 使用结巴分词
corpus.append(words)
# 使用 Word2Vec 训练词向量模型
model = Word2Vec(sentences=corpus, vector_size=100, window=5, min_count=1, workers=4)
model.save("word2vec.model")
print("Word2Vec模型训练完毕!")
解释:
jieba.lcut
:分词工具。Word2Vec
:训练词向量模型,通过弹幕内容来训练,提取出高频词汇。
六、数据可视化:情感分析与关键词
使用 ECharts 生成可视化图表,展示情感分析的结果和关键词的词云图。
from pyecharts import options as opts
from pyecharts.charts import Bar, WordCloud
# 情感分析可视化(柱状图)
bar = (
Bar()
.add_xaxis([f"弹幕 {i+1}" for i in range(len(sentiments))])
.add_yaxis("情感得分", sentiments, itemstyle_opts=opts.ItemStyleOpts(color="blue"))
.set_global_opts(title_opts=opts.TitleOpts(title="弹幕情感得分趋势"))
)
bar.render("sentiment_analysis.html")
# 关键词词云图
word_freq = {}
for words in corpus:
for word in words:
word_freq[word] = word_freq.get(word, 0) + 1
wordcloud = (
WordCloud()
.add("关键词", [(word, freq) for word, freq in word_freq.items()], word_size_range=[10, 100])
.set_global_opts(title_opts=opts.TitleOpts(title="弹幕关键词词云"))
)
wordcloud.render("wordcloud.html")
解释:
- 情感得分柱状图:展示每个弹幕的情感得分,得分越高,情感越积极。
- 关键词词云图:展示弹幕中的高频关键词,通过大小来表现词频。
七、总结
通过爬取 B 站的视频弹幕,并结合情感分析与关键词提取,我们能够获取到有价值的观众情绪数据,并进行更深入的分析。在此基础上,您可以探索更多的应用场景,比如实时监控视频情感变化,分析特定时段的情感趋势等。
八、参考资料
- SnowNLP GitHub
- gensim Word2Vec 文档
- pyecharts 官网