如何使用 Python 脚本下载 YouTube 视频

2024年8月29日 | 阅读 7 分钟

在本教程中,我们将了解如何使用 Python 脚本下载 YouTube 视频。众所周知,Python 具有许多功能,其中广泛的模块和库就是其中之一。我们将使用一个流行的 **pytube** 库并编写 Python 脚本。

YouTube 是一个非常受欢迎的在线视频流媒体平台。有来自教育、娱乐、旅游等各种类别的数百万个视频。我们可以轻松地通过简单的点击观看我们想要的视频,但下载视频很困难。然而,在最近的更新中,YouTube 允许我们将视频保存在其下载文件夹中,以便离线播放。但我们无法将其保存到本地。

有许多第三方网站可以获取视频并将其保存在本地计算机或手机上。我们可以使用 Python 简化此过程。只需几行代码,即可轻松下载所需的视频。让我们看看 pytube 库在 Python 中的实现。

The pytube Library

pytube 是一个第三方、轻量级、Pythonic 的无依赖模块,用于下载 YouTube 视频。因此,它不是一个原生库,我们需要先安装它才能使用。

在终端或命令提示符中键入以下命令。

命令

按 Enter 键后,上述命令会将软件包下载到本地系统。

注意 - 建议您在虚拟环境中安装此库。

使用 Pytube 库下载单个视频

Pytube 极大地简化了下载 YouTube 视频的过程。首先,我们从 pytube 模块导入 YouTube 类。

现在,我们通过将链接作为参数传递来创建 YouTube 类的对象。

此 **youtube_obj** 从 YouTube 视频 URL 创建各种流。使用以下代码,我们可以获取所有流信息。

然后获取视频的正确格式和分辨率。完成此操作后,我们将使用 **download()** 方法,该方法接受一个参数,即文件下载位置。

我们可以根据需要提供文件;在其他情况下,将保留原始文件名。

现在实现完整的代码。让我们来理解下面的代码。

示例 -

输出

Task is Completed    

上述代码将花费一些时间来下载文件,因为有很多数据正在从网络下载。连接速度也取决于下载速度。我们还可以下载多个视频。

获取视频标题

我们可以使用以下代码获取要下载的视频的标题。

输出

Shamshera | Date Announcement Teaser | Ranbir Kapoor, Sanjay Dutt, Vaani Kapoor | In Cinemas 22 July 

以下是我们如何获取缩略图 URL。

输出

https://i.ytimg.com/vi/oQdxL_WW3aE/sddefault.jpg    

创建 YouTube 对象的更高级方法

YouTube 对象对于在 pytube 编程中继续进行至关重要。前面我们已经讨论了如何创建一个简单的对象,现在我们将继续创建一个具有更多属性的 YouTube 对象。让我们看下面的示例。

示例 -

属性 -

  • on_process_callback - 此函数用于下载视频中的数据块,它接受三个参数:数据块和视频中剩余的字节。
  • on_complete_callback - 视频完全下载后将执行此函数。它可用于下载后操作,例如修剪视频长度。它接受两个参数 - 流和文件路径。
  • use_oauth 和 allow_oauth_cache - 这允许我们授权 pytube 与 YouTube 用户帐户进行交互。它还可以用于绕过年龄限制。

字幕/字幕轨道

Pytube 提供了获取可用字幕的功能。让我们看下面的代码片段。

示例 -

输出

{'ar': <Caption lang="Arabic" code="ar">, 'zh-HK': <Caption lang="Chinese (Hong Kong)" code="zh-HK">, 'zh-TW': <Caption lang="Chinese (Taiwan)" code="zh-TW">, 'hr': <Caption lang="Croatian" code="hr">, 'cs': <Caption lang="Czech" code="cs">, 'da': <Caption lang="Danish" code="da">, 'nl': <Caption lang="Dutch" code="nl">, 'en': <Caption lang="English" code="en">, 'en-GB': <Caption lang="English (United Kingdom)" code="en-GB">, 'et': <Caption lang="Estonian" code="et">, 'fil': <Caption lang="Filipino" code="fil">, 'fi': <Caption lang="Finnish" code="fi">, 'fr-CA': <Caption lang="French (Canada)" code="fr-CA">, 'fr-FR': <Caption lang="French (France)" code="fr-FR">, 'de': <Caption lang="German" code="de">, 'el': <Caption lang="Greek" code="el">, 'iw': <Caption lang="Hebrew" code="iw">, 'hu': <Caption lang="Hungarian" code="hu">, 'id': <Caption lang="Indonesian" code="id">, 'it': <Caption lang="Italian" code="it">, 'ja': <Caption lang="Japanese" code="ja">, 'ko': <Caption lang="Korean" code="ko">, 'lv': <Caption lang="Latvian" code="lv">, 'lt': <Caption lang="Lithuanian" code="lt">, 'ms': <Caption lang="Malay" code="ms">, 'no': <Caption lang="Norwegian" 
code="no">, 'pl': <Caption lang="Polish" code="pl">, 'pt-BR': <Caption lang="Portuguese (Brazil)" code="pt-BR">, 'pt-PT': <Caption lang="Portuguese (Portugal)" code="pt-PT">, 'ro': <Caption lang="Romanian" code="ro">, 'ru': <Caption lang="Russian" code="ru">, 'sk': <Caption lang="Slovak" code="sk">, 'es-419': <Caption lang="Spanish (Latin America)" code="es-419">, 'es-ES': <Caption lang="Spanish (Spain)" code="es-ES">, 'sv': <Caption 
lang="Swedish" code="sv">, 'th': <Caption lang="Thai" code="th">, 'tr': <Caption lang="Turkish" code="tr">, 'uk': <Caption lang="Ukrainian" code="uk">, 'ur': <Caption lang="Urdu" code="ur">, 'vi': <Caption lang="Vietnamese" code="vi">}

现在,我们将获取英语字幕。

输出

<stdin>:1: DeprecationWarning: Call to deprecated function get_by_language_code (This object can be treated as a dictionary, i.e. captions['en']).

让我们看看字幕的格式。

输出

<?xml version="1.0" encoding="utf-8" ?><timedtext format="3">\n<body>\n<p t="10200" d="940">K-pop!</p>\n<p t="13400" d="2800">That is so awkward 
to watch.</p>\n<p t="16200" d="2080">YouTube Rewind 2018.</p>\n<p t="18480" d="3520">The most disliked video\nin the history of YouTube.</p>\n<p t="22780" d="2220">In 2018, we made something\nyou didn?t like.</p>\n<p t="25100" d="2470">So in 2019, let?s see what\nyou DID like.</p>\n<p t="27580" d="1400">Because you?re better at this\nthan we are.</p>\n<p t="45110" d="1310">This is my outfit!</p>\n<p t="46920" d="1240">What is it gonna be?</p>\n<p t="58180" d="1370">You made these the</p>\n<p t="59710" d="1680">MOST LIKED CREATOR VIDEOS\n*of 2019, duh?</p>\n<p t="62480" d="1700">Shane Dawson | Conspiracy Theories with Shane Dawson\n1.9M</p>\n<p t="65000" d="2690">A4 | ??????? ??? ??? ?? ?????? ?????? ?? ???????? !\n2M</p>\n<p t="67690" d="2750">Andymation | My BIGGEST Flipbook EVER\n2.3M</p>\n<p t="70930" d="1730">James Charles | No More Lies\n2.4M</p>\n<p t="73070" d="2030">SethEverman | how to create billie eilish?s ?bad guy?\n2.8M</p>\n<p t="76010" d="2300">Nilson Izaias Papinho Oficial | Minha slime deu 
certo\n2.8M</p>\n<p t="79290" d="2540">Black Gryph0n | ONE GUY, 54 VOICES\n3.4M</p>\n<p t="82650" d="2380">whinderssonnunes | O DIA EM QUE ASSISTI BIRD BOX\n3.4M</p>\n<p t="86290" d="2630">PewDiePie | Marzia & Felix - Wedding\n4.7M</p>\n<p t="89890" d="3530">MrBeast | Make This Video the Most Liked Video On YouTube\n10.9M</p>\n<p t="99150" d="2410">The MOST LIKED\nMUSIC VIDEOS</p>??.

我们已采用示例输出;因此,它由许多格式化的行组成。

下载多个视频

这与我们下载单个视频的过程相同。我们可以创建一个包含多个 URL 的列表,并使用 for 循环进行迭代。让我们来理解下面的示例。

示例 -

循环将一次选择一个链接,并将其传递给 YouTube 类以创建对象。我们在 **get()** 函数中传递了分辨率,并将值保存在所需的目录中。然后,我们过滤掉了所有扩展名为 mp4 的文件。

Python 搜索功能

Pytube 允许我们执行与在 YouTube 的搜索栏中执行的相同的搜索功能。它可以提供可以检查和下载的 YouTube 对象,而无需进行额外的处理。让我们来理解下面的示例。

示例 -

输出

[<pytube.__main__.YouTube object: videoId=AFEZzf9_EHk>, <pytube.__main__.YouTube object: videoId=_PNIlJry8vA>, <pytube.__main__.YouTube object: videoId=MFI-r7_xH-Y>, <pytube.__main__.YouTube object: videoId=mEOBGY4-7JA>, <pytube.__main__.YouTube object: videoId=n7xSITvP4D4>, <pytube.__main__.YouTube object: videoId=A5OU6YP3Jm4>, <pytube.__main__.YouTube object: videoId=Kwu1yIC-ssg>, <pytube.__main__.YouTube object: videoId=lA2Ojyb0gqg>, <pytube.__main__.YouTube object: videoId=gkWHGy70jIg>, <pytube.__main__.YouTube object: videoId=amMJfaB5dXo>, <pytube.__main__.YouTube object: 
videoId=rl3L2SGgmNo>, <pytube.__main__.YouTube object: videoId=AVbfs0-509k>, <pytube.__main__.YouTube object: videoId=Wi2oqXS6SlY>, <pytube.__main__.YouTube object: videoId=HNXhdo5j914>, <pytube.__main__.YouTube object: videoId=gmVj3yOdOFo>, <pytube.__main__.YouTube object: videoId=WUODHf0IT5U>, <pytube.__main__.YouTube object: videoId=mUniRe7tysE>, <pytube.__main__.YouTube object: videoId=ynG6tkLO3SQ>]

搜索还具有相关的自动完成建议。这些可以在下面访问。

输出

['2000 world cup final', '1999 world cup final', '2003 world cup final', '1996 world cup india vs pakistan', 'india vs pakistan champions trophy 2017 highlights', 'india vs australia 2011 world cup highlights', 'icc world cup 2021', 'icc world cup 2019 song', 't20 world cup 2016 final']   

需要记住的点

  • 要下载视频,您必须有稳定的互联网连接。否则,它将引发错误。
  • 我们可以使用另一个名称数组来更改文件名。
  • 不稳定的互联网连接将中断下载并引发错误。

结论

在本教程中,我们涵盖了 pytube 库及其用例。这是无需访问任何网站即可下载 YouTube 视频的最佳方法。视频下载网站可能需要很长时间,并且会显示许多不相关的广告。在 Python 中,只需几行代码,我们就可以不间断地下载单个或多个视频。但是,如果您拥有稳定的互联网连接会更好。该库还包含许多高级功能,但我们已经提到了所有重要功能。如果您想阅读更多关于 pytube 库 的信息,您可以访问其官方精心编写的文档。