pytube
pytube 是一個輕量的、無任何依賴的工具敏晤,用來下載youtube視頻。
github開源地址:https://github.com/nficano/pytube
特性
- 支持Progressive和DASH Streams
- 支持下載視頻列表
- 使用on_download_progress和on_download_complete回調(diào)方式
- 提供命令行界面
- 字幕跟蹤支持
- 將標(biāo)題曲目輸出為.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支持稱為動態(tài)自適應(yīng)HTTP流傳輸(DASH)的流技術(shù)的結(jié)果钱雷。
在pytube的背景下,其意義在于最高質(zhì)量的流;您現(xiàn)在需要下載音頻和視頻軌道吹零,然后使用FFmpeg等軟件對它們進(jìn)行后處理以合并它們罩抗。
包含單個文件中的音頻和視頻的傳統(tǒng)流(稱為“漸進(jìn)式下載”)仍然可用,但僅適用于720p及以下的分辨率灿椅。
要僅查看這些漸進(jìn)式下載流:
>>> 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流(也稱為“自適應(yīng)”),您可以執(zhí)行以下操作:
>>> 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/')
這將從給定的播放列表下載可用的最高漸進(jìn)流(通常為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">
如果需要針對特定??功能進(jìn)行優(yōu)化,例如“最高分辨率”或“最低平均比特率”:
>>> yt.streams.filter(progressive=True).order_by('resolution').desc().all()
請注意欢唾,如果您的屬性在任何Stream實例中未定義且警,則無法使用order_by,因此請務(wù)必在調(diào)用之前應(yīng)用過濾器刪除這些屬性礁遣。
如果您的應(yīng)用程序需要后處理邏輯斑芜,pytube允許您指定“on download complete”回調(diào)函數(shù):
>>> def convert_to_aac(stream, file_handle):
return # do work
>>> yt.register_on_complete_callback(convert_to_aac)
同樣,如果您的應(yīng)用程序需要下載進(jìn)度邏輯祟霍,pytube也會為此公開回調(diào):
>>> 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的開關(guān),它會捆綁狀態(tài)垂谢,允許其他人輕松重放您的問題厦画。
命令行用法
您可以通過簡單地傳遞-e(或--extension =)開關(guān)并將其設(shè)置為所需的文件類型來下載視頻:
$ 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)標(biāo)志來查看可用格式列表
$ 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