pytube
pytube 是一个轻量的、无任何依赖的工具,用来下载youtube视频。
github开源地址:https://github.com/nficano/pytube
特性
- 支持Progressive和DASH Streams
- 支持下载视频列表
- 使用on_download_progress和on_download_complete回调方式
- 提供命令行界面
- 字幕跟踪支持
- 将标题曲目输出为.srt格式(SubRip字幕)
- 能够捕获缩略图URL。
- 开源免费
- 没有第三方依赖
安装
$ pip install pytube
快速上手
下载单个视频
>>> from pytube import YouTube
>>> YouTube('http://youtube.com/watch?v=9bZkp7q19f0').streams.first().download()
查看所有可用格式
>>> yt = YouTube('http://youtube.com/watch?v=9bZkp7q19f0')
>>> yt.streams.all()
[<Stream: itag="22" mime_type="video/mp4" res="720p" fps="30fps" vcodec="avc1.64001F" acodec="mp4a.40.2">,
<Stream: itag="43" mime_type="video/webm" res="360p" fps="30fps" vcodec="vp8.0" acodec="vorbis">,
<Stream: itag="18" mime_type="video/mp4" res="360p" fps="30fps" vcodec="avc1.42001E" acodec="mp4a.40.2">,
<Stream: itag="36" mime_type="video/3gpp" res="240p" fps="30fps" vcodec="mp4v.20.3" acodec="mp4a.40.2">,
<Stream: itag="17" mime_type="video/3gpp" res="144p" fps="30fps" vcodec="mp4v.20.3" acodec="mp4a.40.2">,
<Stream: itag="137" mime_type="video/mp4" res="1080p" fps="30fps" vcodec="avc1.640028">,
<Stream: itag="248" mime_type="video/webm" res="1080p" fps="30fps" vcodec="vp9">,
<Stream: itag="136" mime_type="video/mp4" res="720p" fps="30fps" vcodec="avc1.4d401f">,
<Stream: itag="247" mime_type="video/webm" res="720p" fps="30fps" vcodec="vp9">,
<Stream: itag="135" mime_type="video/mp4" res="480p" fps="30fps" vcodec="avc1.4d401e">,
<Stream: itag="244" mime_type="video/webm" res="480p" fps="30fps" vcodec="vp9">,
<Stream: itag="134" mime_type="video/mp4" res="360p" fps="30fps" vcodec="avc1.4d401e">,
<Stream: itag="243" mime_type="video/webm" res="360p" fps="30fps" vcodec="vp9">,
<Stream: itag="133" mime_type="video/mp4" res="240p" fps="30fps" vcodec="avc1.4d4015">,
<Stream: itag="242" mime_type="video/webm" res="240p" fps="30fps" vcodec="vp9">,
<Stream: itag="160" mime_type="video/mp4" res="144p" fps="30fps" vcodec="avc1.4d400c">,
<Stream: itag="278" mime_type="video/webm" res="144p" fps="30fps" vcodec="vp9">,
<Stream: itag="140" mime_type="audio/mp4" abr="128kbps" acodec="mp4a.40.2">,
<Stream: itag="171" mime_type="audio/webm" abr="128kbps" acodec="vorbis">,
<Stream: itag="249" mime_type="audio/webm" abr="50kbps" acodec="opus">,
<Stream: itag="250" mime_type="audio/webm" abr="70kbps" acodec="opus">,
<Stream: itag="251" mime_type="audio/webm" abr="160kbps" acodec="opus">]
您可能会注意到列出的某些流同时具有视频编解码器和音频编解码器,而其他流只有视频或音频,这是YouTube支持称为动态自适应HTTP流传输(DASH)的流技术的结果。
在pytube的背景下,其意义在于最高质量的流;您现在需要下载音频和视频轨道,然后使用FFmpeg等软件对它们进行后处理以合并它们。
包含单个文件中的音频和视频的传统流(称为“渐进式下载”)仍然可用,但仅适用于720p及以下的分辨率。
要仅查看这些渐进式下载流:
>>> yt.streams.filter(progressive=True).all()
[<Stream: itag="22" mime_type="video/mp4" res="720p" fps="30fps" vcodec="avc1.64001F" acodec="mp4a.40.2">,
<Stream: itag="43" mime_type="video/webm" res="360p" fps="30fps" vcodec="vp8.0" acodec="vorbis">,
<Stream: itag="18" mime_type="video/mp4" res="360p" fps="30fps" vcodec="avc1.42001E" acodec="mp4a.40.2">,
<Stream: itag="36" mime_type="video/3gpp" res="240p" fps="30fps" vcodec="mp4v.20.3" acodec="mp4a.40.2">,
<Stream: itag="17" mime_type="video/3gpp" res="144p" fps="30fps" vcodec="mp4v.20.3" acodec="mp4a.40.2">]
相反,如果您只想查看DASH流(也称为“自适应”),您可以执行以下操作:
>>> yt.streams.filter(adaptive=True).all()
[<Stream: itag="137" mime_type="video/mp4" res="1080p" fps="30fps" vcodec="avc1.640028">,
<Stream: itag="248" mime_type="video/webm" res="1080p" fps="30fps" vcodec="vp9">,
<Stream: itag="136" mime_type="video/mp4" res="720p" fps="30fps" vcodec="avc1.4d401f">,
<Stream: itag="247" mime_type="video/webm" res="720p" fps="30fps" vcodec="vp9">,
<Stream: itag="135" mime_type="video/mp4" res="480p" fps="30fps" vcodec="avc1.4d401e">,
<Stream: itag="244" mime_type="video/webm" res="480p" fps="30fps" vcodec="vp9">,
<Stream: itag="134" mime_type="video/mp4" res="360p" fps="30fps" vcodec="avc1.4d401e">,
<Stream: itag="243" mime_type="video/webm" res="360p" fps="30fps" vcodec="vp9">,
<Stream: itag="133" mime_type="video/mp4" res="240p" fps="30fps" vcodec="avc1.4d4015">,
<Stream: itag="242" mime_type="video/webm" res="240p" fps="30fps" vcodec="vp9">,
<Stream: itag="160" mime_type="video/mp4" res="144p" fps="30fps" vcodec="avc1.4d400c">,
<Stream: itag="278" mime_type="video/webm" res="144p" fps="30fps" vcodec="vp9">,
<Stream: itag="140" mime_type="audio/mp4" abr="128kbps" acodec="mp4a.40.2">,
<Stream: itag="171" mime_type="audio/webm" abr="128kbps" acodec="vorbis">,
<Stream: itag="249" mime_type="audio/webm" abr="50kbps" acodec="opus">,
<Stream: itag="250" mime_type="audio/webm" abr="70kbps" acodec="opus">,
<Stream: itag="251" mime_type="audio/webm" abr="160kbps" acodec="opus">]
您还可以下载完整的Youtube播放列表:
>>> from pytube import Playlist
>>> pl = Playlist("https://www.youtube.com/watch?v=Edpy1szoG80&list=PL153hDY-y1E00uQtCVCVC8xJ25TYX8yPU")
>>> pl.download_all()
>>> # or if you want to download in a specific directory
>>> pl.download_all('/path/to/directory/')
这将从给定的播放列表下载可用的最高渐进流(通常为720p)。之后将提供更多选项,以便用户灵活选择视频分辨率。
Pytube允许您过滤每个可用的属性(请参阅完整列表的文档),让我们看看一些最有用的属性。
列出仅音频流:
>>> yt.streams.filter(only_audio=True).all()
[<Stream: itag="140" mime_type="audio/mp4" abr="128kbps" acodec="mp4a.40.2">,
<Stream: itag="171" mime_type="audio/webm" abr="128kbps" acodec="vorbis">,
<Stream: itag="249" mime_type="audio/webm" abr="50kbps" acodec="opus">,
<Stream: itag="250" mime_type="audio/webm" abr="70kbps" acodec="opus">,
<Stream: itag="251" mime_type="audio/webm" abr="160kbps" acodec="opus">]
仅列出 mp4
流:
>>> yt.streams.filter(subtype='mp4').all()
[<Stream: itag="22" mime_type="video/mp4" res="720p" fps="30fps" vcodec="avc1.64001F" acodec="mp4a.40.2">,
<Stream: itag="18" mime_type="video/mp4" res="360p" fps="30fps" vcodec="avc1.42001E" acodec="mp4a.40.2">,
<Stream: itag="137" mime_type="video/mp4" res="1080p" fps="30fps" vcodec="avc1.640028">,
<Stream: itag="136" mime_type="video/mp4" res="720p" fps="30fps" vcodec="avc1.4d401f">,
<Stream: itag="135" mime_type="video/mp4" res="480p" fps="30fps" vcodec="avc1.4d401e">,
<Stream: itag="134" mime_type="video/mp4" res="360p" fps="30fps" vcodec="avc1.4d401e">,
<Stream: itag="133" mime_type="video/mp4" res="240p" fps="30fps" vcodec="avc1.4d4015">,
<Stream: itag="160" mime_type="video/mp4" res="144p" fps="30fps" vcodec="avc1.4d400c">,
<Stream: itag="140" mime_type="audio/mp4" abr="128kbps" acodec="mp4a.40.2">]
还可以指定多个过滤器:
>>> yt.streams.filter(subtype='mp4', progressive=True).all()
>>> # this can also be expressed as:
>>> yt.streams.filter(subtype='mp4').filter(progressive=True).all()
[<Stream: itag="22" mime_type="video/mp4" res="720p" fps="30fps" vcodec="avc1.64001F" acodec="mp4a.40.2">,
<Stream: itag="18" mime_type="video/mp4" res="360p" fps="30fps" vcodec="avc1.42001E" acodec="mp4a.40.2">]
您还有一个界面可以通过itag选择流,而无需过滤:
>>> yt.streams.get_by_itag(22)
<Stream: itag="22" mime_type="video/mp4" res="720p" fps="30fps" vcodec="avc1.64001F" acodec="mp4a.40.2">
如果需要针对特定功能进行优化,例如“最高分辨率”或“最低平均比特率”:
>>> yt.streams.filter(progressive=True).order_by('resolution').desc().all()
请注意,如果您的属性在任何Stream实例中未定义,则无法使用order_by,因此请务必在调用之前应用过滤器删除这些属性。
如果您的应用程序需要后处理逻辑,pytube允许您指定“on download complete”回调函数:
>>> def convert_to_aac(stream, file_handle):
return # do work
>>> yt.register_on_complete_callback(convert_to_aac)
同样,如果您的应用程序需要下载进度逻辑,pytube也会为此公开回调:
>>> def show_progress_bar(stream, chunk, file_handle, bytes_remaining):
return # do work
>>> yt.register_on_progress_callback(show_progress_bar)
Command-line interface
pytube还附带一个小的cli接口,用于下载和探测视频。
让我们从下载开始:
$ pytube http://youtube.com/watch?v=9bZkp7q19f0 --itag=22
要查看可用流:
$ pytube http://youtube.com/watch?v=9bZkp7q19f0 --list
最后,如果您要提交错误报告,cli包含一个名为—build-playback-report的开关,它会捆绑状态,允许其他人轻松重放您的问题。
命令行用法
您可以通过简单地传递-e(或—extension =)开关并将其设置为所需的文件类型来下载视频:
$ pytube -e mp4 http://www.youtube.com/watch?v = Ik-RsDGPI5Y
同样指定分辨率:
$ pytube -r 720p http://www.youtube.com/watch?v = Ik-RsDGPI5Y
在没有分辨率或扩展名的情况下运行时,它会显示可下载的可用格式列表
$ pytube http://www.youtube.com/watch?v = Ik-RsDGPI5Y
分辨率扩展
----------------------------
0 3gp 144p
1 3gp 240p
2 mp4 360p
3 mp4 720p
4 webm 360p
输入选择:
您可以通过传递-s(或—show-available)标志来查看可用格式列表
$ pytube -s http://www.youtube.com/watch?v = Ik-RsDGPI5Y
您还可以指定下载文件路径(-p或—path =):
$ pytube -e mp4 -p~ / Downloads / http://www.youtube.com/watch?v = Ik-RsDGPI5Y
和/或可选择选择文件名(-f或--filename =):
$ pytube -e mp4 -f “纸浆小说中的舞蹈场景” http://www.youtube.com/watch?v = Ik-RsDGPI5Y