出于某些不可告人的特殊原因偿乖,我需要得到某個B站視頻的 「 字幕 」,自己手動記錄字幕實在過于繁瑣芜壁,每幾秒都會有字幕不斷地更新齐帚,一個1小時的視頻字幕的收集便是一個浩大的工程~
因此我再次召喚我的好幫手 網(wǎng)絡爬蟲 ,來幫我采集字幕并且以 srt 文件的格式保存吐绵。這個 srt 的全稱是SubRip Text迹淌,這是一種非常流行的文本字幕,包含一行時間己单,一行字幕唉窃,制作規(guī)范非常簡單。
如上圖所示纹笼,這個字幕是CC字幕纹份,CC是Closed Caption的簡稱,所謂CC字幕,就是隱藏式字幕蔓涧。
CC 是把文字加入NTSC電視信號的一種標準化編碼方法件已。
電視機的內(nèi)置解碼器或獨立解碼器能顯示文字。
Caption 和我們常見的一般字幕(subtitle)的用法是有區(qū)別的元暴,它是在無音狀態(tài)下通過進行一些解釋性的語言來描述當前畫面中所發(fā)生的事情的字幕篷扩,例如畫面中出現(xiàn)了背景的聲音的時候,Caption都會通過字幕進行提示茉盏。
這個CC字幕我們可以再視頻中拖放至任意位置鉴未,十分便捷,經(jīng)過觀察發(fā)現(xiàn)鸠姨,該字幕顯式地放在一個json之中铜秆,而這個json又可以通過Network找到。
上圖中的 subtitle_url 便給出了字幕json的鏈接讶迁,而訪問該鏈接可以得到該視頻的所有字幕信息连茧。其中對我生成srt文件最為重要的數(shù)據(jù)便是 from、to以及content巍糯,這些單詞對應的數(shù)據(jù)分別代表某一條字幕的出現(xiàn)時間梅屉,消失時間以及字幕的內(nèi)容。
由此我們找到了所需的詳細字幕信息所在的位置鳞贷,思路也非常清晰坯汤,先模擬訪問該視頻頁面獲取字幕的json鏈接,再將json鏈接中包含的信息按照srt文件的格式下載到本地搀愧。
def get_subtitles(self):
"""
根據(jù)字幕的json 獲取CC字幕
"""
json_url=self.get_json_url()
if len(json_url)>0:
with open('{}.srt'.format(self.title),'w',encoding='utf-8') as f:
r=requests.get(json_url)
info=json.loads(r.text)['body']
for i in range(len(info)):
subtitle_from=info[i]['from']
subtitle_to=info[i]['to']
content=info[i]['content']
data=self.format_subtitle(subtitle_from,subtitle_to,content,i)
f.write(data)
上面的函數(shù)是獲取CC字幕的主要代碼惰聂,下面這段代碼主要是將CC字幕格式化輸出,以標準的srt文件的形式輸出咱筛。
def format_subtitle(self,subtitle_from,subtitle_to,content,i):
"""
格式化成srt文件搓幌,形如:
1
00:00:01,035 --> 00:00:04,525
遠離了平行線 看吧天氣預報也不怎么準
"""
subtitle_from=round(subtitle_from,3) #四舍五入為三位小數(shù)
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字幕
return data
這樣我們就可以得到某個視頻的CC字幕,如果想要爬取的視頻的字幕不是CC字幕的話迅箩,是無法通過上述代碼爬取的溉愁。因為其 list 列表為空,即不存在相關的json饲趋。