如何使用 youtube-dl 抓取 YouTube 频道的更新

众所周知,具有极强品牌意识的 Apple 会在下架商品的同时下架官方 YouTube 频道的视频,而 YouTube 上曾经出现过的第三方 Apple 视频库(例如 EveryAppleVideo)都纷纷被 Apple 发函拿下。如果你一直很想收藏 Apple 的广告视频(并在深夜反复观看),你可以在 VPS 上安装 youtube-dl 来抓取 Apple 的更新,下载最高清晰度的视频和音频,并使用 ffmpeg 将音视频流压在一起。这个方法适用于任何 YouTube 频道。

先决条件

在开始之前,你需要:

  • 一台配置不算太差 KVM 虚拟化的 VPS,内存至少要在 512 Mb 以上,因为要使用 ffmpeg,所以处理器核心不能太差。同时因为要挂载网盘,所以你的服务商需要为你的服务器开启 FUSE.
  • 一个网盘账号,Google Drive, Dropbox 和 OneDrive 均可。
  • 学会如何使用 ssh 远程登录 VPS,网上有很多教程,你可以轻松找到

Disclaimer: 接下来的安装和部署,我都是在 Debian 9 下进行,我可能会犯很初级的错误。如果有,请在评论中指出。

配置 youtube-dl 和 ffmpeg

  1. 安装 youtube-dl

youtube-dl 是一个可以下载 YouTube 视频的命令行应用程序,它需要 Python (2.6, 2.7, 或 3.2+) 才能正常工作,关于 youtube-dl 在不同平台下详细的安装说明可以参考它的 github readme 页面。

所以,我们先在 VPS 上安装 Python.

apt-get install python

然后再下载最新版的 youtube-dl

wget http://youtube-dl.org/latest/youtube-dl -O /usr/local/bin/youtube-dl

在这一步,如果你的服务商的系统模版精简太厉害的话,很可能会报证书错误,提示证书不可信之类的信息,这个时候,你需要安装 ca-certificates 证书包。

apt-get install ca-certificates

更改目录的访问权限

chmod a+x /usr/local/bin/youtube-dl

至此,youtube-dl 就安装好了,这个时候,执行 youtube-dl —help应该可以看到如下的输出:

  1. 安装 ffmpeg

由于 YouTube 在 1080P 以上清晰度的视频才用了音视频流分开的设计,单纯下载 1080P 以上清晰度的视频时会出现只有画面没有声音的情况,所以我们需要使用 ffmpeg 将音视频流压制在一起。

apt-get install ffmpeg

安装完成之后,执行命令 ffmpeg 应该可以看到如下的输出:

至此,下载并且压制 YouTube 视频的工具已经完备,接下来我们准备一个抓取频道最高清晰度所有视频并下载的脚本。

准备抓取频道的脚本

youtube-dl 的具体使用说明在这里不赘述了,它的帮助文档中也有较为详细的描述,yotuube-dl 的功能和可配置选项非常强大,有兴趣的你可以详细研究。

但总之,我们需要做到的是:

  1. 下载频道中提供的最高清晰度视频,并且使用 ffmpeg 将音视频重新压制,输出为 mkv 格式。
  2. 重新命名输出文件,命名格式为:视频上传日期 – 视频标题 – (视频ID) – 清晰度 – 视频的 ID,视频需要存在以频道名称命名的文件夹中。
  3. 记录需要下载的 YouTube 频道,并且记录已经下载的视频 ID,重复执行脚本的时候无需重复下载。
  4. 下载视频配套的字幕(非自动转换)元数据和原始插图。

为了达到上述所有的功能,下载脚本的配置文件应该这么写,在这个配置文件中,下载的项目略微有些多,如果你不需要下载字幕和元数据,可以使用 # 将它注释掉:

-i
-o "%(uploader)s (%(uploader_id)s)/%(upload_date)s - %(title)s - (%(duration)ss) [%(resolution)s] [%(id)s].%(ext)s"

# 记录已下载文件以及需要下载的频道
--download-archive youtube-dl-archive.txt
-a youtube-dl-channels.txt

# 统一输出格式
--prefer-ffmpeg
--merge-output-format mkv

# 下载字幕
--write-sub
--all-subs
--convert-subs srt

# 下载元数据和配图
--add-metadata
--write-description
--write-thumbnail

# Debug
-v

将这个文件保存为 youtube-dl.conf,同时,新建一个名字叫 youtube-dl-channels.txt 的文件,记录你需要下载的频道地址,如下所示:

# Apple
https://www.youtube.com/user/Apple/

#Crowbcat

https://www.youtube.com/user/CrowbCat

#Nerdwriter1

https://www.youtube.com/user/Nerdwriter1

#idubbbz

https://www.youtube.com/user/iDubbbzTV

只需提供 URL 即可,接下来,新建一个名字为 youtube-dl-archive.txt 的空文件,这个文件内会记录已经下载的 YouTube 视频的视频 ID,重复运行的时候会跳过这个文件中记录的 ID.

接下来,确保上面建立的三个文件都在同一个目录,执行 youtube-dl --config-location youtube-dl.conf 即可开始自动爬取的过程,下载视频和压制的过程非常漫长,建议在 screen 中运行这个命令,以免 ssh 连接中断而导致脚本终止。

当然,你可能要问了,要我手工执行命令的话,这个到底自动在哪里?其实你可以将 youtube-dl --config-location youtube-dl.conf 保存为一个 shell script 并且建立一个 cron job 每隔一段时间自动执行,cron 是一个 Linux 系统下的计划任务工具,可以给定一个时间间隔自动运行一些项目,非常好用。

另外,配合 rclone,你可以挂载主流网盘,直接将下载完成的文件 rclone sync 到网盘上。但关于 rclone 的用法,我们只能下次再讲了(标准虎头蛇尾结局)。

注:本文的写作离不开 reddit/r/DataHoarder 社区的帮助。

2 Comments 如何使用 youtube-dl 抓取 YouTube 频道的更新

    1. 王惊喜

      下载过的视频会记录在 youtube-dl-archive.txt 中,再次运行会跳过已经有记录的视频(即便文件已经转移了)

      Reply

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.