下载YouTube视频的pythonic库。

pytubetemp的Python项目详细描述


pytube logo

pypipypi

比重瓶

pytube是一个非常严肃、轻量级、无依赖关系的python库(和命令行实用程序),用于下载youtube视频。

说明

YouTube是世界上最流行的视频分享平台,作为一个黑客,你可能会遇到一种情况,你想编写一些脚本来下载视频。为此,我向您介绍pytube

pytube是用python编写的轻量级库。它没有第三方依赖关系,目标是高度可靠。

pytube还简化了管道,允许您为不同的下载事件指定回调函数,例如on progresson 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的开关,它将状态捆绑起来,允许其他人轻松地重播您的问题。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java使用哪个地图/集合?   bluej Java:计算税   由于性能问题,java双精度字符串替代方案   java Eclipse CDT生成设置因重新启动而丢失   如何在java控制台中显示字节流值   java获取url地址,其中是包含我的页面的iframe   java 403禁止的spring启动API调用错误?   如果一个方法返回true,java将停止计时器   使用JavaNIO获取文件创建日期   在Java中从整数转换为二进制时保留整个字节的字符串   java AspectJ&Maven警告:“未应用……中定义的建议?”   java为什么我得到3,我不应该得到+7   java当一个方法包含多个返回的if语句时,如何从该方法中获取返回值?   在运行时循环java(scan.nextLine()!="$")   java配置休眠。cfg。春天的xml   java使用HtmlUnit模拟用户,错误   java CLI如何持续检查更改   java最大素因子(返回)