Bootstrap

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 requests
    from bs4 import BeautifulSoup
    import re

    def 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 None
        except requests.exceptions.RequestException as e:
            print(f"请求失败: {e}")
            return None
        except Exception as e:
            print(f"解析失败: {e}")
            return None

    if __name__ == '__main__':
        video_url = 'https://www.bilibili.com/video/BV1i3411w7m3'  # 替换成你的视频 URL
        cid = 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
;