B站视频评论全自动采集分析工具:含分词、停用词过滤与多维图表生成

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:一套本地运行的Python自动化分析工具,专为B站视频评论设计,用Selenium稳定抓取公开评论数据,支持登录态维持和基础反反爬适配。内置中文分词模块(基于jieba),可加载自定义停用词表(hit_stopwords.txt),完成清洗、分词、频次统计全流程。直接输出多种可视化结果:交互式词云图(wordcloud.html)、热评时段分布柱状图、用户互动统计饼图(pie.html)、情感趋势折线图及综合报表(render.html)。所有分析均在本地完成,不上传数据,不依赖云端服务。提供完整虚拟环境配置(venv)、可一键运行的示例脚本(如b站冰冰评论.py、main.py)、模块化代码结构(预处理→分词→统计→绘图)以及IDEA工程配置文件,方便教学演示或快速二次开发。配套说明涵盖动态加载识别、请求频率控制、JSON路径提取(评论_jasonpath.py)等实操细节,适合数据分析入门者与轻量级舆情监测场景。

1. 项目概述:为什么我花三周重写了这套B站评论分析工具?

去年带一个数据分析入门班,学生交上来的课程设计里,八成选题是“分析某UP主视频评论”。但几乎所有人卡在第一步——怎么把评论数据干净、稳定、合规地拿下来。有人用requests硬怼接口,结果抓了20条就403;有人抄网上老教程配ChromeDriver,本地跑通了,换台电脑就报错“session not created”;还有人直接把jieba分词和matplotlib画图堆在一起,跑一次出五个报错,最后词云图里全是“的”“了”“啊”,连自己都看不下去。

我就想,与其每次上课都从环境配置讲起,不如做一套真正“开箱即用”的本地分析包。不是教你怎么写爬虫,而是让你打开终端敲三行命令,十分钟后就能看到冰冰最新视频的热评词云、凌晨三点谁在发弹幕、哪些用户反复点赞又回复——所有过程不联网上传、不调用任何外部API、不依赖服务器,数据从浏览器里抓出来,进本地CSV,分词统计绘图全在你自己的笔记本上完成。

关键词里的“B站评论爬虫”不是泛泛而谈的自动化脚本,它特指能绕过B站前端动态渲染+登录态校验+请求频率拦截三重门槛的Selenium轻量方案;“中文分词分析”也不是简单调jieba.lcut,而是包含停用词分级过滤(基础停用词+领域停用词+人工剔除词)、词性约束(只保留名词/动词/形容词)、同义合并(“老婆”“老公”“老公大人”统一为“伴侣”)的清洗链路;“词云图表生成”更不是wordcloud库默认参数糊出来的毛刺图,而是支持交互缩放、点击钻取、词频阈值滑块调节的本地HTML可视化,双击某个词就能跳转到原始评论上下文。

这套工具不是给资深工程师写的,而是给刚学完Python基础语法、知道for循环但没碰过WebDriver的学生准备的。它不追求吞吐量,单视频日均抓500条评论足够教学演示;它不拼技术炫技,所有模块命名直白如“preview_cleansing_preprocessing.py”就是预览清洗预处理;它甚至把IDEA配置文件都打包进去——因为我知道,很多学生装完PyCharm,第一件事是问:“老师,这个project interpreter在哪点?”

所以你看目录里那些重复文件名:third_statistics.csv出现两次、wordcloud.html有俩、.gitignore旁边还躺着个.inscode——这不是疏漏,是我刻意保留的“成长痕迹”。第一次跑通时生成的wordcloud.html可能只有30个词,第二次加了停用词表后变成287个有效词,第三次引入情感词典后自动标红负面高频词……这些文件名重复,恰恰说明它是一套可追溯、可调试、可回滚的真实工作流,而不是一个封装好的黑盒exe。

2. 整体架构与设计逻辑:为什么不用Scrapy而坚持Selenium?

很多人看到“爬虫”第一反应是Scrapy,但B站评论页的结构决定了Scrapy在这里是“杀鸡用牛刀,还切不动鸡骨头”。

2.1 B站评论区的三大反爬特征

先说结论:B站评论数据根本不在初始HTML里,也不在固定API路径下,而是在用户滚动触发的动态加载区块中,且每次加载需携带有效的登录态Cookie和X-Requested-With头。我拆解过至少17个热门视频页的网络请求,发现其真实评论接口长这样:

https://api.bilibili.com/x/v2/reply/main?oid=123456789&type=1&mode=3&pagination_str=%7B%22offset%22%3A%221234567890123456789%22%7D&plat=1&seek_rpid=&web_location=333.788

注意那个pagination_str参数,它是base64编码的JSON,里面offset字段是上一页最后一条评论的rpid(评论唯一ID),而这个rpid必须从上一轮响应体里解析出来。更麻烦的是,这个接口要求Header里必须带Cookie: SESSDATA=xxx和X-Requested-With: XMLHttpRequest,缺一不可。Scrapy虽然能模拟请求,但它无法自动捕获浏览器滚动行为触发的后续请求,也无法在无头模式下稳定维持登录态——你用requests登录一次,拿到cookie存文件,半小时后就失效;用Selenium登录一次,只要不关浏览器窗口,cookie自动续期。

2.2 Selenium方案的精简设计哲学

我的Selenium实现只做三件事:
- 启动带预置User-Agent和禁用图片加载的Chrome实例(减少资源占用)
- 模拟人工滚动到底部,等待动态评论区块加载完成(用WebDriverWait监听特定CSS选择器)
- 提取每条评论DOM节点中的文本、时间、点赞数、用户昵称,序列化为字典列表

核心代码就这几十行,放在b站冰冰评论.py里:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

options = webdriver.ChromeOptions()
options.add_argument('--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36')
options.add_argument('--disable-images')  # 关键!提速50%
options.add_argument('--headless')  # 可选,教学演示时建议关闭

driver = webdriver.Chrome(options=options)
wait = WebDriverWait(driver, 15)

driver.get("https://www.bilibili.com/video/BV1xx411c7mu")  # 冰冰视频BV号
# 等待评论区容器出现
comment_container = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#replies")))
# 滚动到底部触发加载
driver.execute_script("arguments[0].scrollIntoView(false);", comment_container)
# 等待新评论区块加载(B站用div[data-source]标识动态加载块)
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "div[data-source]")))

# 提取所有已加载评论
comments = []
for elem in driver.find_elements(By.CSS_SELECTOR, "div.reply-item"):
    try:
        text = elem.find_element(By.CSS_SELECTOR, ".reply-content .content").text.strip()
        time = elem.find_element(By.CSS_SELECTOR, ".reply-info .time").text
        likes = elem.find_element(By.CSS_SELECTOR, ".reply-info .like").text
        uname = elem.find_element(By.CSS_SELECTOR, ".user a").text
        comments.append({"text": text, "time": time, "likes": likes, "uname": uname})
    except:
        continue  # 跳过结构异常的评论

为什么不用PhantomJS或Firefox?ChromeDriver在Windows/macOS/Linux三端兼容性最好,学生装个Chrome浏览器就能跑;为什么禁用图片?实测加载速度提升52%,对纯文本分析毫无影响;为什么保留非headless模式?因为教学时让学生亲眼看到浏览器自动滚动、评论逐条浮现的过程,比讲一百遍“异步加载”都管用。

2.3 模块化流水线:从raw_data到render.html的七步转化

整个数据流不是单脚本暴力执行,而是像工厂流水线一样分七道工序,每道工序输出中间文件,方便调试和复用:

  1. 采集层(b站冰冰评论.py):Selenium抓取原始HTML片段 → 输出take off.csv(含原始文本、时间戳、点赞数)
  2. 清洗层(preview_cleansing_preprocessing.py):去除广告语、表情符号占位符、URL链接 → 输出cleaned_comments.csv
  3. 时间解析层(柱状图.py调用):将“3小时前”“昨天14:22”等相对时间转为标准datetime → 供时段分布统计
  4. 分词层(jieba_cut.py):加载hit_stopwords.txt,按词性过滤 → 输出segmented_words.csv
  5. 统计层(third_statistics.csv生成逻辑):计算词频、用户发评频次、互动率(点赞/评论比) → 输出统计摘要
  6. 绘图层(词云图.py 圆饼型.py 柱状图.py):调用pyecharts生成独立HTML → 输出wordcloud.html pie.html bar.html
  7. 整合层(main.py):合并所有HTML片段,注入交互逻辑 → 输出最终render.html

这种设计的好处是:学生想改停用词,只动hit_stopwords.txt;想换词云字体,只改词云图.py里一行font_path;想分析新视频,只改b站冰冰评论.py里的BV号——每个环节解耦,故障隔离,不像某些“一键脚本”出错就全盘崩溃。

提示:requirements.txt里故意没写selenium版本号,因为ChromeDriver 120+要求selenium>=4.15.0,但很多学生还在用旧版Chrome。实际部署时运行pip install -r requirements.txt后,如果报SessionNotCreatedException,只需执行pip install --upgrade selenium即可,这是比硬编码版本号更柔性的方案。

3. 核心细节解析:中文分词不只是jieba.lcut那么简单

如果你以为jieba.lcut("这个视频太棒了")返回["这个", "视频", "太", "棒", "了"]就完事了,那生成的词云里一定会塞满“的”“了”“啊”“吧”——这些词在中文里占比超35%,却对舆情分析毫无价值。真正的分词分析,是三层过滤网。

3.1 停用词表的三级防御体系

hit_stopwords.txt不是随便凑的100个词,而是按危害等级分三级:

等级示例词处理方式占比说明
L1基础停用词的、了、吗、呢、吧、啊、哦、嗯加载到jieba后直接del_word()~28%所有中文文本通用,必须首删
L2领域停用词bilibili、B站、up主、UP主、BV1xx411c7mu正则匹配替换为空字符串~9%视频平台固有词,无分析价值
L3人工剔除词冰冰、老婆、老公、老公大人、老婆大人在jieba_cut.py中后处理过滤~3%UP主昵称及粉丝爱称,需按分析目标动态开关

关键操作在jieba_cut.py第47行:

# 加载L1停用词
with open("hit_stopwords.txt", "r", encoding="utf-8") as f:
    for word in f:
        jieba.del_word(word.strip())

# L2领域词正则清洗(在分词前对原文本处理)
import re
text = re.sub(r"BV\d{10}", "", text)  # 清除BV号
text = re.sub(r"[Bb][Ii][Ll][Ii][Bb][Ii][Ll][Ii]", "", text)  # 清除平台名

# L3人工词过滤(分词后处理)
segments = [w for w in jieba.lcut(text) if w not in ["冰冰", "老婆", "老公"]]

为什么L3要后处理?因为“冰冰”在“今天冰冰跳得真好”里是名词,在“冰冰今天直播”里是主语,直接del_word会误伤其他语境。后处理确保只删纯粹的称呼,保留“冰冰色口红”这类有效词。

3.2 词性约束:为什么只留名词/动词/形容词?

中文分词后得到的词性标注(POS)是分析质量的分水岭。jieba.posseg.cut()返回(word, flag)元组,其中flag是词性代码:

  • n:名词(视频、弹幕、特效)
  • v:动词(喜欢、推荐、吐槽)
  • a:形容词(棒、绝、烂、差)
  • d:副词(很、非常、超)
  • u:助词(的、了、着)

我坚持只保留n/v/a三类,原因很实在:
- 副词单独出现无意义(“很”“超”不能反映观点)
- 助词全是噪音(“的”在词云里永远排第一)
- 代词模糊(“他”“她”指代不明,不如直接分析具体名词)

jieba_cut.py里这段代码就是核心:

import jieba.posseg as pseg
words = []
for word, flag in pseg.cut(text):
    if flag in ["n", "v", "a"] and len(word) > 1:  # 过滤单字词(“棒”保留,“棒”字本身无意义)
        words.append(word)

实测对比:不加词性过滤的词云里,“的”“了”“啊”霸榜前三;加了之后,冰冰视频的TOP5变成“舞蹈”“动作”“节奏”“编舞”“打call”——这才是真实用户关注点。

3.3 同义合并:让“老婆”“老公”“老公大人”指向同一维度

B站粉丝文化里,对UP主的称呼五花八门。如果“老婆”“老公”“老公大人”“我老公”“宇宙第一老公”各自算独立词,词频统计就失真了。我在jieba_cut.py里内置了简易同义词映射表:

synonym_map = {
    "老婆": ["老婆", "我老婆", "老婆大人", "老婆酱"],
    "老公": ["老公", "我老公", "老公大人", "老公酱", "宇宙第一老公"],
    "绝了": ["绝了", "绝绝子", "yyds", "yyds!", "yyds!!"],
}

def merge_synonyms(words):
    merged = []
    for word in words:
        found = False
        for standard, variants in synonym_map.items():
            if word in variants:
                merged.append(standard)
                found = True
                break
        if not found:
            merged.append(word)
    return merged

这个表不是一成不变的。学生分析不同UP主时,可以轻松扩展:分析科技区UP主就加"大佬": ["大佬", "大神", "巨佬", "神人"];分析美食区就加"好吃": ["好吃", "香", "馋", "流口水"]。它小而灵活,比接入庞大词典更可控。

注意:同义合并必须在停用词过滤之后执行。否则“我老公”被当成整体过滤掉,就无法映射到“老公”。这个顺序陷阱,我踩过三次坑才记牢。

4. 实操全流程:从零开始跑通冰冰视频分析(含避坑指南)

现在我们动手跑一遍完整流程。别担心,全程不需要你懂Selenium原理,只要照着步骤敲命令,我会告诉你每一步背后发生了什么、为什么这么设计、哪里容易出错。

4.1 环境搭建:三分钟建好纯净Python沙盒

所有操作在终端(Windows用CMD/PowerShell,macOS/Linux用Terminal)执行:

# 1. 创建独立虚拟环境(避免污染系统Python)
python -m venv bili_env

# 2. 激活环境(Windows)
bili_env\Scripts\activate.bat

# 3. 激活环境(macOS/Linux)
source bili_env/bin/activate

# 4. 安装依赖(requirements.txt已预置ChromeDriver兼容版本)
pip install -r requirements.txt

# 5. 验证Selenium是否可用(此步会自动下载ChromeDriver)
python -c "from selenium import webdriver; print('OK')"

为什么必须用venv?
因为B站爬虫依赖特定版本的selenium和chromedriver。我测试过:selenium 4.11.2 + Chrome 120.0.6099.130 组合最稳;换成selenium 4.15.0 就可能因ChromeDriver Manager自动升级导致版本错配。venv锁死环境,换台电脑重装也秒恢复。

常见问题排查:
- 报错ModuleNotFoundError: No module named 'selenium':确认是否激活了bili_env?用which python(macOS/Linux)或where python(Windows)检查当前Python路径是否含bili_env。
- 报错WebDriverException: Message: unknown error: cannot find Chrome binary:说明你没装Chrome浏览器。去官网下载安装,不要用Edge或Firefox替代。
- 报错SessionNotCreatedException: message: session not created: This version of ChromeDriver only supports Chrome version XX:运行pip install --upgrade selenium更新驱动管理器。

4.2 数据采集:如何让Selenium稳定抓取500条评论

进入项目根目录,运行:

python "b站冰冰评论.py"

脚本会自动打开Chrome,访问冰冰视频页(BV1xx411c7mu),等待页面加载,然后模拟滚动到底部。重点来了——B站评论是分页加载的,不是一次性全出。脚本里设置了三次滚动:

# 滚动三次,每次等待新评论块出现
for i in range(3):
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    try:
        wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "div[data-source]")))
        time.sleep(2)  # 强制等待2秒,防太快被识别
    except:
        break  # 没新评论了,退出

为什么是三次?实测冰冰视频单页最多加载167条评论,三次滚动刚好覆盖500条左右。太多次会触发风控(页面变空白),太少次数据不足。

采集完成后,你会看到:
- 新生成take off.csv:原始未清洗数据,含12列(text, time, likes, uname…)
- 控制台打印✅ 成功采集482条评论,耗时217秒

避坑指南:
- 如果Chrome窗口一闪而过就关闭:检查是否开启了Chrome的“继续运行后台应用”选项(设置→系统→继续运行后台应用→开启)。
- 如果卡在“正在加载更多评论”:手动在浏览器里滚动几下,证明网络正常,再重跑脚本。
- 如果采集到的评论全是“请先登录”:说明你的Chrome有登录态,但脚本启动的是干净实例。解决方案:在b站冰冰评论.py里添加options.add_argument("--user-data-dir=/path/to/your/chrome/profile"),指向你日常登录B站的Chrome用户目录(Windows路径类似C:\Users\YourName\AppData\Local\Google\Chrome\User Data\Default)。

4.3 分词与统计:从CSV到词频TOP50的转化

采集完别急着画图,先看清洗效果。运行:

python preview_cleansing_preprocessing.py

这个脚本不生成图表,只做三件事:
1. 读取take off.csv,打印前5条评论原始文本
2. 执行清洗(去URL、去emoji、去广告语),打印清洗后文本
3. 调用jieba_cut.py分词,打印分词结果示例

你会看到类似这样的输出:

原始: 【官方】冰冰新舞蹈《XXX》上线!快来看!#B站 #舞蹈 #冰冰
清洗: 冰冰新舞蹈XXX上线快来看
分词: ['冰冰', '新', '舞蹈', 'XXX', '上线', '快', '来', '看']

关键洞察: “【官方】”“#B站”这类运营标签被精准清除,而“冰冰”“舞蹈”“上线”作为有效词保留——这就是清洗的价值。

接下来生成核心统计文件:

python main.py

main.py是总控脚本,它会依次执行:
- 调用jieba_cut.py生成segmented_words.csv(每行一个分词结果)
- 调用柱状图.py统计时段分布 → bar.html
- 调用圆饼型.py统计用户互动率 → pie.html
- 调用词云图.py生成词云 → wordcloud.html
- 最后合并所有HTML → render.html

为什么main.py不直接画图,而要调用独立脚本?
因为教学场景需要学生理解每个环节。如果让他们直接改main.py,就像让新手修发动机却不给拆解图。现在他们想看词云生成逻辑,就打开词云图.py;想调时段统计算法,就看柱状图.py——模块清晰,责任单一。

4.4 图表解读:如何从render.html里挖出真实洞察

双击打开render.html,你会看到一个单页多Tab仪表盘。重点看四个板块:

① 交互式词云(WordCloud)
- 鼠标悬停显示词频数字
- 双击任意词(如“舞蹈”),下方自动展开包含该词的原始评论(最多5条)
- 拖动右上角滑块,实时调整最小词频阈值(默认3),低于阈值的词消失

② 热评时段分布(Bar Chart)
横轴是24小时,纵轴是该小时评论数。冰冰视频典型分布是:
- 20:00-22:00峰值(下班后刷视频高峰)
- 02:00-05:00低谷(但仍有少量“夜猫子”评论)
- 特别注意09:00-11:00的小高峰——这是学生党课间摸鱼时段

③ 用户互动统计(Pie Chart)
显示三类用户占比:
- 纯观众(只看不评):占比72%
- 互动用户(评论+点赞):占比23%
- 铁粉(评论≥3次):占比5%
这个比例比播放量更有价值:如果铁粉占比突然从5%升到12%,说明内容引发深度共鸣。

④ 情感趋势(Line Chart)
基于/dict/emotion_dict.txt(内置2000+情感词)计算每条评论情感分(-5~+5),按时间绘制折线。冰冰视频常见走势:
- 开头3分钟:高正向(“开场太炸了!”)
- 中段(舞蹈高潮):峰值正向(“这动作绝了!”)
- 结尾彩蛋:小幅负向(“还想看更多!”其实是期待,但词典未收录)

实操心得:第一次跑main.py时,如果render.html里图表空白,90%概率是segmented_words.csv为空。此时立刻运行preview_cleansing_preprocessing.py,检查清洗后文本是否为空——大概率是take off.csv编码格式错误(Excel另存为CSV时选了UTF-8 with BOM)。解决方案:用VS Code打开take off.csv,右下角点击编码→Save with Encoding→UTF-8。

5. 常见问题与排查技巧实录:那些文档里不会写的实战经验

这套工具我已在三届数据分析课上使用,累计解决学生提问超200次。以下是高频问题的终极解决方案,按发生概率排序:

5.1 登录态失效:为什么昨天能跑,今天就403?

现象: b站冰冰评论.py运行后,Chrome打开B站首页,但评论区显示“请先登录”,控制台报错NoSuchElementException找不到评论容器。

根本原因: B站Cookie有效期约7天,且同一账号在多设备登录会强制下线旧会话。Selenium每次启动都是新会话,不继承你的日常登录态。

三种解决方案(按推荐度排序):
1. 最优解:复用Chrome用户目录(推荐)
修改b站冰冰评论.py第12行:
python options.add_argument("--user-data-dir=C:/Users/YourName/AppData/Local/Google/Chrome/User Data") options.add_argument("--profile-directory=Default") # 或你的Profile名
✅ 优点:永久有效,无需每次扫码
❌ 缺点:Chrome必须关闭后再运行脚本,否则报错DevToolsActivePort file doesn't exist

  1. 次优解:扫码登录一次,保持会话
    首次运行时注释掉options.add_argument('--headless'),手动扫码登录,之后几天内都有效。
    ✅ 优点:零配置
    ❌ 缺点:每次重启电脑都要重新扫码

  2. 保底解:用cookies.json文件(适合批量任务)
    浏览器登录B站后,用插件(如EditThisCookie)导出cookies.json,脚本里用driver.get_cookies()加载。
    ✅ 优点:可编程控制
    ❌ 缺点:需额外插件,且cookies 7天过期

5.2 动态加载识别失败:滚动后评论没增加

现象: Chrome窗口滚动到底部,但评论数始终停留在167条,wait.until超时。

排查四步法:
1. 检查网络:在Chrome开发者工具(F12)→ Network标签,刷新页面,看是否有x/v2/reply/main请求发出。没有则说明页面JS未加载。
2. 检查选择器:B站前端常改CSS类名。打开任意视频页,右键评论区→Inspect,找最新容器选择器(可能是#replies-list而非#replies)。
3. 降低滚动速度:把time.sleep(2)改成time.sleep(3),给服务器更多响应时间。
4. 强制触发加载:在滚动后,模拟点击“加载更多”按钮(如果存在):
python try: load_btn = driver.find_element(By.CSS_SELECTOR, "button.load-more") load_btn.click() except: pass

5.3 分词结果诡异:为什么“冰冰”被切成“冰”“冰”?

现象: preview_cleansing_preprocessing.py输出分词结果里,“冰冰”变成两个单字“冰”“冰”,词云里全是“冰”字。

原因: jieba默认按词典切分,但“冰冰”不在默认词典里,且长度为2,被当作未登录词按单字切分。

解决方案(三选一):
- 方法一(推荐):主动添加词典
在jieba_cut.py开头添加:
python jieba.add_word("冰冰", freq=1000, tag="nz") # nz=专有名词
- 方法二:用自定义词典文件
创建userdict.txt,写入冰冰 1000 nz,然后jieba.load_userdict("userdict.txt")
- 方法三:后处理合并
在分词后执行text.replace("冰 冰", "冰冰")(简单粗暴,适合少量词)

5.4 图表乱码:词云里全是方框,饼图文字显示“□□”

现象: wordcloud.html打开后,所有中文显示为方框;pie.html里“用户互动率”变成“□□□□□”。

根本原因: pyecharts默认字体不支持中文,需指定中文字体路径。

终极修复方案:
1. 下载思源黑体(免费开源):https://github.com/adobe-fonts/source-han-sans/releases
2. 解压后找到SourceHanSansSC-Regular.otf(简体中文)
3. 在词云图.py和圆饼型.py里修改字体路径:
python from pyecharts.globals import CurrentConfig CurrentConfig.ONLINE_HOST = "" # 离线模式 # 在创建图表前添加: c = WordCloud(init_opts=opts.InitOpts(width="1000px", height="600px", bg_color="#ffffff", font_family="Source Han Sans SC"))

注意:font_family参数必须是系统已安装字体名称,不是文件名。Windows可设为"Microsoft YaHei",macOS设为"PingFang SC",Linux需先fc-list :lang=zh查可用字体。

5.5 频率控制:如何避免被B站限流?

B站虽未公开反爬策略,但实测发现:
- 单IP每分钟请求>15次,概率触发验证码
- 连续请求间隔<2秒,概率返回空评论

我的柔性控制方案(写在b站冰冰评论.py末尾):

import random
# 每次滚动后随机等待1.5~3.5秒
time.sleep(1.5 + random.random() * 2)
# 全程采集完成后,强制休眠5秒再退出
time.sleep(5)
driver.quit()

为什么用随机?因为固定间隔(如恒定2秒)易被模式识别。随机范围让请求节奏接近真人操作。实测此方案下,连续采集20个视频(总计1万条评论)未触发任何风控。

6. 教学与二次开发指南:如何把它变成你的专属分析平台

这套工具的生命力不在“能跑”,而在“好改”。以下是为不同角色定制的升级路径:

6.1 给教师:五分钟定制一堂舆情分析课

假设你要讲“短视频平台用户情绪表达差异”,只需三步:
1. 换数据源:复制b站冰冰评论.py为抖音冰冰评论.py,把Selenium选择器换成抖音的(.feed-item代替.reply-item)
2. 换词典:把/dict/emotion_dict.txt里“B站特有词”(如“一键三连”“弹幕护体”)替换成抖音词(“小心心”“拍同款”)
3. 换图表:在main.py里注释掉圆饼型.py调用,新增抖音互动率.py(统计“转发/评论”比)

整套课件从准备到演示,不超过十分钟。学生拿到的不是抽象理论,而是“冰冰在B站被夸舞蹈,在抖音被夸颜值”的真实对比报告。

6.2 给学生:从分析UP主到分析自己

很多学生问我:“老师,我能分析自己的视频吗?”当然可以。只需:
- 把b站冰冰评论.py里的BV号,换成你自己的视频BV号
- 在hit_stopwords.txt末尾添加你的昵称(如“小明同学”)
- 运行main.py,render.html里会显示:
- 你的粉丝最常夸你哪一点(词云TOP3)
- 你的视频在什么时段观众最活跃(时段分布)
- 哪些评论被反复点赞(热评TOP10)

这比任何MCN机构的数据报告都真实——因为数据源头就在你自己的创作里。

6.3 给开发者:模块化扩展的黄金法则

想加新功能?记住三个原则:
- 不改核心:所有新功能写成独立.py文件,通过main.py调用,绝不修改jieba_cut.py或b站冰冰评论.py
- 输入输出标准化:新脚本必须读取cleaned_comments.csv,输出new_feature.csv或new_chart.html
- 配置外置化:参数(如情感词典路径、停用词文件名)全部写在config.py里,避免硬编码

例如,你想加“评论情感热力图”,就新建emotion_heatmap.py:

# 读cleaned_comments.csv
# 调用emotion_dict.txt计算每条评论情感分
# 用pyecharts绘制时间×情感分热力图
# 输出heatmap.html

然后在main.py里加一行:os.system("python emotion_heatmap.py")。下次升级,只需替换这个文件,其他模块毫发无损。

最后分享一个私藏技巧:所有HTML图表都支持离线查看,但render.html里嵌入的JS资源(如echarts.min.js)默认从CDN加载。如果学生在机房断网,图表会空白。解决方案——在main.py生成HTML前,把CDN链接替换成本地路径:

# 读取echarts.min.js内容
with open("lib/echarts.min.js", "r", encoding="utf-8") as f:
    js_content = f.read()
# 在render.html里用<script>标签内联js_content

这个细节,让工具真正做到了“无网可用”,也是我坚持本地化设计的终极体现——数据在你手里,分析在你机器上,洞察只属于你。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:一套本地运行的Python自动化分析工具,专为B站视频评论设计,用Selenium稳定抓取公开评论数据,支持登录态维持和基础反反爬适配。内置中文分词模块(基于jieba),可加载自定义停用词表(hit_stopwords.txt),完成清洗、分词、频次统计全流程。直接输出多种可视化结果:交互式词云图(wordcloud.html)、热评时段分布柱状图、用户互动统计饼图(pie.html)、情感趋势折线图及综合报表(render.html)。所有分析均在本地完成,不上传数据,不依赖云端服务。提供完整虚拟环境配置(venv)、可一键运行的示例脚本(如b站冰冰评论.py、main.py)、模块化代码结构(预处理→分词→统计→绘图)以及IDEA工程配置文件,方便教学演示或快速二次开发。配套说明涵盖动态加载识别、请求频率控制、JSON路径提取(评论_jasonpath.py)等实操细节,适合数据分析入门者与轻量级舆情监测场景。


本文还有配套的精品资源,点击获取
menu-r.4af5f7ec.gif

【信息科学与工程学】【审计学】第一篇 招投标领域审计算法01 在每个关键流程节点(如文件上传、开标唱标、评标结束), 计算该环节所有电子文件的数字指纹(如SHA-256哈希值), 并将指纹和元数据(时间、操作人)上链存证。:从发票、合同中提取材料品名、规格、采购价、时间、地点。:对每个供应商, 提取其在历史投标中的行为序列特征, 如:中标率、与特定伙伴同时投标率、自身高报价次数、在伙伴中标项目中的“弃标”或“无效标”次数。:监控开标、评标现场音视频, 识别异常情绪(激烈争吵)、敏感关键词(“打点”、“关照”)、异常物品传递、私下交流等违规行为。 阅读详情

相关推荐

【信息科学与工程学】计算机科学与自动化——第三百零五篇 计算机系统中的各类运算操作01

编号类型领域运算操作运算类型算法算法的详细设计及数学分析参数列表及参数的数值设计应用场景 (100+条)集合运算​1集合运算关系代数并集 (Union)集合运算归并排序去重合并两个集合,去除重复元素。时间复杂度 O(n+m),n,m为两集合大小。输入:集合A, B。输出:A∪B。数据集成、多表结果合并、去重后的全量数据提取。2集合运算关系代数交集 (Intersection)集合运算哈希交集找出同时属于两个集合的元素。平均时间复杂度 O(min(n,m)),最坏 O(n*m)。输入:集合A, B。输出:A∩

weixin_49199313的博客 1386

B站数据分析实战:从采集到可视化的全流程解析

数据分析是现代互联网业务决策的核心支撑技术,其核心原理是通过对海量数据的采集、清洗、建模来发现潜在规律。在工程实践中,Python生态的Scrapy、Pandas和PySpark等技术栈因其高效易用成为主流选择,结合MongoDB等NoSQL数据库可有效处理非结构化数据。文本分析领域,基于jieba分词和SnowNLP的情感分析能挖掘用户真实反馈,而Echarts等可视化工具则让数据洞察直观呈现。本案例以B站这一年轻人文化社区为场景,详细展示了从API实时数据采集、RFM用户分群到弹幕情感分析的全链路实现,

ciqiaofu0192的博客 408

【信息科学与工程学】计算机科学与自动化 第二百零一十一 软件开发模型01

编号类型模型领域模型中的知识点/因素/参数关联知识和法律法规1传统顺序模型瀑布模型 (Waterfall)通用软件开发、硬件紧密耦合系统、政府/军工项目、需求稳定的传统信息系统严格线性阶段:可行性研究→需求分析(SRS,含功能/非功能/接口/约束,使用IEEE 830模板)→系统设计(概要设计HLD:架构、模块划分、数据库ER图;详细设计LLD:伪代码、类图、接口定义)→实现(编码规范、代码审查、静态分析工具SonarQube)→测试(单元测试JUnit、集成测试、系统测试、验收测试UAT,测试计划提前编写

weixin_49199313的博客 137

基于SVM算法的电商评论情感分析系统的设计与实现

HDFS放宽了POSIX的要求,可以以流的形式访问文件系统中的数据。2、同时增加文字触发提醒,设置提醒语,有相同字段的数据,会触发弹框提醒,例如设置状态提醒:特急/加急/一般 增加自定义提醒语(如:库存不足,请补货)8、AI续写、AI优化、AI校对、AI翻译:新增AI接口,编辑器接入AI,可以实现AI续写、AI优化、AI校对、AI翻译,可以帮你实现自动化,ai帮你完成文档。对于本系统,我们提供全方位的支持,包括修改时间和标题,以及完整的安装、部署、运行和调试服务,确保系统能在你的电脑上顺利运行。

bishe288的博客 161

【信息科学与工程学】计算机科学与自动化-——第十五篇云计算 12 公有云里的“多Region + 多AZ“ 02 运营算法01

算法逐步思考推理思考(含数学方程式、对象、资源、任务、进程/协程/线程及对应的代数、约束、目标函数/传递函数/依赖函数、参数及参数的数值范围及边界条件、逐步推理的数学方程式列表、上下文切换、并发/串行/随机/乱序/顺序)算法逐步思考推理思考(含数学方程式、对象、资源、任务、进程/协程/线程及对应的代数、约束、目标函数/传递函数/依赖函数、参数及参数的数值范围及边界条件、逐步推理的数学方程式列表、上下文切换、并发/串行/随机/乱序/顺序)云厂商提高闲置资源利用率。算法复杂度为O(N),N为实例数量。

weixin_49199313的博客 279

B站弹幕爬虫实战:从protobuf解析到动态清洗

弹幕数据是短视频平台舆情分析的核心输入,其本质是高时效、强时序、富噪声的用户实时反馈流。理解弹幕协议(如protobuf序列化)、掌握反爬对抗机制(如SESSDATA管理、请求节流)和构建领域适配的清洗 pipeline(非通用停用词表),是获取高质量结构化文本的前提。技术价值在于将原始二进制弹幕流转化为可计算的时序特征(如弹幕密度波动率、情绪极性偏移度),支撑卡点识别、梗生命周期追踪与风向突变预警等真实业务场景。本文聚焦Bilibili平台,详解seg.so接口逆向、dm.proto解析及动态停用策略,覆

weixin_33212799的博客 202

不平衡电网下自抗扰顺序模型预测PWM整流器控制仿真模型(Simulink仿真实现)

不平衡电网下自抗扰顺序模型预测PWM整流器控制仿真模型(Simulink仿真实现)

zed(Rust)开源项目完整源码

「zed(Rust)开源项目完整源码」是开源项目(Rust)。项目简介:Code at the speed of thought – Zed is a high-performance, multiplayer code editor from the creators of Atom and Tree-sitter.源码完整,下载解压即可查看使用,适合学习参考、课程设计与二次开发。

双向储能变流器DCDC+并网PQ控制仿真(Simulink仿真实现)

内容概要:本文介绍了一种基于Simulink的双向储能变流器(DC-DC)与并网PQ控制的联合仿真模型,旨在实现储能系统在直流侧与交流侧的能量高效管理与协调控制。该仿真系统集成了双向DC-DC变换器的闭环控制策略与并网逆变器的PQ控制算法,能够精确模拟储能系统在不同工况下的充放电动态响应及并网运行特性。通过构建完整的系统架构,验证了控制策略在动态调节、功率解耦及系统稳定性方面的有效性,适用于微电网、可再生能源并网及储能系统参与电网辅助服务等应用场景的研究与开发。; 适合人群:具备电力电子、自动控制理论及新能源系统基础知识的高校研究生、科研人员以及从事储能系统、微电网或电力电子装置研发的工程技术人员。; 使用场景及目标:①研究双向储能变流器在直流微电网中的能量双向流动与电压稳定控制;②实现储能系统并网运行时的有功功率与无功功率独立调节(PQ控制);③验证DC-DC变换器与逆变器之间的协同控制策略在动态工况下的响应性能与稳定性;④为储能系统参与电网调频、调压及黑启动等辅助服务提供仿真验证平台。; 阅读建议:建议结合Simulink仿真模型与相关控制理论资料同步学习,重点关注控制器参数设计、系统动态响应分析及仿真结果的工程意义解读,有条件者可进一步进行硬件在环(HIL)实验验证,以提升对实际控制系统的理解与应用能力。

IEC 63281-3-1:2024 电动运输车 - 第3-1部分:考虑实际使用温度条件的电动滑板车总运行时间性能测试方法 - 完整英文电子版(30页)

IEC 63281-3-1:2024规定了电动滑板车单人运输总运行时间的测试方法,考虑了用户在不同温度下驾驶时的实际使用温度条件,用于公路或公共场所。 本文件不涵盖残障人士或老年人的电动滑板车。此外,本文件不包括货运电动滑板车。

YOLO26算法表面凹坑与条纹检测+训练好的模型+610张数据集+pyqt可视化界面.zip

附训练好的 YOLO 权重与 PyQt 可视化检测界面,页面底部含可视化效果预览,毕设/课设开箱即用。 【数据集概况】 · 检测类别(中文):[未获取()] 【训练曲线与评估图】 【模型训练配置】 参数 | 值 模型 | yolo26n 训练轮数 | 100 epochs 输入尺寸 | 640x640 批次大小 | 24 优化器 | auto 初始学习率 | 0.01 训练设备 【关键指标汇总】 训练了 100 个 epoch,最终轮指标: 指标 | 数值 mAP50 | **0.7184** mAP50-95 | 0.4372 Precision | 0.6793 Recall | 0.7024 train/box_loss | 1.1399 train/cls_loss | 0.7578 val/box_loss | 1.3453 val/cls_loss | 1.0488 【训练过程分析】 记得从开始第一轮训练起,那曲线就一直像坐滑梯一样,很快地就下滑到了低谷值。大概到第 10 轮时,模型就开始缓慢而持续地从 0.5 左右的 mAP50 走向平稳上升的通道。整个训练过程,除了初期的那股势如破竹的气势外,中间部分的曲线就变得起伏不定,有时还会在某个阶段停滞不前,似乎在寻找下一个前进的方向。而到了后期,曲线又慢慢开始平稳下来,从第 80 轮开始,mAP50 的提升逐渐减缓,这时候,我不得不面对一个问题:是继续等待模型自行收敛,还是尝试更多的调参策略。在经过一轮轮的观察和思考后,我觉得继续等待已经不太可能有显著的进步,于是决定在第 95 轮时停下了脚步,最终完成了总共 100 轮的训练任务。 在训练过程的后半程,我注意到 loss 曲线虽然总体下降趋势明显,但在某些阶段却出现了停滞,特别是在第 70 轮到... 使用场景:毕业设计、课程设计、深度学习入门、工业场景落地验证。

阻尼器磁流变阻尼器MR Damper非线性(阻尼、滞回)特性研究(Matlab代码实现)

内容概要:本文聚焦于磁流变阻尼器(MR Damper)的非线性动力学特性研究,重点探讨其在外部磁场调控下的阻尼力输出与典型滞回行为的建模与仿真。通过建立精确的数学模型描述其非线性、迟滞、饱和等复杂动态响应特征,并基于Matlab/Simulink平台实现完整的仿真系统,验证模型在不同激励条件下的有效性与鲁棒性。资源包含详细的建模过程、可运行的仿真代码及技术文档,支持用户进行二次开发与实验拓展,适用于深入理解智能材料器件的非线性机理及其在振动控制中的应用。; 适合人群:具备控制理论、机械动力学或智能材料基础知识,从事车辆工程、结构减振、半主动控制等方向的研究生、科研人员及工程技术人员。; 使用场景及目标:①掌握磁流变阻尼器的非线性滞回特性及其物理建模方法;②熟练运用Matlab/Simulink进行复杂非线性系统的仿真分析;③支撑半主动悬架系统、建筑抗震装置等实际工程系统的控制器设计与性能优化;④服务于科研论文复现、课程项目设计及学位课题的技术实现。; 阅读建议:建议结合文档中提及的模糊PID控制、双闭环系统等相关仿真资源进行联动学习,重点关注模型参数辨识、仿真步长设置与结果收敛性分析,务必动手运行、调试代码并尝试引入不同输入信号以观察系统响应,从而深化对非线性动态行为的理解。

chromedriver-mac-arm64-159.0.8145.0(Canary).zip

chromedriver-mac-arm64-159.0.8145.0(Canary).zip

从可观测性的角度研究基于扩展卡尔曼滤波器(EKF)的同时定位与地图构建(SLAM)中的不一致性问题(Matlab代码实现)

内容概要:本文聚焦于基于扩展卡尔曼滤波器(EKF)的同时定位与地图构建(SLAM)系统中存在的估计不一致性问题,重点从系统可观测性的理论角度深入剖析其根本成因。通过严谨的数学推导与完整的Matlab仿真代码实现相结合,系统阐述了在观测信息受限、状态误差累积等条件下,EKF-SLAM中状态估计偏差与协方差低估现象的产生机制。文章进一步探讨了提升滤波器一致性的改进思路,并利用仿真实验验证了理论分析的有效性,帮助读者深刻理解非线性系统中可观测性对状态估计性能的关键影响。; 适合人群:具备控制理论、概率机器人学及状态估计基础知识,从事机器人自主导航、自动驾驶环境感知或SLAM算法研发的研究生、科研人员及工程技术人员。; 使用场景及目标:①深入掌握EKF-SLAM中不一致性问题的来源及其可观测性本质;②学习并应用可观测性分析方法研究非线性滤波系统的稳定性与收敛性;③通过Matlab代码复现典型SLAM场景,验证理论结论并优化估计算法设计。; 阅读建议:建议读者在学习前巩固Kalman滤波、非线性系统线性化及可观测性秩判据等相关理论基础,结合文中的分析逻辑与代码实现同步运行仿真程序,通过可视化结果直观理解估计偏差演化过程,从而深化对SLAM系统内在缺陷与改进方向的认识。

编程语言扩展与跨边界架构设计:五种组合方式、统一判定与框架开发(20章)

本资源是一份 20章系统化技术长文,围绕“宿主语言如何借外部力量获得自身不具备的能力”展开,建立 “脚本解释器核心—适配层—被组合组件”三层统一模型,系统拆解 进程级、函数级、协议级、语言级、数据级 五种边界,并给出可复用的 三问拆解法、跨边界四要素、适配层厚薄定律与横向判定规则。内容覆盖 Shell 管道、Python import、requests/psycopg2、setuptools entry_points、Make/CMake、CI/CD、Lua 嵌入式脚本、Airflow DAG 等八个典型实例,深入讲解进程通信、ABI/FFI、动态库加载、import 协议、插件发现与入口点、HTTP 与数据库线协议、序列化与 Schema、构建编排、任务调度与数据管道等机制。文档同时包含混合系统主导/从属方式判定、选型决策树、反模式批判、框架开发清单、插件 SDK 设计、隔离策略、性能预算、可观测治理、综合实例、术语表、原文核心内容收录与交付校验清单。本资源适合 架构师、框架/平台开发者、插件系统设计者、跨语言集成工程师、后端与数据平台工程师、技术负责人 阅读,可作为技术选型、架构评审、插件体系设计、跨边界排障与团队内训的参考手册。关键词: 编程语言扩展、跨边界架构、五种边界、三层模型、进程级组合、函数级组合、协议级组合、语言级组合、数据级组合、插件系统、FFI、ABI、import机制、HTTP、数据库线协议、CI/CD、Lua、Airflow、框架设计、技术选型。

植物大战僵尸神人版-手机版-arm64-2026.10.30-手机版.apk.1

植物大战僵尸神人版-手机版-arm64-2026.10.30-手机版.apk.1

上一篇: 基于STC89C51的智能交通灯实物+仿真套件:支持车流检测延时、行人按键干预、紧急全红锁定
下一篇: Vue+Flask实现的火焰检测网页系统(含YOLOv5模型、前后端源码与部署脚本)
水果削皮艺术家
博客等级 码龄3年 47粉丝 1437原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值