当前位置: 首页 > news >正文

Bilibili 视频弹幕自动获取和自定义屏蔽词

脚本地址:

项目地址: Gazer

dmGrab.py

提要

适用于: 任意 B 站视频弹幕 XML 文件下载. 如不能, 请提交 issues 联系我. 支持指定屏蔽词.

1 秒即可完成自动解析任意 B 站视频的视频弹幕 XML 文件请求链接, 并下载.

使用方法

  1. 克隆或下载项目代码。
  2. 安装依赖: pip install requests lxml, 或者克隆项目代码后 pip install -r requirements.txt
  • 脚本顶部: 指定常量 FOLDER_PATH, 脚本默认为 E:\Gazer\BilibiliGaze\data, 作为保存 XML 文件路径. 如指定屏蔽词, 会生成两份 XML 文件, 文件结构见下.
  • 主函数处: 指定 XML 文件名 file_name
  • 主函数处: 指定 url, 要下载弹幕的视频 URL
  • 主函数处: (可选) 指定 words 弹幕屏蔽词

文件保存结构:

BilibiliGaze
└── data├── processed│   └── comment│       └── clean_dan_mu.xml└── raw└── comment└── dan_mu.xml

代码结构

  1. get_url 从 HTML 中的 window.__playinfo__ 提取解析视频的 cid 参数
  2. get_xml 接收 get_url 的返回 cid, 构造 XML 页面链接
  3. write_xml 写入保存未修改的弹幕 XML 文件
  4. block_shits 如指定了屏蔽词, 另保存一份清理后的弹幕 XML 文件

cid 的获取

使用脚本自动获取 B 站视频 cid 的思路一般是使用 bs4 来解析:

示例 (Python + requests + BeautifulSoup):

    import requestsfrom bs4 import BeautifulSoupimport redef get_cid_from_html(url):"""从 B 站视频页面 HTML 源代码中提取 cid"""try:headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}response = requests.get(url, headers=headers)response.raise_for_status()  # 检查请求是否成功soup = BeautifulSoup(response.text, 'html.parser')cid_script = soup.find('script', text=re.compile(r'"cid":'))if cid_script:match = re.search(r'"cid":(\d+)', cid_script.string)if match:return match.group(1)return Noneexcept requests.exceptions.RequestException as e:print(f"请求失败: {e}")return Noneexcept Exception as e:print(f"解析失败: {e}")return Noneif __name__ == '__main__':video_url = 'https://www.bilibili.com/video/BV1i3411w7m3'  # 替换成你的视频 URLcid = get_cid_from_html(video_url)if cid:print(f"视频的 CID 是: {cid}")else:print("未能找到视频的 CID")

但我发现 cid 其实就在 HTML 里面的 script 标签 window.__playinfo__ 里面. 根据上一篇中写到的使用正则表达式找到 window.__playinfo__ 的值,

window\.__playinfo__\s*=\s*({.*?"video":.*?"audio":.*?"session":.*?})\s*

, 然后选取['data']['dash']['video'][0]['baseUrl']得到这个

https://xy60x163x162x138xy240eyf7ye000y660yy1bxy.mcdn.bilivideo.cn:4483/upgcxcode/99/38/1109485925/1109485925-1-100022.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1740721988&gen=playurlv2&os=mcdn&oi=2104662226&trid=00004af14e75c1fa489794b0c1129a26c41eu&mid=0&platform=pc&og=cos&upsig=d9494a1a248c855fea3d23418a267e22&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform,og&mcdnid=50015422&bvc=vod&nettype=0&orderid=0,3&buvid=23327D6A-D1D8-11E7-0808-4DEDFA843F7716556infoc&build=0&f=u_0_0&agrr=0&bw=19818&logo=A0020000

url字符串, 然后我再url.split('/')[6]就能拿到它的 cid 为 1109485925.
这种方法直接从 JavaScript 对象中提取数据,避免对整个 HTML 页面进行解析,避免使用 soup.prettify(),直接在原始 HTML 字符串中搜索, 速度更快.

XML 文件解析

直接使用 bs4 解析 XML 文件会报错 bs4.FeatureNotFound: Couldn't find a tree builder with the features you requested: xml.

错误原因:

  • BeautifulSoup 默认没有安装 XML 解析器
  • 需要手动安装 XML 解析器,例如 lxmlxml.etree.ElementTree

解决方案:

  1. 安装 lxml

    • lxml 是一个高性能的 XML 和 HTML 解析库,支持 XPath 和 CSS 选择器。
    • 使用 pip 安装:pip install lxml
    • 安装完成后,重新运行代码。
  2. 指定 lxml 解析器:

    • BeautifulSoup 构造函数中,将 features 参数设置为 "xml"

      soup = BeautifulSoup(response.content.decode('utf-8'), features="xml")
      

XML 文件转 ASS 文件

友情链接 👉🏻 bilibili ASS 弹幕在线转换

下面是一些说明, 方便自定义 ASS 样式.

ASS 文件 style 说明

[Script Info] 详解:

[Script Info] 部分包含了 ASS 文件的基本信息。

  • ScriptType: v4.00+ 脚本类型,表示该 ASS 文件的脚本类型为 “v4.00+”。
  • WrapStyle: 0 换行样式,表示该 ASS 文件的换行样式为 “0”。
    • 0:智能换行,根据窗口大小自动换行。
    • 1:强制换行,在指定位置强制换行。
    • 2:不换行,不进行任何换行处理。
    • 3:与 0 类似,但是在换行时会保留空格。
  • ScaledBorderAndShadow: yes 缩放边框和阴影,表示该 ASS 文件是否缩放边框和阴影。
    • yes:缩放边框和阴影。
    • no:不缩放边框和阴影。
  • YCbCr Matrix: None YCbCr 矩阵,表示该 ASS 文件的 YCbCr 矩阵。
    • None:使用默认的 YCbCr 矩阵。
    • TV.601:使用 TV.601 YCbCr 矩阵。
    • TV.709:使用 TV.709 YCbCr 矩阵。
    • PC.601:使用 PC.601 YCbCr 矩阵。
    • PC.709:使用 PC.709 YCbCr 矩阵。

ASS 文件 style 详解:

[V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
Style: Default,SimHei,12,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,-1,0,0,0,100,100,0,0,1,2,2,2,10,10,10,134
  • Format: 定义了 style 的格式。

    • Name:style 的名称。
    • Fontname:字体名称。
    • Fontsize:字体大小。
    • PrimaryColour:主要颜色 (文本颜色)。
    • SecondaryColour:次要颜色 (卡拉 OK 效果)。
    • OutlineColour:轮廓颜色。
    • BackColour:背景颜色。
    • Bold:粗体 (1 表示是,0 表示否)。
    • Italic:斜体 (1 表示是,0 表示否)。
    • Underline:下划线 (1 表示是,0 表示否)。
    • StrikeOut:删除线 (1 表示是,0 表示否)。
    • ScaleX:X 轴缩放比例。
    • ScaleY:Y 轴缩放比例。
    • Spacing:字符间距。
    • Angle:旋转角度。
    • BorderStyle:边框样式 (1 表示轮廓,3 表示阴影)。
    • Outline:轮廓宽度。
    • Shadow:阴影深度。
    • Alignment:对齐方式。
    • MarginL:左边距。
    • MarginR:右边距。
    • MarginV:垂直边距。
    • Encoding:编码方式。
  • Style: 定义了一个具体的 style。

    • Default,SimHei,12,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,-1,0,0,0,100,100,0,0,1,2,2,2,10,10,10,134
      • NameDefault
      • FontnameSimHei (SimHei 字体)。
      • Fontsize12 (12 像素)。
      • PrimaryColour&H00FFFFFF (白色)。
      • SecondaryColour&H000000FF (蓝色)。
      • OutlineColour&H00000000 (黑色)。
      • BackColour&H00000000 (透明)。
      • Bold-1 (是)。
      • Italic0 (否)。
      • Underline0 (否)。
      • StrikeOut0 (否)。
      • ScaleX100 (100%)。
      • ScaleY100 (100%)。
      • Spacing0 (0 像素)。
      • Angle0 (0 度)。
      • BorderStyle1 (轮廓)。
      • Outline2 (2 像素)。
      • Shadow2 (2 像素)。
      • Alignment2 (居中)。
      • MarginL10 (10 像素)。
      • MarginR10 (10 像素)。
      • MarginV10 (10 像素)。
      • Encoding134 (GB2312 编码)。

可以根据自己的需要修改 Style: 行的值来定制 ASS 文件的 style。

例如:

  • 修改字体为 Microsoft YaHeiStyle: Default,Microsoft YaHei,24,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,-1,0,0,0,100,100,0,0,1,2,2,2,10,10,10,134
  • 修改字体大小为 30Style: Default,SimHei,30,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,-1,0,0,0,100,100,0,0,1,2,2,2,10,10,10,134
  • 修改字体颜色为 红色Style: Default,SimHei,24,&H000000FF,&H000000FF,&H00000000,&H00000000,-1,0,0,0,100,100,0,0,1,2,2,2,10,10,10,134

http://www.mrgr.cn/news/92984.html

相关文章:

  • 【牛客】第 k 小
  • vue3之echarts仪表盘
  • RPA 职业前景:个人职场发展的 “新机遇”
  • 动态SQL
  • 【经验分享】Ubuntu vmware虚拟机存储空间越来越小问题(已解决)
  • Unity 打包后EXE运行出现Field to Load il2cpp的一种情况
  • [KEIL]单片机技巧 01
  • 2025-03-03 学习记录--C/C++-PTA 7-38 数列求和-加强版
  • 【监督学习】支持向量机步骤及matlab实现
  • Excel的行高、列宽单位不统一?还是LaTeX靠谱
  • 从DNS到TCP:DNS解析流程和浏览器输入域名访问流程
  • Vue盲区扫雷
  • 大语言模型学习
  • 【弹性计算】弹性裸金属服务器和神龙虚拟化(一):功能特点
  • 大语言模型学习--LangChain
  • GPIO及其应用
  • 【弹性计算】弹性裸金属服务器和神龙虚拟化(二):适用场景
  • 年后 总结
  • Ubuntu20.04下各类常用软件及库安装汇总(联想Y9000P24款)
  • 【Mac】git使用再学习