ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

B站评论爬虫零门槛上手:一次登录,把完整评论数据自动搬进Excel

B站评论爬虫零门槛上手:一次登录,把完整评论数据自动搬进Excel

B站评论爬虫零门槛上手:一次登录,把完整评论数据自动搬进Excel

【免费下载链接】BilibiliCommentScraperB站视频评论爬虫 Bilibili完整爬取评论数据,包括一级评论、二级评论、昵称、用户ID、发布时间、点赞数项目地址: https://gitcode.com/gh_mirrors/bi/BilibiliCommentScraper

BilibiliCommentScraper 是一个面向普通人的 B站评论爬虫:你把视频列表扔给它,它就用浏览器替你一页页翻完整个评论区,把一级评论、二级评论、昵称、用户ID、发布时间、点赞数全部整理成 Excel 能直接打开的 CSV 文件。不管你是想分析观众反馈的UP主,还是需要评论数据写论文的同学,都能靠它绕开"自己写爬虫"这件事,把精力留给真正重要的分析。

这篇文章会沿着一条完整的上手路线带你走一遍:先看它到底能给你什么,再一步步跑通第一次采集,然后学会断点续爬和参数调优,最后用一段代码把数据变成结论。全程用你能直接照抄的命令和代码,不需要额外脑补。

先看它替你干了哪些活

动手之前,先弄清这份工具的能力边界,免得期待落空。它的核心工作就三件:

  • 翻全评论区:B站评论是滚动加载的,它模拟真人下滑页面,把能看到的评论一层层加载出来,而不是只拿接口返回的前几十条。
  • 保留对话层级:评论区是树状的——一级评论直接回复视频,二级评论回复一级评论。它把"谁回复了谁"的关系完整记录,不会拆散对话。
  • 批量跑视频:你把视频链接一行一个写进清单,它按顺序逐个处理,每个视频单独输出一份数据文件。

除此之外,还有两个容易被忽略但很省心的设计:一次扫码登录后自动记住你的身份(cookie 存成本地文件),以及把进度实时写盘(中断后能接着上次的位置继续跑)。后面两章会分别展开。

跑完一个视频后,你会拿到类似下面这样一张表,每一行是一条评论,层级、时间、点赞一目了然:

起步前的三件小事:装环境、装依赖、拿到项目

这个工具需要你电脑上有三样东西,缺一不可,但都不难:

  1. Python 3:运行脚本的基础环境,3.8 及以上版本都可以。
  2. Chrome 浏览器:推荐用最新版,工具会基于它模拟浏览器操作。
  3. 项目本体:把仓库克隆到本地:
git clone https://gitcode.com/gh_mirrors/bi/BilibiliCommentScraper.git cd BilibiliCommentScraper

然后安装三个 Python 库。打开命令行,执行这一条就够:

pip install selenium beautifulsoup4 webdriver-manager

说明:selenium负责驱动浏览器,beautifulsoup4负责解析网页结构,webdriver-manager负责自动下载匹配你 Chrome 版本的驱动。如果你后面想用 pandas 做数据分析,可以顺手加装一个:pip install pandas

装完之后,项目文件夹里应该能看到Bilicomment.py(主程序)、video_list.txt(视频清单)、README.md(官方说明)。建议先扫一眼 README,它把参数含义写得很清楚,后面调参时会用到。

第一次跑通全流程:从视频清单到数据文件

第一步:填视频清单

打开video_list.txt,每行写一个B站视频链接,程序会从上往下依次处理:

https://www.bilibili.com/video/BV17M41117eg https://www.bilibili.com/video/BV1QF411q73H https://www.bilibili.com/video/BV1c14y147g6

带不带链接后面的?spm_id_from=...参数都可以,程序会自动从链接里提取视频 ID。

第二步:启动程序

在项目目录下运行:

python Bilicomment.py

程序会先弹出一次浏览器窗口,跳到B站登录页。此时你只需要做一件事:扫码登录你的B站账号。登录成功跳转后,回到命令行按回车,程序会把登录状态保存成cookies.pkl文件——这是你唯一一次需要手动登录,之后每次运行它都会自动登录,直到 cookie 失效(失效后删掉cookies.pkl重新登一次即可)。

第三步:等待自动采集

按下回车后,程序会切换成无头模式(不弹窗、不加载图片,省内存)继续工作。接下来每个视频都会经历这样的流程:

  1. 打开视频页,向下滚动加载评论区,直到滚不动为止;
  2. 逐条读取一级评论,写入 CSV;
  3. 发现某条一级评论有"查看全部"按钮或二级评论列表时,点进去逐页翻完所有二级评论;
  4. 处理完一个视频,自动开始下一个。

控制台会实时打印进度,比如"第1个视频BV17M41117eg-第3个一级评论下的全部内容已完成爬取",你可以随时观察它跑到哪了。

第四步:拿到结果

每个视频生成一个以视频 ID 命名的 CSV 文件,比如BV17M41117eg.csv,和代码文件放在同一目录。中途被跳过的视频会记录在video_errorlist.txt里,方便你事后排查。

读懂输出的每一列:九栏字段与评论层级

CSV 文件共九列,每一列对应一类信息。以 README 和实际输出为准,字段含义如下:

列名含义
编号该评论所属一级评论的位置序号(从0开始),不是行号
隶属关系一级评论 或 二级评论
被评论者昵称这条评论回复的对象;一级评论固定为"up主"
被评论者ID回复对象的用户ID;一级评论固定为"up主"
昵称发表这条评论的用户昵称
用户ID发表这条评论的用户ID
评论内容完整的评论文本
发布时间发布时间,精确到分钟
点赞数该评论获得的点赞量

两个容易误解的地方提前说明:

  • "被评论者昵称/ID"里的一级评论显示"up主",这不是爬出来的,是程序自己写入的文字,表示"这条评论直接回复视频作者"。
  • 同一编号下的多条二级评论,共享一个编号,代表它们挂在同一条一级评论下面。用"编号+隶属关系"两列,就能把整棵评论树还原出来。

中途关掉也不怕:断点续爬是怎么记住进度的

这是整个工具最值得单独讲的功能。爬热门视频动辄一两个小时,如果中途断网、电脑断电、或者你手动关了程序,进度不会丢。秘密就在progress.txt这个文件里——程序每处理完一个节点,就把当前位置写进去,格式长这样:

{"video_count": 1, "first_comment_index": 15, "sub_page": 114, "write_parent": 1}

四个字段分别对应四个"坐标":

  • video_count:已经完整跑完第几个视频(从0开始计数);
  • first_comment_index:当前视频处理到第几条一级评论;
  • sub_page:当前这条一级评论的二级评论翻到了第几页;
  • write_parent:当前一级评论是否已经写入文件(1已写,0未写)。

下次运行时,程序读到这个文件,会直接跳到上次停下的位置继续,连已经写了一半的 CSV 也是接着追加,不会从头再来。你可以把它理解成看书时夹在书里的书签——书签在哪,下次就从哪接着读。

更妙的是,这个文件还能反过来当"遥控器"用:

  • 想从头重爬:删除progress.txt,程序会当你是第一次运行;
  • 想跳过某个死活爬不动的视频:把video_count加 1,程序就直接从下一个视频开始;
  • 想跳过某条一级评论:把first_comment_index改成想跳过的位置。

不过要注意:手动改这三个值时,write_parent要跟着改成 0,否则会出现"一级评论没写入就直接跳走"的情况。

把爬取节奏调成你的:三个参数与两种延时

默认参数对大多数视频够用,但遇到超大评论量的热门视频,你可能会想调整节奏。所有参数都集中在Bilicomment.py里,改完保存、重新运行即可。

1. 滚动次数MAX_SCROLL_COUNT(默认45)

B站每向下滚动一次加载约20条一级评论,45次大约对应920条。数值越大抓得越多,但浏览器内存占用也越大,可能直接把页面撑崩。程序注释里有个实测参考:滚动45次时,曾完整爬取标称评论数7443条的视频,实际拿到3581条。拿不准就先用默认值。

2. 二级评论页数max_sub_pages(默认150)

控制单条一级评论下的二级评论最多翻多少页。想无限制就改成max_sub_pages = None,但强烈不建议——热门评论的回复可能上百页,内存会先撑不住。150页已经是很宽裕的上限。

3. 滚动停顿SCROLL_PAUSE_TIME(默认4秒)

每次滚动后等多久再滚下一次。调大一些更稳,代价是更慢。

4. 两种延时策略

代码里的time.sleep(2)是固定延时。如果发现程序频繁被B站"冷处理"(控制台长时间没动静),可以换成随机延时,让请求节奏更像真人:

import random time.sleep(random.uniform(1, 5)) # 每次随机等1到5秒

注意滚动次数和二级评论页数是一对"贪心组合":两个都拉满,内存压力会叠加。稳妥的做法是二选一优先满足你的目标——要覆盖面就多滚动,要对话深度就多翻二级评论。

常见问题自查清单:按症状对症下药

跑起来之后大概率会遇到下面几种情况,按症状对照处理即可。

症状一:CSV 用 Excel 打开是乱码

文件是 UTF-8 编码的,老版本 Excel 默认按 GBK 打开就会乱。两种解法:先用记事本打开确认内容正常,或者用 Excel 的"数据 → 从文本/CSV 导入",导入时手动选择 UTF-8 编码。另外,如果某个单元格显示$NAME?,那不是数据坏了,而是内容以-开头(比如昵称-Ghauster),Excel 把它误当成公式了,忽略即可。

症状二:报错 Permission denied

几乎都是文件被占用:CSV 或progress.txt正被 Excel、编辑器等其他程序打开,或者当前用户没有目录写入权限。关掉占用文件的程序再试;还不行就以管理员身份运行程序。注意程序对这类错误有自愈机制——遇到权限错误会等10秒重试,最多重试50次,你通常来得及去关掉那个占着文件的程序。

症状三:爬热门视频时浏览器崩溃

典型表现是控制台打印"网页崩溃"后自动重启浏览器。如果崩溃发生在滚动加载阶段(还没开始写数据),说明是滚动次数太多导致内存耗尽,把MAX_SCROLL_COUNT调小,比如30或20。如果崩溃发生在爬取中途,不用慌,程序会重启浏览器并靠断点续爬接着跑,但建议顺手清理一下项目目录里的临时缓存文件夹(程序用完后可以自行删除)。

症状四:拿到的评论数比B站显示的少

先别怀疑工具。B站存在评论数虚标,部分评论会被平台隐藏、封禁或由用户自行删除,所以实际爬到的数量通常小于标称数量。验证方法很简单:手动打开视频页滚动到底,看你最后能看到的几条评论,和 CSV 里最后几条是否一致。一致就说明所有可见评论都完整拿到了。

症状五:程序长时间没动静

多半是访问太频繁被B站限流了,有时还会弹出验证码。先重启程序——它会断点续爬,不丢数据。如果反复出现,就按上一章的方法把延时改长或改成随机延时。

拿到数据之后:五分钟跑一个评论分析小样例

数据到手,分析就交给 pandas。下面这段代码可以直接存成.py文件运行,帮你快速建立对数据的基本认知:

import pandas as pd df = pd.read_csv('BV17M41117eg.csv', encoding='utf-8') # 评论总量与层级构成 print(f"总评论数:{len(df)}") print(f"一级评论:{df[df['隶属关系'] == '一级评论'].shape[0]}") print(f"二级评论:{df[df['隶属关系'] == '二级评论'].shape[0]}") # 点赞最高的前5条评论 top = df.nlargest(5, '点赞数')[['昵称', '评论内容', '点赞数']] print(top) # 最活跃的评论者 active = df.groupby('用户ID')['昵称'].count().sort_values(ascending=False).head(10) print(active)

在此基础上你可以继续扩展:把发布时间解析成小时,看观众几点最活跃;按"隶属关系"分组,比较一级和二级评论的话题差异;甚至用点赞数做加权,找出真正有影响力的声音。数据是结构化的,分析思路就能自由发挥。

现在就可以动手

到这里,你已经知道它是什么、怎么用、怎么调、出问题怎么处理。剩下的就是亲自跑一次。完整流程再压缩成四步:

git clone https://gitcode.com/gh_mirrors/bi/BilibiliCommentScraper.git cd BilibiliCommentScraper pip install selenium beautifulsoup4 webdriver-manager python Bilicomment.py

然后:编辑video_list.txt填入链接 → 扫码登录 → 按回车 → 等待 → 打开生成的 CSV。

最后给你两条实用建议:第一,第一次测试选一个评论量几百的视频,跑通流程后再碰热门视频,体验会顺滑很多;第二,记得给这个项目点个 star——作者在 README 里专门写了这句话,好用的话别吝啬。


祝你顺利拿到第一份完整的B站评论数据。

【免费下载链接】BilibiliCommentScraperB站视频评论爬虫 Bilibili完整爬取评论数据,包括一级评论、二级评论、昵称、用户ID、发布时间、点赞数项目地址: https://gitcode.com/gh_mirrors/bi/BilibiliCommentScraper

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

返回列表