如何使用 Python 下载整个 YouTube 频道

您是否曾觉得需要下载某人在 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()

运行时,这两行代码会将括号内链接指定的视频下载到脚本所在的文件夹中。

download_youtube_video_python

这种方法有一个缺点。通过这种方法我们能实现的最大分辨率大部分是 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 频道,然后进入“视频”选项卡。此链接是此处所需的链接。

download_Youtube_channel_with_python-1024x788-1

第二个参数是文件夹路径。只需复制并粘贴您想要存储视频的完整文件夹路径(不带最后一个斜杠)。我在 Mac OS 上编写了脚本,因此如果您使用其他操作系统,我希望这不会造成任何问题。如果确实如此,请随时告诉我,以便我在 Windows 中寻找修复方法。

最后,如果您想要以最大分辨率下载,则需要最后一个参数。

作为免责声明,请勿在其中设置疯狂的分辨率,例如 1080p 或 2160p。如果您设置的分辨率高于您感兴趣的 YouTube 频道上的视频的最低质量,这可能会导致脚本完全跳过提到的视频。为了安全起见,当您想要将下载限制为 720p 或 480p 时,您需要使用此参数。

结论

差不多就是这样了,然后您就可以自由地启动 .py 文件并观看视频的展开。祝您好运,如果您想要分享或阅读来自世界各地其他内容囤积者的技巧和窍门,请随时加入我们的 r/DataHoarder。

我希望这能有所帮助。如果您觉得这篇文章有用,我将非常感激您能与您的团队或朋友分享此 URL。这对我来说意义重大。如果您对更多类似的教程感兴趣,您还可以将此网站添加到您的 RSS 阅读器或加入我的时事通讯,我每周最多使用一次,让您了解我的最新文章和我发现的趋势。

感谢您的时间,