使用 Python 提取及下载 YouTube 视频字幕

对于自媒体作者来说,很多时候,想要参考一段油管(YouTube)视频中的字幕。通常你需要将这段视频看完,并且将你需要的内容逐行逐字的手工码出来。很无奈,这将耗费你不少的时间和精力。

如果您正面临这样的难题,不妨来看看本教程。本文我们将教你如何使用 Python 在一秒钟内获取任何 Youtube 视频中的字幕文本。如果有必要的话,您还可以选择将字幕文本转换成PDF格式。长话短说,下面就让我们开始吧!

安装 Python 库

在本教程中,我们将使用两个 Python 库:fpdfrequest。请使用下面的命令来安装:

# 安装
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 文件。您可以根据需要自行扩充以上代码功能。