这是一个基于 FastAPI 和 Playwright 的 Web 可视化B站评论抓取应用。用户可以通过简单的网页操作,实现自动登录获取Cookie、指定视频BV号、实时查看爬取日志,并最终下载包含所有评论(可选含楼中楼)的CSV文件。 Python 3.11 截图预览
- Web 可视化界面: 无需编写任何代码,在浏览器中即可完成所有操作。
- 一键自动获取Cookie: 利用 Playwright 自动打开浏览器,用户只需扫码登录B站,程序即可自动捕获必要的Cookie,极大降低了使用门槛。
- 指定BV号爬取: 支持输入任意B站视频的BV号作为爬取目标。
- 支持爬取楼中楼: 可自由选择是否需要深入爬取每条主评论下的二级评论(楼中楼回复)。
- 实时日志反馈: 采用 Server-Sent Events (SSE) 技术,在网页上实时显示爬取过程中的每一步状态、进度和可能出现的错误。
- CSV文件导出: 爬取完成后,自动生成CSV格式的评论数据文件,并提供直接下载链接。
- 异步非阻塞: 后端采用 FastAPI 和 asyncio,保证了高并发和流畅的用户体验。
为了应对B站严格的请求限制并尽可能获取最全面的数据,本项目内置了双重保障策略:
-
突破API分页上限: 我们发现B站的API对单种排序方式的评论存在约5000条的翻页上限(会返回
max offset exceeded错误)。为了突破这一限制,本工具会自动执行一个双重排序爬取策略:- 首先按 【时间】 排序爬取,直到获取全部或达到5000条上限。
- 然后自动切换到按 【热度】 排序再次爬取,同样直到获取全部或达到上限。
- 最后,程序会将两份结果在本地合并并自动去重。 通过这种方法,对于评论数极多的视频,最终可以获取到远超5000条、接近1万条理论上限(若含楼中楼则1w+)的独特评论集合。示例:爬取自BV1BK411L7DJ
-
模拟真人防风控: 在上述爬取过程中,集成了模拟真人行为的防风控机制:
- 分块请求与长时暂停: 程序会自动将请求划分为随机大小的"块"(例如,每8-15页)。每完成一个块,会进行一次长达15-30秒的随机暂停,以模拟用户阅读评论的停顿行为,打破持续请求的机器人特征。
- 随机化延时: 无论是块内的分页请求,还是楼中楼的并发请求,所有的等待延时都经过了随机化处理,避免了固定的请求间隔。
- 并发数量控制: 在爬取楼中楼评论时,通过
asyncio.Semaphore严格限制并发任务的数量(默认为5),防止因流量突增而触发服务器风控。
策略效果与性能说明
- 成功率: 经过多次测试,当前策略在爬取大量评论(3w+)的视频(例如 BV1BK411L7DJ)时,能够稳定完成任务,有效规避风控和API上限问题。
- 性能: 由于采用了保守的延时和双重爬取模式,爬取时间会显著变长(大约每20分钟处理5000条评论)。如果您的目标视频评论数较少(如少于3000条)且希望加快速度,可以自行在
app/scraper.py文件中适当缩短asyncio.sleep的延时时间或调整分块大小。
.
├── app # 主应用目录
│ ├── main.py # FastAPI 核心逻辑:路由、WebSocket、SSE等
│ ├── scraper.py # 爬虫核心模块,调用 bilibili-api
│ ├── static # 静态文件
│ │ ├── css/style.css
│ │ └── js/main.js
│ └── templates # Jinja2 前端模板
│ └── index.html
├── requirements.txt # Python 依赖列表
└── run.py # 项目启动文件
为了确保环境纯净且与项目兼容,强烈建议使用 Conda 来管理 Python 环境。
-
克隆项目
git clone https://github.com/ManiaAmaeOvo/bilibili_comment_scraper_webui cd bilibili_comment_scraper_webui -
创建并激活 Conda 环境 (推荐使用 Python 3.11)
# 创建一个名为 biliscraper 的新环境,并指定 python 版本为 3.11 conda create -n biliscraper python=3.11 -y # 激活该环境 conda activate biliscraper
-
安装 Python 库 项目的所有 Python 依赖都记录在
requirements.txt文件中。pip install -r requirements.txt
-
安装 Playwright 浏览器驱动 (非常重要!) Playwright 需要一个真实的浏览器内核来执行自动化操作。
pip只安装了 Python 的库,我们还需要下载浏览器驱动。# 此命令会自动下载并安装 Chromium, Firefox, WebKit 等浏览器的驱动文件 playwright install如果网络不佳或只想安装 Chrome 驱动,可以使用
playwright install chrome。
所有依赖安装完成后,在项目根目录下运行 run.py。
python run.py
启动成功后,您会看到类似以下的输出:
INFO: Started server process [xxxxx]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on [http://127.0.0.1:8000](http://127.0.0.1:8000) (Press CTRL+C to quit)
-
访问应用: 打开您的浏览器 (推荐使用 Chrome),访问 http://127.0.0.1:8000。
-
自动获取Cookie:
- 点击 "自动获取Cookie" 按钮。
- 程序会自动打开一个新的浏览器窗口并导航到B站登录页。
- 在网页的实时日志区域,您会看到提示。请按照提示,在新弹出的浏览器窗口中使用B站手机App扫描二维码完成登录。
- 登录成功后,程序会自动跳转页面并捕获Cookie,然后将其填充到文本框中。此过程完成后,浏览器窗口会自动关闭。
-
输入视频BV号: 在 "第二步" 的输入框中,填入您想要爬取评论的视频BV号(例如:
BV1TAnozgEpe)。 -
选择是否爬取楼中楼: 根据您的需求,勾选或取消勾选 "爬取楼中楼 (二级评论)" 复选框。
-
开始爬取: 点击 "开始爬取" 按钮。下方的实时日志区会开始滚动显示爬取进度。
-
下载文件: 当日志显示 "文件保存成功!" 时,下方会出现一个可点击的下载链接。点击该链接即可下载包含所有评论数据的
.csv文件。
- 后端:
- 框架: FastAPI
- Web服务器: Uvicorn
- B站API库: bilibili-api
- 浏览器自动化: Playwright
- 前端:
- 模板: Jinja2
- 样式与脚本: 原生 HTML, CSS, JavaScript
- 实时通信:
- Cookie获取: WebSocket
- 日志推送: Server-Sent Events (SSE)
- 本项目的核心爬取功能依赖于强大的 bilibili-api 库,它极大地简化了与B站API的交互。感谢其作者的无私奉献。官方文档:https://nemo2011.github.io/bilibili-api/
- 感谢 Google Gemini 在代码编写、前端设计和文档撰写过程中提供的巨大帮助。
This project is licensed under the MIT License - see the LICENSE file for details.