前言
弹幕是B站特色的实时评论,而评论区则是用户深度讨论的阵地。无论是为了做舆情监控、用户情感分析,还是训练NLP模型,B站评论区的数据都具有极高的价值。
本文基于真实项目代码,详细介绍如何使用Python爬取B站视频的评论区数据。与弹幕不同,评论区数据通过JSON API返回,需要处理分页、用户信息提取、数据持久化等问题。文章还会对比原版代码和AI优化版代码的差异,展示如何让爬虫代码更健壮。
技术背景
本项目涉及以下核心技术和库:
- requests:发送HTTP请求,调用B站评论API
- json:解析API返回的JSON格式评论数据
- os / datetime:从环境变量读取配置、动态生成文件名
- B站评论API:
/x/v2/reply/wbi/main是B站评论的核心接口,支持分页、排序
B站评论API需要携带有效的Cookie(尤其是 SESSDATA 和 bili_jct 字段),否则可能无法获取完整数据或被限流。
实现思路
B站评论区爬取的整体流程如下:
1 | ┌─────────────────────────────────────────────┐ |
关键参数说明:
oid:视频的av号(aid),也可以通过BV号转换得到type:评论类型,=1 表示视频评论mode:排序方式,=2 表示按热度排序,=3 表示按时间排序pn:页码,从1开始ps:每页条数,默认20
核心代码解析
1. 原版代码:简单直接但不够健壮
原版代码直接写死API URL,缺乏异常处理:
1 | import json |
原版的问题:
- URL中的
w_rid和wts是签名参数,会过期,写死后无法长期使用 - 没有异常处理,请求失败会直接抛异常
- 文件名写死,多次运行会覆盖之前的数据
- 没有实现分页,只能获取第一页评论
2. AI优化版:增加异常处理和动态文件名
1 | import json |
优化版的改进:
- 使用
try-except捕获各类异常 - 检查HTTP状态码再解析JSON
- 动态文件名,避免数据覆盖
- 支持从环境变量读取敏感配置
3. 完整的分页爬取实现
要结合分页逻辑,需要不断翻页直到没有更多评论:
1 | def fetch_all_comments(oid, max_pages=10): |
4. 评论数据字段详解
B站评论API返回的JSON结构非常丰富,常用字段如下:
1 | { |
运行效果
1 | 开始爬取视频评论... |
生成的JSON文件内容预览:
1 | [ |
总结与优化方向
通过本文的B站评论区爬虫项目,我们学习了:
- B站评论API调用:掌握分页、排序等参数的使用
- 异常处理:多层次的异常捕获,让爬虫更健壮
- 数据持久化:动态文件名、JSON格式化输出
- 配置管理:使用环境变量管理Cookie等敏感信息
可优化方向:
- WBI签名生成:B站新版本API需要在请求中携带
w_rid(签名)和wts(时间戳)参数。可以使用bilibili-api-python库自动生成签名,无需手动构造 - 子评论爬取:本文只爬取了一级评论,可以继续爬取每个评论下的回复(
rpid作为root参数) - 增量爬取:记录已爬取的最大
rpid,下次只爬取新增评论 - 异步爬取:使用
asyncio + aiohttp并发爬取多页评论 - 数据清洗:去除emoji、HTML标签,统一编码格式
- 结合弹幕数据:将评论和弹幕数据合并分析,获得更全面的舆情画像
注意:请合理设置请求频率(建议每页间隔至少1秒),避免对B站服务器造成过大压力。请将代码中的Cookie替换为你自己的B站登录Cookie。