当前位置: 首页 > 后端技术 > Python

B站视频CC字幕抓取

时间:2023-03-26 14:42:39 Python

因为不可告人的原因,需要获取某B站视频的“字幕”。自己手动录字幕太麻烦了,每隔几秒就有字幕收集一个1小时的视频字幕是个浩大的工程~于是又召唤我的好帮手网络爬虫帮我收集字幕保存在srt文件格式。这个srt的全称是SubRipText,是一款非常流行的文字字幕,包括一行时间,一行字幕,制作规范很简单。如上图,这个字幕是CC字幕,CC是ClosedCaption的缩写,所谓CC字幕就是隐藏字幕。CC是一种用于向NTSC电视信号添加文本的标准化编码方法。文本可以通过电视的内置解码器或单独的解码器显示。Caption不同于我们常见的字幕(subtitle)。字幕是在无声状态下通过某种解释性语言描述当前画面中发生的事情,例如画面中的背景。当有声音时,Caption会通过字幕进行提示。我们可以将这个CC字幕拖放到视频的任意位置,非常方便。经过观察,我们发现字幕是明确放在一个json中的,这个json可以通过网络找到。上图中的subtitle_url给出了字幕json链接,访问该链接可以获取视频的所有字幕信息。其中,我生成srt文件最重要的数据是from、to、content。这些词对应的数据分别表示字幕的出现时间、消失时间和内容。由此我们找到了需要详细字幕信息的位置,思路也很清晰了。首先模拟访问视频页面获取字幕的json链接,然后根据srt文件的格式将json链接中包含的信息下载到本地。defget_subtitles(self):"""根据字幕的json获取CC字幕"""json_url=self.get_json_url()iflen(json_url)>0:withopen('{}.srt'.format(self.title),'w',encoding='utf-8')asf:r=requests.get(json_url)info=json.loads(r.text)['body']foriinrange(len(info)):subtitle_from=info[i]['f??rom']subtitle_to=info[i]['to']content=info[i]['content']data=self.format_subtitle(subtitle_from,subtitle_to,content,i)f.write(data)以上函数是获取CC字幕的主要代码。以下代码主要将CC字幕以标准srt文件的形式进行格式化输出。defformat_subtitle(self,subtitle_from,subtitle_to,content,i):"""格式化成srt文件,like:100:00:01,035-->00:00:04,525远离平行线看,天气预报不是很好准"""subtitle_from=round(subtitle_from,3)#四舍五入到小数点后三位subtitle_to=round(subtitle_to,3)begin=time.strftime("%H:%M:%S",time.gmtime(subtitle_from))+','+self.rectify(subtitle_from)end=time.strftime("%H:%M:%S",time.gmtime(subtitle_to))+','+self.rectify(subtitle_to)data=str(i+1)+'\n'+begin+'-->'+end+'\n'+content+'\n\n'#格式化成srt字幕返回数据这样我们就可以得到某某的CC字幕video,如果你要爬取的视频的字幕不是CC字幕的话,是无法通过上面的代码爬取到的。因为它的list列表是空的,也就是没有相关的json。