B站评论如何完整获取?BilibiliCommentScraper 爬虫工具从入门到实战
B站评论如何完整获取?BilibiliCommentScraper 爬虫工具从入门到实战
【免费下载链接】BilibiliCommentScraperB站视频评论爬虫 Bilibili完整爬取评论数据,包括一级评论、二级评论、昵称、用户ID、发布时间、点赞数项目地址: https://gitcode.com/gh_mirrors/bi/BilibiliCommentScraper
如果你正在做内容运营、用户研究或舆情分析,一定遇到过这种尴尬:明明想分析B站视频的评论区,却只能手动截图、复制,忙活一晚上拿到的数据还不到真实评论的零头。开源工具BilibiliCommentScraper就是为了根治这个痛点而生的——它基于 Selenium 模拟真人浏览器,能帮你完整爬取B站视频的评论数据,包括一级评论、二级评论、昵称、用户ID、发布时间与点赞数,并且支持批量视频、断点续爬。本文会从零开始,带你跑通第一个采集任务,再逐步解锁调优、排障和数据分析的进阶玩法。
一个让人崩溃的深夜场景
假设你是一位科普UP主,刚发布了一条关于"结石到底有多痛"的视频,评论区炸了——几百条一级评论下又挂着上千条二级评论,大家分享各自的就医经历,这正是你下一期选题的金矿。
于是你打开浏览器,开始手动收集。复制、粘贴、翻页、再复制……两小时后你发现:只存下来 30 多条,还全部是一级评论,那些最有价值的互动对话全丢了。更崩溃的是,你手一抖关掉了文档,进度归零。
这不是你笨,而是"手动方案"天然就有天花板。
卡住你的,其实是这三道坎
坎一:可见的永远只是冰山一角。B站热门视频的评论区动辄数千条,而页面默认加载、手动滚动能看到的只是其中一部分。没有工具的辅助,你永远在采集"被截断的数据"。
坎二:对话的"家谱"被拆散了。评论区是典型的树状结构:一级评论直接挂在视频下,二级评论挂在某条一级评论下。绝大多数"简单爬虫"只抓表层,导致"谁回复了谁"这条关系链彻底断裂,后续做互动分析时完全无从下手。
坎三:批量与中断,是压垮人的两座大山。要分析 10 个、20 个视频时,重复劳动指数级增长;爬取中途程序崩溃、网络抖动,一切又要从头再来——这种挫败感足以劝退大多数人。
BilibiliCommentScraper 的出现,就是同时解决这三道坎。
破局思路:为什么是"模拟真人浏览器"而不是调接口
市面上不少方案走的是 B站开放接口路线,简单是简单,但接口往往有配额限制、字段缺失,甚至随时变更。而 BilibiliCommentScraper 选择了另一条路:用 Selenium 驱动 Chrome,像真人一样打开视频页、向下滚动、点击"查看全部"和"下一页",再从渲染完成的页面里提取评论。页面能看到什么,它就能拿到什么。
| 对比维度 | 直接调接口 | 本工具(Selenium 模拟浏览器) |
|---|---|---|
| 数据完整性 | 受配额与返回条数限制 | 页面可见评论基本都能拿到 |
| 二级评论 | 经常拿不全 | 逐条翻页抓取,支持自定义上限 |
| 登录门槛 | 需要申请权限/维护 Token | 手动扫码一次,Cookie 永久复用 |
| 批量能力 | 需自行处理限流 | 内置 video_list.txt 批量队列 |
| 中断恢复 | 通常需要自研 | 内置断点续爬,随时可停可续 |
一次扫码,之后自动登录。首次运行会弹出浏览器,你扫码登录一次,程序就把登录态写进同目录下的cookies.pkl。只要这个文件不被删除,之后的每次运行都会自动"免登录"入场,非常适合挂机跑整夜。
三分钟跑通第一个采集任务
先别急着研究原理,我们直接上手。你只需要完成四步。
第一步:准备环境
- 系统里装好Python 3.8+和Chrome 浏览器(建议最新版)。
- 打开终端,安装依赖:
pip install selenium beautifulsoup4 webdriver-managerwebdriver-manager会自动下载与浏览器匹配的驱动,省去了手动配 WebDriver 的麻烦。如果之后还想做数据分析,顺手装个 pandas 会更方便:
pip install pandas第二步:把视频地址写进清单
在项目根目录新建(或编辑)video_list.txt,每行放一个视频 URL,程序会按顺序逐个处理:
https://www.bilibili.com/video/BV17M41117eg https://www.bilibili.com/video/BV1QF411q73H https://www.bilibili.com/video/BV1c14y147g6想加多少加多少,这就是你的"批量任务清单"。
第三步:启动并完成首次登录
运行主程序:
python Bilicomment.py第一次运行时,Chrome 窗口会先打开一次,终端出现类似"请登录,登录成功跳转后,按回车键继续"的提示。你扫码登录 B站,跳转成功后回到终端按回车,程序就会进入正式的采集流程。
第四步:看结果
采集是自动化的:程序先不断向下滚动把一级评论全部加载出来,再逐条展开二级评论、翻页抓取。每个视频跑完后,会在同目录生成一个以视频ID命名的 CSV 文件,比如BV17M41117eg.csv。上面那张示例图,就是某个视频采集结果的真实样貌——每行一条评论,字段规整、层级分明。
读懂 CSV 里的每一列
打开生成的 CSV,你会看到 9 列数据,含义如下:
| 列名 | 含义说明 |
|---|---|
| 编号 | 该评论在视频评论列表中的序号,从 0 开始递增 |
| 隶属关系 | 一级评论 / 二级评论,标明评论所在层级 |
| 被评论者昵称 | 被回复对象的昵称;一级评论固定显示"up主" |
| 被评论者ID | 被回复对象的用户ID;一级评论固定显示"up主" |
| 昵称 | 本条评论发布者的昵称 |
| 用户ID | 本条评论发布者的用户ID |
| 评论内容 | 完整评论文本 |
| 发布时间 | 精确到分钟的时间戳 |
| 点赞数 | 该评论收获的点赞数 |
注意:一级评论的"被评论者"两列显示"up主",是程序主动写入的标记,用来表示"这条评论直接回复视频作者",并非抓取到的真实昵称。
有了"隶属关系"和"编号"两列,你就能在数据层面完美还原评论区的树状对话结构,这是很多轻量爬虫给不了的。
断点续爬:中断不再是灾难
这是本工具最值得夸的"杀手锏":程序每处理完一条评论,都会把进度写入progress.txt。哪怕中途断电、断网、浏览器崩溃,重启程序后它都能精准接上上次的位置,继续往下爬。
progress.txt 里到底存了什么
文件内容是一个很简单的 JSON:
{"video_count": 1, "first_comment_index": 15, "sub_page": 114, "write_parent": 1}四个字段的含义:
video_count:已经完整跑完的视频数量(从 0 开始计数);first_comment_index:当前视频处理到第几条一级评论;sub_page:当前这条一级评论的二级评论翻到了第几页;write_parent:当前一级评论是否已写入 CSV(1 已写,0 未写)。
三种常见的进度干预手段
- 想全部重来:删掉
progress.txt,程序会从头开始; - 想跳过某个爬坏了的视频:把
video_count直接加 1,下个视频就是起点; - 想跳过部分评论:把
first_comment_index改成你想开始的位置即可。
这意味着你完全不需要守着程序跑完——把任务挂上,出门吃个饭回来接着跑,它认得路。
把采集速度与稳定性调到最佳
工具开箱即用的默认参数已经够稳,但针对不同量级的视频,你可以在Bilicomment.py里做三处关键调优。
控制一级评论的加载深度
程序靠"反复滚动到底部"来触发懒加载,每滚一次大约多出 20 条一级评论。默认的滚动上限是 45 次,大约对应 920 条一级评论:
MAX_SCROLL_COUNT = 45 # 滚动次数上限,越大抓得越多,但内存占用越高对于评论量特别大的爆款视频,建议适当调小这个值,防止页面因数据量过大而崩溃。
给二级评论翻页设个上限
二级评论往往体量惊人,默认最多翻 150 页;如果你的视频评论不多,也可以设成无限制:
max_sub_pages = 150 # 二级评论最大页数;想不设限就写 None设一个合理上限既能控制耗时,也能显著降低内存压力。
用随机延时降低被限流概率
连续高频操作容易被平台"特别关注"。稳妥的做法是引入随机延时,让请求节奏更像真人:
import random time.sleep(random.uniform(1, 5)) # 随机等待 1~5 秒浏览器层面的省内存小动作
工具默认已经开启了无头模式、静音、禁用图片加载和 GPU 加速,这些都是为了在长跑任务中省内存、防崩溃。另外,程序会在代码目录下创建临时缓存文件夹来存放浏览器数据;如果跑久了发现磁盘占用变大,可以在重试前手动清掉它。
高频问题快问快答
Q1:CSV 用 Excel 打开乱码怎么办?答:CSV 是 UTF-8 编码。要么先用记事本/VS Code 打开确认内容,要么在 Excel 里用"数据 → 从文本/CSV 导入"并手动选择 UTF-8。用 pandas 读也完全没问题。
Q2:报错 Permission denied 怎么处理?答:九成是文件被占用了——比如你正用 Excel 开着正在写入的 CSV,或者progress.txt被其他程序锁住。关掉占用程序即可;如果确认没被占用,可以尝试以管理员身份运行。程序本身对这类错误做了最多 50 次、每次间隔 10 秒的自动重试。
Q3:爬到的数量比页面上标的评论数少?答:这是正常现象。B站存在评论数虚标,部分评论会被平台隐藏、屏蔽或由用户自行删除。判断是否抓全的方法很简单:手动把网页滚到评论底部,对照最后几条评论是否和 CSV 尾部一致——一致就说明所有可见评论都已到手。
Q4:处理超大热门视频时页面崩了?答:不用慌,程序会自动重启浏览器并断点续爬。如果是在"还没滚到底就开始爬"的阶段反复崩溃,说明数据量超过了页面承载,此时应调小MAX_SCROLL_COUNT。
拿到数据之后,可以做什么
采集只是第一步,数据到手后的想象力才真正打开。先看一段最基础的分析代码:
import pandas as pd df = pd.read_csv('BV17M41117eg.csv', encoding='utf-8') print("总评论数:", len(df)) print("一级评论数:", (df['隶属关系'] == '一级评论').sum()) print("二级评论数:", (df['隶属关系'] == '二级评论').sum()) print("平均点赞数:", round(df['点赞数'].mean(), 2)) # 按小时看评论活跃分布 df['发布时间'] = pd.to_datetime(df['发布时间']) print(df.groupby(df['发布时间'].dt.hour).size())三个立刻能落地的场景:
- 内容创作者:从高赞评论里挖选题灵感,识别观众最关心的痛点,反哺下一期视频;
- 市场与舆情:监控品牌相关视频的评论区走向,第一时间发现负面声音和用户真实需求;
- 学术研究者:基于"一级/二级"关系构建用户互动网络,做情感分析、话题演化研究。
别忘了合规这条底线
能力越大,越要克制。请务必遵守以下原则:
- 只采集公开可见的评论,不碰任何需要登录权限才能看的私密内容;
- 控制请求频率,避免对平台造成压力,这也是工具内置延时机制的意义所在;
- 数据仅用于个人研究、学习等正当用途,不要用于商业牟利或侵犯他人权益的场合;
- 涉及个人昵称、用户ID等数据时,注意脱敏与保管,防止泄露。
出发前的自查清单
正式开工前,逐项确认下面这些"待办",能帮你少走很多弯路:
- Python 3.8+ 与 Chrome 已安装,依赖已通过 pip 装好;
video_list.txt里的 URL 每行一个,格式正确;- 首次运行已扫码登录,
cookies.pkl已生成; - 根据目标视频的评论量,调好了
MAX_SCROLL_COUNT与max_sub_pages; - 已了解
progress.txt的四个字段,知道怎么续跑、怎么跳过; - 已安排合理的延时策略,避免高频请求触发限流;
- 明确数据的用途边界,合规使用。
如果这些都对上了,那就动手吧。获取项目只需一行命令:
git clone https://gitcode.com/gh_mirrors/bi/BilibiliCommentScraper编辑好video_list.txt,运行python Bilicomment.py,扫码登录后把剩下的交给程序。建议第一次先从评论量较小的视频试水,熟悉节奏后再挑战热门爆款。当你看到那份结构完整、层级清晰的 CSV 时,会发现:原来拿到 B站全量评论,真的可以这么省心。
【免费下载链接】BilibiliCommentScraperB站视频评论爬虫 Bilibili完整爬取评论数据,包括一级评论、二级评论、昵称、用户ID、发布时间、点赞数项目地址: https://gitcode.com/gh_mirrors/bi/BilibiliCommentScraper
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考