Python爬取B站视频评论区情感分析:从数据采集到价值挖掘

目录

一、为什么选择B站评论区做情感分析?

二、技术实现路线图

[1. 环境准备:工具包选择](#1. 环境准备:工具包选择)

[2. 数据采集:突破反爬机制](#2. 数据采集:突破反爬机制)

[3. 数据清洗:提取有效信息](#3. 数据清洗:提取有效信息)

[4. 情感分析:从文本到情绪](#4. 情感分析:从文本到情绪)

[5. 可视化呈现:让数据会说话](#5. 可视化呈现:让数据会说话)

三、完整案例:分析《原神》新角色演示视频

[1. 数据采集](#1. 数据采集)

[2. 情感分析结果](#2. 情感分析结果)

[3. 商业价值挖掘](#3. 商业价值挖掘)

四、常见问题Q&A

五、技术延伸方向


一、为什么选择B站评论区做情感分析?

B站(哔哩哔哩)作为中国最大的年轻人文化社区,每天产生数百万条评论。这些评论不仅包含用户对视频内容的直接反馈,更隐藏着群体情绪、文化趋势甚至商业价值。例如,通过分析某部动画的评论情感,可以判断观众对角色的喜爱程度;分析科技产品的测评视频评论,能快速捕捉用户痛点。

相比其他平台,B站评论区具有三大特点:

  1. 高活跃度:用户更愿意表达真实观点,尤其是弹幕文化催生的即时互动
  2. 垂直领域集中:游戏、动漫、科技等板块评论质量高
  3. 情感表达直接:年轻人更倾向使用"绝了"、"蚌埠住了"等网络热词

二、技术实现路线图

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中的avbv参数转换
  • 分页处理:B站评论API每页返回20条,需循环请求

3. 数据清洗:提取有效信息

原始API返回的JSON数据包含大量冗余信息,我们需要提取:

  • 评论内容

  • 评论者UID

  • 发布时间

  • 点赞数

    python 复制代码
    def 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

数据清洗技巧

  1. 使用try-except跳过异常数据
  2. 过滤空评论:if not text.strip(): continue
  3. 去除特殊字符: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"、"绝绝子"等词
  • 结合关键词匹配:

    python 复制代码
    positive_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. 商业价值挖掘

  1. 用户画像:高频词"钱包"、"氪金"表明观众消费意愿强
  2. 内容优化:负面评论多集中在建模质量,可反馈给制作组
  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),可通过以下方式转换:

  1. 访问https://api.***.com/x/web-interface/view?bvid=BV17x411w7KC
  2. 从返回的JSON中提取cid字段即为oid

Q3:SnowNLP准确率不高怎么办?

A:可尝试以下优化:

  1. 结合多个模型:同时使用THULAC、BosonNLP等
  2. 人工标注训练:收集1000条标注数据微调模型
  3. 规则补充:对"希望"、"建议"等中性词做特殊处理

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分钟弹幕。

五、技术延伸方向

  1. 实时情感监控:用WebSocket实时抓取新评论
  2. 跨平台对比:同时分析B站、抖音、微博的相同话题评论
  3. 深度学习应用:用BERT等模型提升情感分析准确率
  4. 虚假评论检测:通过发布时间、设备信息等识别水军

通过这套技术方案,即使是初学者也能在48小时内完成从数据采集到情感分析的全流程。记住:技术只是手段,真正有价值的是从数据中发现的洞察。下次当你看到B站视频下方成千上万的评论时,不妨思考:这些文字背后,隐藏着怎样的群体心理?

相关推荐
AI算法董同学16 小时前
轻松测试二维码生成与识别:使用Python的qrcode、opencv和pyzbar库
开发语言·python·opencv
陈增林16 小时前
基于 PyQt5 的多算法视频关键帧提取工具
开发语言·qt·算法
郝学胜-神的一滴17 小时前
Linux系统函数stat和lstat详解
linux·运维·服务器·开发语言·c++·程序人生·软件工程
编程岁月17 小时前
java面试-0141-java反射?优缺点?场景?原理?Class.forName和ClassLoader区别?
java·开发语言·面试
、花无将17 小时前
PHP:配置问题从而导致代码运行出现错误
开发语言·php
小小测试开发17 小时前
pytest 库用法示例:Python 测试框架的高效实践
开发语言·python·pytest
BUG弄潮儿17 小时前
go-swagger标准接口暴露
开发语言·后端·golang
至善迎风17 小时前
把 Python 应用打包成 Mac 应用程序 — 完整指南
python·macos
数字化顾问17 小时前
Flink ProcessFunction 与低层级 Join 实战手册:实时画像秒级更新系统
java·开发语言