使用 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
$
有关 pytube 的更多信息:
- pytube 是一个非常严肃、轻量级、无依赖性的 Python 库(和命令行实用程序),用于下载 YouTube 视频。
- pytube 是一个用 Python 编写的轻量级库。它没有第三方依赖,并且旨在实现高可靠性。
- pytube 还使流水线变得简单,允许您为不同的下载事件指定回调函数,例如
on progress
或on complete
。 - 最后,pytube 还包含一个命令行实用程序,允许您直接从终端快速下载视频。
特征:
- 支持渐进式和 DASH 流。
- 支持下载完整的播放列表。
- 轻松注册
on_download_progress
和on_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)
点击运行后,当终端提示您输入视频 URL 时,请输入此,这是我最喜欢的歌曲https://www.youtube.com/watch?v=fibIyvTleqc
之一。Daydreamer
AURORA
注意:您可以在此处输入任何 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">]
因此,我们得到了一个对象列表Stream
,每个流对象都向我们提供了有关视频不同方面的信息。
如果我们查看res
流对象的属性,我们可以看到,有、、、和,它们360p
具有不同的属性。1080p
这代表视频的分辨率,我们可以选择任何所需分辨率的流进行下载。720p
480p
240p
144p
vcodec
res
另外,请注意,我们只有音频选项流可供下载。
接下来,我们将创建一个视频分辨率过滤器,为了简单起见,我们不会深入研究音频可下载流。
根据分辨率过滤流
将文件中的代码更新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 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">]
首先,我们获取视频 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 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
现在,如果我们检查运行脚本的目录,我们可以找到下载的视频。
笔记:
您可能会注意到,列出的某些流同时具有视频编解码器和音频编解码器,而其他流只有视频或只有音频,这是因为 YouTube 支持一种称为 HTTP 上的动态自适应流 (DASH) 的流技术。
在 pytube 的背景下,其含义是最高质量的流;您现在需要下载音频和视频轨道,然后使用 FFmpeg 等软件对它们进行后期处理以合并它们。
包含单个文件中的音频和视频的旧式流(称为“渐进式下载”)仍然可用,但仅适用于 720p 及以下的分辨率。
从给定代码下载的视频具有一个 Stream 对象,其属性progressive
为False
。给定的视频 URL 没有可用的旧式流,但720p
如果您注意到,有一个流具有progressive
和。True
res
360p
<Stream: itag="18" mime_type="video/mp4" res="360p" fps="25fps" vcodec="avc1.42001E" acodec="mp4a.40.2" progressive="True" type="video">
因此,继续尝试一下,不要忘记检查progressive
属性。
下一步是什么?
好了,我的步骤就到这里。如果你按照这个步骤运行最终的脚本,你就会在你的工作目录中看到一个下载的视频。
您可以为该实用程序创建 UI,将其提升到新的水平。您可以将其托管为一项严格保密的服务。
那你还在等什么?使用 Tkinter、PyQT、Kivy、Flask 或 Django,制作一个功能更丰富的 UI,例如音频和视频的选择选项、视频分辨率和音频 ABR 等。告别NO
那些烦人的广告、隐私问题、对不同扩展程序的多重授权,完全掌控你下载的视频。
-
刚刚开启你的开源之旅?别忘了看看Hello Open Source
-
想展示你的 Python 项目,还是只是想探索一下?看看Awesome Python Repos
-
想从零开始制作一款简单又精彩的游戏吗?看看PongPong
-
想要查看
++
你的 GitHub 个人资料自述文件吗?查看Quote - 自述文件
下次再见!
合十礼🙏
鏂囩珷鏉ユ簮锛�https://dev.to/siddharth2016/download-youtube-videos-using-python-your-own-youtube-downloader-3ohf