您是否曾觉得需要下载某人在 YouTube 上发布的全部视频?无论是因为您担心频道会被删除,还是因为您想保存其内容以供离线观看,或者因为您想确保在从头开始之前保存所有频道的视频,人们想要存档整个频道的内容有多种原因。
这个项目更多的是关于技术而不是营销,但我知道你们中的许多人都对 Python 和自动化感兴趣,所以我认为这可能会引起你们的兴趣。
在本文中,我将向您展示如何使用 Python 和两个不同的库以最佳质量在本地下载 Youtube 视频、如何下载整个播放列表和频道、如何轻松下载视频等等。
如果您只是对获取整个频道的脚本感兴趣,请随意使用目录向下滚动到本文的相应部分。但是,我强烈建议您遵循本文的前几部分,因为它们准确地解释了我们如何到达最后一点,并将帮助您了解整个过程,以防您想要调整脚本行为的某些部分。
不用多说,让我们开始吧!
要求
我们需要做的第一件事是安装我们将在整个项目中使用的两个库。
第一个叫做 pytube,可通过 pip 使用。这是一个简单的界面,允许我们从 Youtube 视频源中检索信息并下载这些视频。它支持缩略图下载,支持将字幕轨道下载为 .srt 文件以及许多其他功能。出于本练习的目的,我们将仅关注如何下载视频。
我们将需要的第二个库称为 FFmpeg,也可以通过 pip 使用。如果您熟悉 eponym 命令行工具,它是实际工具和 Python 语言之间的简单接口。
安装这两个 Python 库后,您还需要下载实际的 FFmpeg 工具。只需前往其下载页面并选择适合您操作系统的软件即可。
现在我们可以真正开始了。
使用 Python 下载 Youtube 视频的最快方法
你可以用 Python 非常轻松快速地下载单个视频。这种方法的唯一缺点是它可能不是最好的质量,但如果你正在寻找一种简单的方法来导出播放列表,那么你应该使用以下代码:
from pytube import YouTube | |
YouTube(‘https://www.youtube.com/watch?v=3eMTWX07eY4’).streams.first().download() |
运行时,这两行代码会将括号内链接指定的视频下载到脚本所在的文件夹中。

这种方法有一个缺点。通过这种方法我们能实现的最大分辨率大部分是 360p,有时是 720p,但不会更高。
如果这对你来说足够了,那就继续吧。如果你和我一样,你会想要以最高分辨率下载视频。
使用 Python 下载 Youtube 视频 – 可获得最高分辨率
上述方法之所以会在某个分辨率下受到限制,是因为 Youtube 在其平台上有两种分发视频的方式:
- 渐进式流媒体
- 通过 HTTP 进行动态自适应流传输 (DASH)
第二个是我们想要下载的,但为了实现这一点,Youtube 为每个视频分发了两个不同的供稿:音频供稿和视频供稿。
这里的挑战是分别下载视频和音频,每个都有自己的质量选项,然后将两个源合并为一个 .mp4 文件,您的视频播放器将能够轻松解码。
这是我们用来下载最高质量视频源的代码:
video_file = YouTube(“https://www.youtube.com/watch?v=3eMTWX07eY4”).streams.order_by(‘resolution’).desc().first().download() |
这将在脚本所在的位置创建一个仅包含视频的 .webm 文件。接下来,下载 Youtube 视频的音频源。与我们选择最佳视频质量的方式相同,我们将使用以下命令选择具有更大比特率的音频源:
audio_file = YouTube(video_link).streams.filter(only_audio=True).order_by(‘abr’).desc().first().download(filename_prefix=“audio_”) |
这将在您的脚本所在的位置创建一个 .webm 文件,文件名前缀为“audio_”,以便您区分。
将下载结果存储在变量中与执行实际命令一样重要,因为我们需要这些变量的信息才能将两个提要合并为一个唯一的 .mp4 文件,任何有用的媒体播放器都可以读取该文件。
source_audio = ffmpeg.input(audio_file) | |
source_video = ffmpeg.input(video_file) | |
ffmpeg.concat(source_video, source_audio, v=1, a=1).output(“video_name.mp4”).run() |
如您所见,前两行代码使用了 FFmpeg 库。这里的目标是将两个单独的流加载到 FFmpeg 中,然后在第 4 行将它们连接起来。
您还会注意到输出函数,它为您提供了命名导出的机会。您还可以通过在此字符串值中写入完整路径来导出到不同的文件夹。
运行此命令后,您的计算机将开始在后台使用 FFmpeg 库来实现此任务。此方法会占用大量 CPU,并且每个视频在构建之前都需要一些时间。
总的来说,这是我所知道的以最佳质量在本地下载任何 Youtube 视频的最有效方法。
使用 Python 以所选分辨率下载 Youtube 视频
在本节中,我想向您展示如何设置视频流下载的分辨率限制。当我在下载频道时不需要最高的视频质量时,我会使用此方法。对于某些类型的内容来说,720p 的质量已经足够了。
这是我用来限制分辨率的代码:
video_file = YouTube(video_link).streams.filter(res=“720p”).order_by(‘resolution’).desc().first().download() |
通过在流功能后使用过滤功能,您可以有效地过滤结果,仅显示符合所述分辨率的流。
之后,您可以下载音频文件并连接两个源,正如我在上面部分所解释的那样。
如何使用 Python 下载 YouTube 上的公共播放列表
如果有人与您分享了一个公共播放列表,pytube 库中有一个非常简洁的类,可让您从中检索所有 URL,以便您有机会下载它。从那时起,您可以选择使用上面描述的“使用 Python 下载 Youtube 视频的最快方法”循环遍历列表,或者使用上面描述的稍微复杂一些的方式来调整您的下载设置。
为了检索此 URL 列表,您需要使用以下代码:
from pytube import YouTube | |
from pytube import Playlist | |
playlist = Playlist(“https://www.youtube.com/playlist?list=PLpi4YdMCC439sN_5vIza6IfQm0qc-IqPO”).video_urls | |
for video_link in playlist: | |
try: | |
YouTube(video_link).streams.first().download() | |
except: | |
print(video_link + ” unavailable”) |
当你开始下载 Youtube 频道时,你会发现有些视频不可用。这可能有多种原因:它们被删除了、它们变成了私人视频、它们在你的国家不可用……为了解决这个问题,我添加了一个小的 try/except 参数,它将在日志中指定哪些视频不可用,并自动跳转到下一个视频,而不会停止脚本运行。
正如我在本节开头所说,此脚本只是为了尽可能快地下载。此脚本不会为您提供最佳质量,但它可以完成工作。如果您希望以更高的分辨率下载,您可以使用我在本文中上面分享的代码调整 try 参数。
如何使用 Python 下载 YouTube 频道的视频
现在,我要开始写这篇文章了。我将与你分享我使用的脚本,以便一次性下载整个频道。
您唯一需要做的就是创建一个名为“youtube_export_history.csv”的 csv 文件,用于保存脚本。之后,您可以在脚本底部编辑您感兴趣的 YouTube 频道的链接以及您想要保存下载的文件夹,然后它会自动下载所有视频。
如果脚本停止或互联网连接断开,请不要惊慌。CSV 文件的妙处在于,脚本会记住之前下载的每一个视频。
不用多说,以下是代码:
from pytube import YouTube | |
from pytube import Playlist | |
from slugify import slugify | |
import ffmpeg | |
import csv | |
def DownloadVideo(video_link,folder,maxres=None): | |
if maxres==None: | |
print(“Video Started”) | |
video_file = YouTube(video_link).streams.order_by(‘resolution’).desc().first().download() | |
print(“Video Done”) | |
else: | |
print(“Video Started”) | |
video_file = YouTube(video_link).streams.filter(res=maxres).order_by(‘resolution’).desc().first().download() | |
print(“Video Done”) | |
# print(video_file) | |
video_name = slugify(video_file.replace(“.webm”,“”).split(“/”)[–1]) | |
print(“Audio Started”) | |
audio_file = YouTube(video_link).streams.filter(only_audio=True).order_by(‘abr’).desc().first().download(filename_prefix=“audio_”) | |
print(“Audio Done”) | |
source_audio = ffmpeg.input(audio_file) | |
source_video = ffmpeg.input(video_file) | |
print(“Concatenation Started”) | |
ffmpeg.concat(source_video, source_audio, v=1, a=1).output(f”{folder}/{video_name}.mp4″).run() | |
print(“Concatenation Done”) | |
return None | |
def DownloadChannel(channel_link,folder,maxres=None): | |
pure_link = channel_link.replace(“/featured”,“/videos”) | |
list_videos = Playlist(pure_link).video_urls | |
video_count = 0 | |
total_video = len(list_videos) | |
print(f’{total_video} Videos Found’) | |
list_videos_downloaded = [] | |
with open(‘youtube_export_history.csv’, ‘r’, newline=”) as csvfile: | |
spamwriter = csv.reader(csvfile, quoting=csv.QUOTE_MINIMAL) | |
for row in spamwriter: | |
list_videos_downloaded.append(row[0]) | |
for video in list_videos: | |
if video in list_videos_downloaded: | |
video_count = video_count + 1 | |
print(f’Video {video_count}/{total_video} already downloaded’) | |
else: | |
print(video) | |
video_count = video_count + 1 | |
print(f’{video_count}/{total_video} Started’) | |
DownloadVideo(video_link=video,maxres=maxres,folder=folder) | |
with open(‘youtube_export_history.csv’, ‘a’, newline=”) as csvfile: | |
spamwriter = csv.writer(csvfile, quoting=csv.QUOTE_MINIMAL) | |
spamwriter.writerow([video]) | |
print(f’{video_count}/{total_video} Done’) | |
DownloadChannel(channel_link=“channel_link”, | |
folder=“fullFolderPath”, | |
maxres=None) |
这里我们感兴趣的是最后三行代码。在这里您将设置此脚本正常工作所需的三个参数。
您要设置的第一件事是 channel_link 变量。为了正常工作,此脚本要求您转到要下载的 Youtube 频道,然后进入“视频”选项卡。此链接是此处所需的链接。

第二个参数是文件夹路径。只需复制并粘贴您想要存储视频的完整文件夹路径(不带最后一个斜杠)。我在 Mac OS 上编写了脚本,因此如果您使用其他操作系统,我希望这不会造成任何问题。如果确实如此,请随时告诉我,以便我在 Windows 中寻找修复方法。
最后,如果您想要以最大分辨率下载,则需要最后一个参数。
作为免责声明,请勿在其中设置疯狂的分辨率,例如 1080p 或 2160p。如果您设置的分辨率高于您感兴趣的 YouTube 频道上的视频的最低质量,这可能会导致脚本完全跳过提到的视频。为了安全起见,当您想要将下载限制为 720p 或 480p 时,您需要使用此参数。
结论
差不多就是这样了,然后您就可以自由地启动 .py 文件并观看视频的展开。祝您好运,如果您想要分享或阅读来自世界各地其他内容囤积者的技巧和窍门,请随时加入我们的 r/DataHoarder。
我希望这能有所帮助。如果您觉得这篇文章有用,我将非常感激您能与您的团队或朋友分享此 URL。这对我来说意义重大。如果您对更多类似的教程感兴趣,您还可以将此网站添加到您的 RSS 阅读器或加入我的时事通讯,我每周最多使用一次,让您了解我的最新文章和我发现的趋势。
感谢您的时间,