下载YouTube视频的pythonic库。
pytubetemp的Python项目详细描述
比重瓶
pytube是一个非常严肃、轻量级、无依赖关系的python库(和命令行实用程序),用于下载youtube视频。
说明
YouTube是世界上最流行的视频分享平台,作为一个黑客,你可能会遇到一种情况,你想编写一些脚本来下载视频。为此,我向您介绍pytube。
pytube是用python编写的轻量级库。它没有第三方依赖关系,目标是高度可靠。
pytube还简化了管道,允许您为不同的下载事件指定回调函数,例如on progress
或on complete
。
最后,pytube还包括一个命令行实用程序,允许您从终端快速下载视频。
看,简单性与灵活性的完美平衡:< EH3>>>>YouTube('https://youtu.be/9bZkp7q19f0').streams.first().download()>>>yt=YouTube('http://youtube.com/watch?v=9bZkp7q19f0')>>>yt.streams....filter(progressive=True,file_extension='mp4')....order_by('resolution')....desc()....first()....download()
功能
- 支持渐进式和短流程
- 支持下载完整的播放列表
- 轻松注册
on_download_progress
&;on_download_complete
回调 - 包括命令行接口
- 字幕轨道支持
- 将字幕曲目输出为.srt格式(子字幕)
- 能够捕获缩略图url。
- 大量文档化的源代码
- 无第三方依赖关系
安装
通过pypi使用pip下载。
$ pip install pytube
开始
让我们从演示使用pytube下载视频有多容易开始:
>>>frompytubeimportYouTube>>>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">]
相反,如果您只想查看短划线流(也称为“自适应”),则可以执行以下操作:
>>>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播放列表:
>>>frompytubeimportPlaylist>>>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()
请注意,如果在任何流实例中未定义属性,则不能使用order_by
,因此在调用该属性之前,请确保应用筛选器删除这些属性。
如果您的应用程序需要后处理逻辑,pytube允许您指定一个“on download complete”回调函数:
>>>defconvert_to_aac(stream,file_handle):return# do work>>>yt.register_on_complete_callback(convert_to_aac)
类似地,如果应用程序需要下载进度逻辑,pytube也会为此公开回调:
>>>defshow_progress_bar(stream,chunk,file_handle,bytes_remaining):return# do work>>>yt.register_on_progress_callback(show_progress_bar)
C类命令行接口
pytube还附带了一个用于下载和探测视频的小型cli接口。
让我们从下载开始:
$ pytube http://youtube.com/watch?v=9bZkp7q19f0 --itag=22
查看可用流:
$ pytube http://youtube.com/watch?v=9bZkp7q19f0 --list
最后,如果您正在提交一个bug报告,cli包含一个名为--build-playback-report
的开关,它将状态捆绑起来,允许其他人轻松地重播您的问题。