基于 Python 视频搬运 Part4 - pytube 下载 YouTube 资源
本文是基于 Python 视频搬运的第三篇,也是一篇完整的 pytube 教程,介绍如何通过 pytube 下载 YouTube 的音视频等资源。
概述
pytube 是一款由 Python 实现,用于下载油管的第三方库,它的特点是无第三方的依赖,轻量,而且还有一个非常重要的点,它的接口灵活度高。
而且,对于命令行,pytube 也提供了 pytube 命令也实现了通过命令行实现资源下载。当然,命令行下载视频的工具,更著名的 youtube-dl 和 you-get,它们比 pytube 出名,如果不是通过 Python 实现资源下载,它们或许是更好的选择。
安装
如下命令安装 pytube:
|
|
快速开始
我们通过一个案例演示如何使用 pytube 下载视频,视频地址:www.youtube.com/watch?v=ceRYL271cao。
YoutTube 是 pytube 的核心类,它可用于获取某个 YouTube 视频的信息,包括基本属性内容等,如标题、音视频流,字幕等。
视频属性
|
|
如上的代码获取了视频的标题、封面图和频道地址。
输出结果:
|
|
更多属性:
|
|
输出结果:
|
|
属性的具体含义,可查看 pytube 文档:YouTube Object
音视频流
pytube 与其他的油管视频下载工具不同,它不会默认选择资源下载,要我们手动 filter 选择要使用的资源。
首先,查看 YouTube 中可用的音视频资源信息,通过 YoutTube 的 streams 属性获取。
代码如下:
|
|
输出结果:
|
|
pytube 支持 filter 过滤资源,如只要视频资源,选择分辨率最高的视频。
代码如下:
|
|
首先,通过 type="video"
过滤视频资源,接着按 resolution,即分辨率,升序排序视频,再最后一个视频。
视频下载
一旦获取到我们的目标 stream,就可以调用 download 方法,即可下载。
|
|
默认情况,download 下载位置为当前目录,并以 YouTube 视频标题作为文件名。如希望修改这个默认行为,可通过 filename 和 output_path 实现。filename 执行下载文件名,output_path 执行文件下载路径。
音视频分离
现在,我们得到了一个视频文件,但这极有可能一个无声视频。
pytube 官方文档有如下这么一段话:
|
|
简单来说,就是部分 stream 同时包含音视频,而部分 stream 是音视频分离的。而同时包含视频的流使用的是以前的 Progressive Adaptive 技术,音视频分离使用的是 Dynamic Adaptive Streaming over HTTP,即 DASH 技术。
关键是,Progressive Adaptive 的视频最高分辨率是 720p,更高分辨率则必须是用 Dash 技术的流,分别下载音频和视频,再通过类似 FFmpeg 的工具将两者合并。
我们现在就不能只下载视频资源了。
修改后的代码,如下所示:
|
|
到此,我们成功获取需要的音视频资源了。
下载进度
默认的配置,pytube 下载视频不展示下载进度,可通过在创建 YouTube 类时指定回调.
代码如下所示:
|
|
除了 on_progress_callback,还可指定 on_complete_callback,用于指定下载完成的回调。
频道与播放列表
如何更好地使用 pytube 管理与下载资源呢?
YouTube 核心有 4 个 Object 类,即 Channel、PlayList、YoutTube 和 Stream。
前面已经演示过 YouTube 和 Stream 类的基本使用。要用好 pytube,重点是了解这 4 个类间的关系。
简言之,Channel 中包含 PlayList 和 YouTube。而 PlayList 中包含 YouTube。YouTube 中包含 Stream。即Channel 和 Playlist 是 YouTube 的容器。
如果实现频道视频检测的功能,可利用 Channel 和 PlayList 这两个类,定时检测 Channel 和 PlayList 中的 video_urls。
创建 Channel 的代码:
|
|
频道的创建要传入 channel 地址,而这个地址,因为 YouTube 的改版,网页端中的 channel 地址不可用,而要通过 YoutTube 的 channel_url 属性获取。
示例代码如下:
|
|
输出结果:
|
|
特别说明,因为 youtube 的改版,pytube 中有些接口已经不可用了,要修复。如,Channel 中的一些功能不可用,这篇文章有介绍修复方案:解决近期Pytube的Channel Video列表会空的问题。
通过 Channel 获取所有的 YouTube 或视频地址列表:
|
|
播放列表 playlist 的创建,可通过播放 playlist 地址或视频地址中包含 playlist 的参数。
代码如下所示:
|
|
通过 playlist 获取所有 YoutTube 或地址列表:
|
|
搜索能力
pytube 还提供了搜索油管的能力,或许一些场景会有用吧。
使用代码如下:
|
|
其中返回的 results 就是 YouTube 的实例数组。如有需要,从中选择需要的 YoutTube 兑现个,在其上执行 streams 下载即可。
命令行工具 - pytube
pytube 除了以 python 库的形式提供视频下载能力,还提供了一个 pytube 的命令行工具。
以一些示例说明 pytube 命令的使用吧,如下所示:
下载包含音频且最高分辨率视频:
|
|
查看所有可用的流:
|
|
下载指定的流:
|
|
查看可用字幕:
|
|
下载执行字幕:
|
|
下载音频:
|
|
最后
本文介绍了如何使用 pytube 下载油管资源,如果大家希望通过 python 管理下载视频,希望它能有所有帮助。