使用 Python 下载 YouTube 视频 - 您自己的 YouTube 下载器

2025-06-10

使用 Python 下载 YouTube 视频 - 您自己的 YouTube 下载器

您是否觉得总是寻找 YouTube 视频下载器很麻烦,而且隐私也面临风险?使用外部扩展程序下载 YouTube 视频可能会让人抓狂,因为使用该扩展程序时可能会出现鼠标点击广告和其他问题。

那么,我们为什么不创建一个自己的机器人,只需运行一个 Python 脚本就可以下载任何 YouTube 视频呢?这样一来,一切都在我们的掌控之中,是不是很棒?

在本文中,我们将了解如何编写 Python 脚本来自动执行 YouTube 视频下载活动。

阅读完本文后,您可以告别NO所有那些烦人的广告、隐私问题、对不同扩展的授权,并最终实现完全控制。

让我们开始吧!


我们要用什么?

我们将使用 Python 及其令人惊叹的第三方库之一pytube

要安装 pytube:

$ pip install pytube
Collecting pytube
  Downloading pytube-10.7.2-py3-none-any.whl (42 kB)
     |████████████████████████████████| 42 kB 3.4 MB/s 
Installing collected packages: pytube
Successfully installed pytube-10.7.2
$
Enter fullscreen mode Exit fullscreen mode

有关 pytube 的更多信息:

  • pytube 是一个非常严肃、轻量级、无依赖性的 Python 库(和命令行实用程序),用于下载 YouTube 视频。
  • pytube 是一个用 Python 编写的轻量级库。它没有第三方依赖,并且旨在实现高可靠性。
  • pytube 还使流水线变得简单,允许您为不同的下载事件指定回调函数,例如on progresson complete
  • 最后,pytube 还包含一个命令行实用程序,允许您直接从终端快速下载视频。

特征:

  • 支持渐进式和 DASH 流。
  • 支持下载完整的播放列表。
  • 轻松注册on_download_progresson_download_complete回调。
  • 包括命令行界面。
  • 字幕轨道支持。
  • 将字幕轨道输出为.srt格式(SubRip 字幕)。
  • 能够捕获缩略图 URL。
  • 详细记录源代码。
  • 没有第三方依赖(纯 Python 编写)。

从高层次上讲,要在脚本中使用库下载视频,我们首先需要从库中导入 YouTube 类,并将视频 URL 作为参数传递给它。然后,我们就可以下载该 YouTube 对象上存在的不同流。

现在,让我们继续使用这些信息来构建我们的第一个 YouTube 视频下载器。

获取流

首先,我们将编写一个简单的脚本来获取给定 YouTube 视频 URL 的所有可用流。打开一个文件,使用你喜欢的.py扩展名命名它,在本例中我们将其命名为pytube_demo.py,在其中添加以下代码并运行:

# ./pytube_demo.py

from pytube import YouTube

video_url = input("Enter YouTube Video URL: ")
youtube_obj = YouTube(video_url)
print(youtube_obj.streams)
Enter fullscreen mode Exit fullscreen mode

点击运行后,当终端提示您输入视频 URL 时,请输入此,这是我最喜欢的歌曲https://www.youtube.com/watch?v=fibIyvTleqc之一DaydreamerAURORA

注意:您可以在此处输入任何 YouTube 视频 URL,我们将进一步探索的内容与您输入的 URL 无关。

Enter YouTube Video URL: https://www.youtube.com/watch?v=fibIyvTleqc
[<Stream: itag="18" mime_type="video/mp4" res="360p" fps="25fps" vcodec="avc1.42001E" acodec="mp4a.40.2" progressive="True" type="video">, <Stream: itag="137" mime_type="video/mp4" res="1080p" fps="25fps" vcodec="avc1.640028" progressive="False" type="video">, <Stream: itag="248" mime_type="video/webm" res="1080p" fps="25fps" vcodec="vp9" progressive="False" type="video">, <Stream: itag="136" mime_type="video/mp4" res="720p" fps="25fps" vcodec="avc1.4d401f" progressive="False" type="video">, <Stream: itag="247" mime_type="video/webm" res="720p" fps="25fps" vcodec="vp9" progressive="False" type="video">, <Stream: itag="135" mime_type="video/mp4" res="480p" fps="25fps" vcodec="avc1.4d401e" progressive="False" type="video">, <Stream: itag="244" mime_type="video/webm" res="480p" fps="25fps" vcodec="vp9" progressive="False" type="video">, <Stream: itag="134" mime_type="video/mp4" res="360p" fps="25fps" vcodec="avc1.4d401e" progressive="False" type="video">, <Stream: itag="243" mime_type="video/webm" res="360p" fps="25fps" vcodec="vp9" progressive="False" type="video">, <Stream: itag="133" mime_type="video/mp4" res="240p" fps="25fps" vcodec="avc1.4d4015" progressive="False" type="video">, <Stream: itag="242" mime_type="video/webm" res="240p" fps="25fps" vcodec="vp9" progressive="False" type="video">, <Stream: itag="160" mime_type="video/mp4" res="144p" fps="25fps" vcodec="avc1.4d400c" progressive="False" type="video">, <Stream: itag="278" mime_type="video/webm" res="144p" fps="25fps" vcodec="vp9" progressive="False" type="video">, <Stream: itag="140" mime_type="audio/mp4" abr="128kbps" acodec="mp4a.40.2" progressive="False" type="audio">, <Stream: itag="249" mime_type="audio/webm" abr="50kbps" acodec="opus" progressive="False" type="audio">, <Stream: itag="250" mime_type="audio/webm" abr="70kbps" acodec="opus" progressive="False" type="audio">, <Stream: itag="251" mime_type="audio/webm" abr="160kbps" acodec="opus" progressive="False" type="audio">]
Enter fullscreen mode Exit fullscreen mode

因此,我们得到了一个对象列表Stream,每个流对象都向我们提供了有关视频不同方面的信息。

如果我们查看res流对象的属性,我们可以看到,有、、、和,它们360p具有不同属性1080p代表视频的分辨率,我们可以选择任何所需分辨率的流进行下载。720p480p240p144pvcodecres

另外,请注意,我们只有音频选项流可供下载。

接下来,我们将创建一个视频分辨率过滤器,为了简单起见,我们不会深入研究音频可下载流。

根据分辨率过滤流

将文件中的代码更新pytube_demo.py为以下代码:

# ./pytube_demo.py

from pytube import YouTube

def get_stream_for_res(streams, res):
    """
    Filter on the basis of a given resolution. Return a list of filtered streams.
    """
    stream = list(filter(lambda x: x.resolution == res, streams))
    return stream

video_url = input("Enter YouTube Video URL: ").strip()
youtube_obj = YouTube(video_url)

video_res = input(f"Enter YouTube Video Resolution for {youtube_obj.title}: ").strip()
req_stream_obj = get_stream_for_res(youtube_obj.streams, video_res)
print(req_stream_obj)
Enter fullscreen mode Exit fullscreen mode

点击运行,我们可以在终端中看到以下输出:

Enter YouTube Video URL: https://www.youtube.com/watch?v=fibIyvTleqc
Enter YouTube Video Resolution for AURORA - Daydreamer (Audio): 720p
[<Stream: itag="136" mime_type="video/mp4" res="720p" fps="25fps" vcodec="avc1.4d401f" progressive="False" type="video">, <Stream: itag="247" mime_type="video/webm" res="720p" fps="25fps" vcodec="vp9" progressive="False" type="video">]
Enter fullscreen mode Exit fullscreen mode

首先,我们获取视频 URL 并创建YouTube对象,然后接收用户的自定义输入,并使用 显示视频标题youtube_obj.title。在获取分辨率(例如 )后,720p我们调用函数,get_stream_for_res根据给定的分辨率筛选给定的流列表。最后,我们可以看到输出,它包含一个列表中的两个流对象,这两个对象的某些属性值不同,但分辨率相同。

无需深入研究所有其他属性的含义,我们只需简单地获取列表的第一个元素并下载视频。

根据分辨率下载流

现在将代码更新为以下内容以下载 YouTube 视频(完整脚本):

# ./pytube_demo.py

from pytube import YouTube

def get_stream_for_res(streams, res):
    stream = list(filter(lambda x: x.resolution == res, streams))
    return stream

video_url = input("Enter YouTube Video URL: ").strip()
youtube_obj = YouTube(video_url)

video_res = input(f"Enter YouTube Video Resolution for {youtube_obj.title}: ").strip()
req_stream_obj = get_stream_for_res(youtube_obj.streams, video_res)[0]

req_stream_obj.download()
print(f"YouTube Video {youtube_obj.title} Downloaded With Resolution {video_res}")
Enter fullscreen mode Exit fullscreen mode

当我们运行上述脚本时,我们得到以下输出和下载的视频:

Enter YouTube Video URL: https://www.youtube.com/watch?v=fibIyvTleqc
Enter YouTube Video Resolution for AURORA - Daydreamer (Audio): 720p
YouTube Video AURORA - Daydreamer (Audio) Downloaded With Resolution 720p
Enter fullscreen mode Exit fullscreen mode

现在,如果我们检查运行脚本的目录,我们可以找到下载的视频。

笔记:

您可能会注意到,列出的某些流同时具有视频编解码器和音频编解码器,而其他流只有视频或只有音频,这是因为 YouTube 支持一种称为 HTTP 上的动态自适应流 (DASH) 的流技术。

在 pytube 的背景下,其含义是最高质量的流;您现在需要下载音频和视频轨道,然后使用 FFmpeg 等软件对它们进行后期处理以合并它们。

包含单个文件中的音频和视频的旧式流(称为“渐进式下载”)仍然可用,但仅适用于 720p 及以下的分辨率。

从给定代码下载的视频具有一个 Stream 对象,其属性progressiveFalse。给定的视频 URL 没有可用的旧式流,720p如果您注意到,有一个流具有progressiveTrueres360p

<Stream: itag="18" mime_type="video/mp4" res="360p" fps="25fps" vcodec="avc1.42001E" acodec="mp4a.40.2" progressive="True" type="video">
Enter fullscreen mode Exit fullscreen mode

因此,继续尝试一下,不要忘记检查progressive属性。

下一步是什么?

好了,我的步骤就到这里。如果你按照这个步骤运行最终的脚本,你就会在你的工作目录中看到一个下载的视频。

您可以为该实用程序创建 UI,将其提升到新的水平。您可以将其托管为一项严格保密的服务。

那你还在等什么?使用 Tkinter、PyQT、Kivy、Flask 或 Django,制作一个功能更丰富的 UI,例如音频和视频的选择选项、视频分辨率和音频 ABR 等。告别NO那些烦人的广告、隐私问题、对不同扩展程序的多重授权,完全掌控你下载的视频。


下次再见!

合十礼🙏

鏂囩珷鏉ユ簮锛�https://dev.to/siddharth2016/download-youtube-videos-using-python-your-own-youtube-downloader-3ohf
PREV
编程项目规划指南。
NEXT
在 Shell 脚本中实现并发