对于自媒体作者来说,很多时候,想要参考一段油管(YouTube)视频中的字幕。通常你需要将这段视频看完,并且将你需要的内容逐行逐字的手工码出来。很无奈,这将耗费你不少的时间和精力。
如果您正面临这样的难题,不妨来看看本教程。本文我们将教你如何使用 Python 在一秒钟内获取任何 Youtube 视频中的字幕文本。如果有必要的话,您还可以选择将字幕文本转换成PDF格式。长话短说,下面就让我们开始吧!
安装 Python 库
在本教程中,我们将使用两个 Python 库:fpdf
和 request
。请使用下面的命令来安装:
# 安装
pip3 install fpdf
pip3 install requests
# 导入
import request
from fpdf import FPDF
获取 API
为提升便捷性,在这里我们可以使用 Rapid API 服务中的 YouTube Media Downloader
API 来进行处理。这可是免费的哦。
入口如下:
此 API 允许我们访问任何 YouTube 视频中有价值的信息,如视频标题、描述、作者、频道ID、视频时长、观看次数、下载链接、字幕URL等。
这些信息非常有用,但在本文中,我们只需要使用字幕URL。如果您第一次使用 Rapid API,请首先进行账户注册。完成以后,你就会收到一个私钥。请把私钥放在安全的地方保存,因为我们会需要它。
获取视频 ID
在我们获取字幕文本之前,我们必须首先从目标油管 URL 链接中提取出 YouTube 视频ID。它们具有相同的样式。
例如:
https://www.youtube.com/watch?v=ZZUYxZ6hTWk
我们可以将其转化为同等链接样式:
https://youtu.be/ZZUYxZ6hTWk
无论是以上哪种视频链接地址样式,它们的视频 ID 均为 ZZUYxZ6hTWk
。通过这个规律,我们可以写个 get_video_id()
函数来自动获取视频 ID:
def get_video_id(videoURL):
# split YouTube URL by '/' so we can get its ID
videoID = str(videoURL).split('/')
# get the last part of the list which is the ID
videoID = videoID[-1]
return videoID
当然,如果你愿意的话。可以针对以上第一种视频地址形式也写一个视频 ID 提取函数,或者扩展进本函数。
以上函数的运行结果:
# 输入
id = get_video_id('https://youtu.be/ZZUYxZ6hTWk')
# 输出
ZZUYxZ6hTWk
获取视频详情
一旦我们有了视频ID,我们就可以向API发送一个GET请求,接收包括字幕URL在内的视频详情。我们可以通过以下函数中获取油管视频字幕URL。
import requests
def get_video_detail(videoID):
# access the API
url = "https://youtube-media-downloader.p.rapidapi.com/v1/details"
headers = {
'x-rapidapi-host': "youtube-media-downloader.p.rapidapi.com",
'x-rapidapi-key': "YOUR API KEY"
}
# send a get request to the API
querystring = {"videoId": videoID}
response = requests.request("GET", url, headers=headers, params=querystring)
# conver the response to json format
json_response = response.json()
# obtain the subtitle url (in XML format)
subtitleURL = json_response['subtitles']['items'][0]['url']
return subtitleURL
注意:请使用上文提到的你的私钥替换以上代码中 YOUR API KEY
部分。
以上代码运行结果:
# 输入
detail = get_video_detail(id)
# 输出
https://www.youtube.com/api/timedtext?v=ZZUYxZ6hTWk&asr_langs=de,en,es,fr,id,it,ja,ko,nl,pt,ru,tr,vi&caps=asr&exp=xftt,xctw&xoaf=5&hl=en&ip=0.0.0.0&ipbits=0&expire=1644087118&sparams=ip,ipbits,expire,v,asr_langs,caps,exp,xoaf&signature=DD7124252B7831D1AAE5EE2917D3BE5040C1D458.6002851111F438B37EED23864C162A3DD67BC507&key=yt8&lang=en
提取视频字幕文本
以上输出视频字幕文本URL是一个 XML 文本。截图如下:
如果需要的话,您可以通过以下 get_subtitle_text
函数来获取 TXT 格式字幕文本:
def get_subtitle_text(subtitleUrl):
# access the API
url = "https://youtube-media-downloader.p.rapidapi.com/v1/subtitles"
headers = {
'x-rapidapi-host': "youtube-media-downloader.p.rapidapi.com",
'x-rapidapi-key': "YOUR API KEY"
}
# send a get subtitle text request to the API
querystring = {"subtitleUrl": subtitleUrl}
response = requests.request("GET", url, headers=headers, params=querystring)
# return the text response
return response.text
运行结果:
# 输入
subtitle = get_subtitle_text(detail)
# 输出
1
00:00:01.439 --> 00:00:06.160
Ev Williams is best known as one of the
twitter co-founders alongside Biz Stone
2
00:00:06.160 --> 00:00:09.679
but he's also the person behind the
popular online publishing platform
3
...
将 TXT 字幕转换为 PDF 格式
为便于阅读及保存,我们可以考虑将 TXT 字幕转换为 PDF 格式。请使用以下函数来完成转换:
from fpdf import FPDF
def Convert_And_Download_Subtitle(text):
# create a pdf object
pdf = FPDF()
# add a page to the pdf
pdf.add_page()
# set font and size of the font
pdf.set_font("Arial", size=12)
# for evey line in the text
for line in text.split('\n'):
# add the line to the pdf
pdf.cell(200, 10, txt=x, ln=1, align='C')
# save and download the pdf with a custom file name
pdf.output("subtitle.pdf")
以上代码输入为 TXT 格式字幕文本,输出名为 subtitle
的 PDF 文件。您可以根据需要自行扩充以上代码功能。