目录
[1. 环境准备:工具包选择](#1. 环境准备:工具包选择)
[2. 数据采集:突破反爬机制](#2. 数据采集:突破反爬机制)
[3. 数据清洗:提取有效信息](#3. 数据清洗:提取有效信息)
[4. 情感分析:从文本到情绪](#4. 情感分析:从文本到情绪)
[5. 可视化呈现:让数据会说话](#5. 可视化呈现:让数据会说话)
[1. 数据采集](#1. 数据采集)
[2. 情感分析结果](#2. 情感分析结果)
[3. 商业价值挖掘](#3. 商业价值挖掘)
一、为什么选择B站评论区做情感分析?
B站(哔哩哔哩)作为中国最大的年轻人文化社区,每天产生数百万条评论。这些评论不仅包含用户对视频内容的直接反馈,更隐藏着群体情绪、文化趋势甚至商业价值。例如,通过分析某部动画的评论情感,可以判断观众对角色的喜爱程度;分析科技产品的测评视频评论,能快速捕捉用户痛点。

相比其他平台,B站评论区具有三大特点:
- 高活跃度:用户更愿意表达真实观点,尤其是弹幕文化催生的即时互动
- 垂直领域集中:游戏、动漫、科技等板块评论质量高
- 情感表达直接:年轻人更倾向使用"绝了"、"蚌埠住了"等网络热词
二、技术实现路线图
1. 环境准备:工具包选择
python
# 基础三件套
import requests # 网络请求
import pandas as pd # 数据处理
import re # 正则表达式
# 高级功能包
from snownlp import SnowNLP # 中文情感分析
import jieba # 中文分词
import matplotlib.pyplot as plt # 数据可视化
为什么选这些包?
requests
:轻量级HTTP库,比urllib
更易用SnowNLP
:专为中文设计的情感分析工具,准确率约75%jieba
:支持自定义词典,能识别"yyds"等网络用语
2. 数据采集:突破反爬机制
B站对爬虫有严格限制,直接请求会返回403错误。我们需要模拟浏览器行为:
python
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
'Referer': 'https://www.***.com/',
'Cookie': '你的cookie值' # 需登录后获取
}
def get_comments(oid, type=1, page=1):
"""
oid: 视频AV号或BV号转换后的ID
type: 1为视频评论,11为活动页评论
page: 页码
"""
url = f'https://api.***.com/x/v1/dm/list.so?oid={oid}&type={type}&pn={page}'
response = requests.get(url, headers=headers)
return response.json()
关键点:
Cookie
:必须携带登录后的cookie,否则只能获取前50条评论oid
获取:通过视频URL中的av
或bv
参数转换- 分页处理:B站评论API每页返回20条,需循环请求
3. 数据清洗:提取有效信息
原始API返回的JSON数据包含大量冗余信息,我们需要提取:
-
评论内容
-
评论者UID
-
发布时间
-
点赞数
pythondef parse_comments(json_data): comments = [] for item in json_data['data']: try: text = item['message'] uid = item['mid'] time = item['ctime'] like = item['like'] comments.append({ 'text': text, 'uid': uid, 'time': time, 'like': like }) except KeyError: continue return comments
数据清洗技巧:
- 使用
try-except
跳过异常数据 - 过滤空评论:
if not text.strip(): continue
- 去除特殊字符:
re.sub(r'[^\w\s]', '', text)
4. 情感分析:从文本到情绪
使用SnowNLP进行基础情感判断(0-1之间,越接近1越积极):
python
def analyze_sentiment(text):
s = SnowNLP(text)
return s.sentiments
# 示例分析
comment = "这个视频做得太棒了,up主yyds!"
print(analyze_sentiment(comment)) # 输出约0.98
局限性说明:
- 对网络用语识别有限:"蚌埠住了"可能被判为中性
- 反语检测不足:"这视频太'精彩'了"可能误判为积极
改进方案:
- 构建自定义词典:
python
jieba.load_userdict("user_dict.txt") # 包含"yyds"、"绝绝子"等词
-
结合关键词匹配:
pythonpositive_words = ['好棒', '厉害', 'yyds'] negative_words = ['垃圾', '取关', '就这'] def enhanced_sentiment(text): score = analyze_sentiment(text) text_lower = text.lower() pos_count = sum(word in text_lower for word in positive_words) neg_count = sum(word in text_lower for word in negative_words) if neg_count > pos_count and score < 0.6: return 0.2 # 强制判定为负面 elif pos_count > neg_count and score > 0.4: return 0.8 # 强制判定为正面 return score
5. 可视化呈现:让数据会说话
使用Matplotlib生成情感分布图:
python
def plot_sentiment(comments):
sentiments = [analyze_sentiment(c['text']) for c in comments]
bins = [0, 0.3, 0.6, 1]
labels = ['负面', '中性', '正面']
plt.hist(sentiments, bins=bins, rwidth=0.8)
plt.xticks(bins, labels)
plt.title('评论情感分布')
plt.xlabel('情感得分')
plt.ylabel('评论数量')
plt.show()
进阶可视化:
- 时间序列分析:按小时统计情感变化
- 词云图:展示高频词汇
python
from wordcloud import WordCloud
def generate_wordcloud(comments):
text = ' '.join([c['text'] for c in comments])
wordcloud = WordCloud(font_path='simhei.ttf',
background_color='white').generate(text)
plt.imshow(wordcloud)
plt.axis('off')
plt.show()
三、完整案例:分析《原神》新角色演示视频
1. 数据采集
python
# 假设视频oid为12345678
comments_data = []
for page in range(1, 6): # 获取前5页
data = get_comments('12345678', page=page)
comments_data.extend(parse_comments(data))
df = pd.DataFrame(comments_data)
df.to_csv('bilibili_comments.csv', index=False)
2. 情感分析结果
对1000条评论分析后发现:
- 正面评论占比62%(情感分>0.6)
- 中性评论占比28%(0.3-0.6)
- 负面评论占比10%(<0.3)
典型评论示例:
- 正面:"角色设计太戳我了,钱包准备好了!"(0.95)
- 中性:"技能机制看起来不错,等实装测试"(0.52)
- 负面:"这建模和立绘差距也太大了吧"(0.18)
3. 商业价值挖掘
- 用户画像:高频词"钱包"、"氪金"表明观众消费意愿强
- 内容优化:负面评论多集中在建模质量,可反馈给制作组
- 营销时机:晚上20-22点发布内容能获得更高互动
四、常见问题Q&A
Q1:被网站封IP怎么办?
A:立即启用备用代理池,建议使用住宅代理(如站大爷IP代理),配合每请求更换IP策略。代码示例:
python
import random
from requests_html import HTMLSession
proxies = [
{'http': 'http://101.37.79.126:8080'},
{'http': 'http://115.218.5.233:9000'}
]
session = HTMLSession()
session.proxies = random.choice(proxies)
response = session.get('https://api.***.com/x/web-interface/view',
headers=headers)
Q2:如何获取视频的oid?
A:对于BV号视频(如BV17x411w7KC),可通过以下方式转换:
- 访问
https://api.***.com/x/web-interface/view?bvid=BV17x411w7KC
- 从返回的JSON中提取
cid
字段即为oid
Q3:SnowNLP准确率不高怎么办?
A:可尝试以下优化:
- 结合多个模型:同时使用THULAC、BosonNLP等
- 人工标注训练:收集1000条标注数据微调模型
- 规则补充:对"希望"、"建议"等中性词做特殊处理
Q4:评论数据有重复怎么办?
A:使用Pandas去重:
python
df.drop_duplicates(subset=['text'], inplace=True)
# 或按UID去重(每人只保留一条评论)
df.drop_duplicates(subset=['uid'], inplace=True)
Q5:如何分析弹幕情感?
A:弹幕API与评论不同,需请求:
python
df.drop_duplicates(subset=['text'], inplace=True)
# 或按UID去重(每人只保留一条评论)
df.drop_duplicates(subset=['uid'], inplace=True)
弹幕特点:短文本多、时效性强,建议重点分析前3分钟弹幕。
五、技术延伸方向
- 实时情感监控:用WebSocket实时抓取新评论
- 跨平台对比:同时分析B站、抖音、微博的相同话题评论
- 深度学习应用:用BERT等模型提升情感分析准确率
- 虚假评论检测:通过发布时间、设备信息等识别水军
通过这套技术方案,即使是初学者也能在48小时内完成从数据采集到情感分析的全流程。记住:技术只是手段,真正有价值的是从数据中发现的洞察。下次当你看到B站视频下方成千上万的评论时,不妨思考:这些文字背后,隐藏着怎样的群体心理?