主流视频网站弹幕下载
如今主流的视频网站(如 bilibili,腾讯,爱奇艺,优酷,芒果 TV 等)都支持了弹幕,本文介绍了如何下载视频弹幕(.xml)文件并转化为字幕(.ass)文件,支持本地播放。
XML 格式弹幕
B 站是最早的一批弹幕网站之一,且比较成熟,弹幕可以直接以 XML 格式下载,非常方便,所以本文下载的弹幕均以 B 站的 XML 弹幕格式的简化为标准格式。
1 |
|
每一条弹幕的属性 p 的格式为:
- 弹幕发送时间,相对于视频开始时间,以秒为单位
- 弹幕类型,1-3 为滚动弹幕、4 为底部、5 为顶端、6 为逆向、7 为精确、8 为高级
- 字体大小,25 为中,18 为小,Bilibili 只有这 2 个字号,本地 20 字号比较合适(电脑分辨率是 1920*1080)
- 弹幕颜色,RGB 颜色转为十进制后的值,16777215 为白色
- 弹幕发送时间,Unix 时间戳格式
- 弹幕池,0 为普通,1 为字幕,2 为特殊
- 发送人的 id
- 弹幕 id
一般只需要使用前 4 项即可。
Python 中利用 request 库来爬取网页结果:
1 | import urllib.request |
生成 XML 弹幕文件时需要检查是否有非法 XML 字符,并可以设置弹幕黑名单:
1 | filename = 'XML/' + title + '.xml' |
网上很多相关工具(如弹幕 ASS 转换工具等)可以将 XML 弹幕文件转换成 ASS 字幕文件。
基于弹幕 ASS 转换工具个性化设置:
1 | // 设置项,适合视频2倍速播放 |
腾讯视频弹幕下载
打开一个腾讯视频 PC 网页端,其源码中的 VIDEO_INFO 字段:
1 | var VIDEO_INFO = { |
其中所需的字段是duration、title、vid。
接下来通过vid找到targetid:
http://bullet.video.qq.com/fcgi-bin/target/regist?otype=json&vid=(%vid%)
,打开此链接得到:1 | QZOutputJson = { |
然后就可以通过targetid得到弹幕:
http://mfm.video.qq.com/danmu?timestamp=(%timestamp%)&target_id=(%targetid%)
,其中timestamp从0开始并且以30为增量,打开此链接得到(只截取了第一条弹幕):1 | { |
其中timepoint、content_style中的color、content字段可以组成xml弹幕格式。
全部python代码为:
1 | import requests |
爱奇艺视频弹幕下载
打开一个爱奇艺视频 PC 网页端,其源码中的 page-info 字段:
1 | { |
其中所需的字段是duration、tvName、albumId、tvId、cid。
duration由‘时:分:秒’格式转为秒:
1 | duration_str = page_info['duration'].split(':') |
然后就可以通过albumId、tvId、cid得到弹幕:
http://cmts.iqiyi.com/bullet/(%tvId[-4:-2]%)/(%tvId[-2:]%)/(%tvId%)_300_(%page%).z?rn=0.(%16位随机数%)&business=danmu&is_iqiyi=true&is_video_page=true&tvid=(%tvid%)&albumid=(%albumid%)&categoryid=(%cid%)&qypid=01010021010000000000
,其中tvId需要分割出倒数4-3位和倒数2-1位,page从1开始并且以1为增量,打开此链接得到(%tvId%)_300_(%page%).z的文件,这个文件是压缩的字节流需要解压。Python中利用zlib库,
dec = zlib.decompressobj(32 + zlib.MAX_WBITS)
和 b = dec.decompress('z文件').decode("utf-8")
得到XML格式的弹幕(只截取了第一条弹幕):1 |
|
其中showTime、color、content字段可以组成xml弹幕格式(color需要从16进制转换成10进制)。
全部python代码为:
1 | import requests |
优酷视频弹幕下载
打开一个优酷视频 PC 网页端,其源码中的 window.PageConfig 字段:
1 | window.PageConfig = { |
其中所需的字段是seconds、tt、videoId。
然后就可以通过videoId得到弹幕:
https://service.danmu.youku.com/list?mat=(%mat%)&ct=1001&iid=(%videoId%)
,其中mat从0开始并且以1为增量,打开此链接得到(只截取了第一条弹幕):1 | { |
其中playat、propertis中的color、content字段可以组成xml弹幕格式。
全部python代码为:
1 | import urllib.request |
芒果视频弹幕下载
打开一个芒果视频 PC 网页端,其网址(以 https://www.mgtv.com/b/9015/4828668.html
为例)中以 /
分割,倒数第二位是 cid,倒数第一位是 vid。
从源码中 <title>霸王别姬 - 视频在线观看 - 霸王别姬 - 芒果TV</title>
可获得 title。
然后就可以通过 cid 和 vid 得到弹幕:https://galaxy.bz.mgtv.com/rdbarrage?vid=(%vid%)&cid=(%cid%)&time=(%time%)
,其中 time 从 0 开始并且下一个 time 的值可从弹幕中得到,打开此链接得到(只截取了第一条弹幕):
1 | { |
其中time、content字段可以组成xml弹幕格式。
全部python代码为:
1 | import urllib.request |
视频下载
You-Get 是一个命令行程序,提供便利的方式来下载网络上的媒体信息。
you-get 的功用:
1. 下载流行网站的音频、视频 (查看完整支持列表)
2. 在媒体播放器中观看在线视频,脱离浏览器与广告
3. 下载喜欢的网页上的图片
4. 下载任何非 HTML 内容,例如二进制文件
you-get 主要在 linux 等开源平台上运行,由于家用电脑大多为 windows 系统,安装方法如下:
下载相关安装包
以下是必要依赖,需要单独安装,除非于 Windows 下使用预包装包:
Python 3
FFmpeg 或者 [Libav] https://libav.org/
通过 pip 安装
you-get 的官方版本通过 PyPI 分发,可从 PyPI 镜像中通过 pip 包管理器安装。务必使用版本 3 的 pip:
$ pip3 install you-get
Git clone
$ git clone git://github.com/soimort/you-get.git
将源码解压到任意目录即可
升级
考虑到 you-get 安装方法的差异,请使用:
$ pip3 install --upgrade you-get
或下载最新更新:
$ you-get https://github.com/soimort/you-get/archive/master.zip
使用 you-get
进入解压文件夹 you-get-develop 下,在该目录下打开 Windows Powershell。
输入 python you-get 视频网址
即可使用下载功能(视频保存在 you-get-develop 目录下)。
腾讯视频下载
打开腾讯视频播放页,打开控制台(F12),Network 选项下搜索 "ts.m3u8" 字段,找到类似下面的网址:
https://apd-(32位字符串).v.smtcdns.com/moviets.tc.qq.com/(44位字符串)/uwMROfz0r5xgoaQXGdGnC2df64hwtZlCglRDKOjEZ_qQW-eC/(160位字符串)/(vid).(数字).ts.m3u8?ver=4
此 m3u8 文件存有 ts 索引相对地址:
1 | #EXTM3U |
可以利用如下代码下载并且合并ts文件:
1 | import urllib.request |
批量进行弹幕 ASS 转换
安装 selenium
pip install selenium
如果用 chrome
查看 chrome 的版本号 (Chromium 72.0.3626.121)
https://chromedriver.storage.googleapis.com/LATEST_RELEASE_72.0.3626
https://chromedriver.storage.googleapis.com/index.html?path=72.0.3626.69/
下载相应 win32 版本
解压放入 python 根目录
修改 common.js
startDownload('\ufeff' + ass, name.replace(/\.[^.]*$/, '') + '.ass');
改为 return ass;