python下載youtube視頻

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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末滥朱,一起剝皮案震驚了整個濱河市根暑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌徙邻,老刑警劉巖排嫌,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異缰犁,居然都是意外死亡淳地,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進(jìn)店門帅容,熙熙樓的掌柜王于貴愁眉苦臉地迎上來颇象,“玉大人,你說我怎么就攤上這事并徘∏睬” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵麦乞,是天一觀的道長蕴茴。 經(jīng)常有香客問我,道長姐直,這世上最難降的妖魔是什么倦淀? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮声畏,結(jié)果婚禮上撞叽,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好能扒,可當(dāng)我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著辫狼,像睡著了一般初斑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上膨处,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天见秤,我揣著相機與錄音,去河邊找鬼真椿。 笑死鹃答,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的突硝。 我是一名探鬼主播测摔,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼解恰!你這毒婦竟也來了锋八?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤护盈,失蹤者是張志新(化名)和其女友劉穎挟纱,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體腐宋,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡紊服,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了胸竞。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片欺嗤。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖撤师,靈堂內(nèi)的尸體忽然破棺而出剂府,到底是詐尸還是另有隱情,我是刑警寧澤剃盾,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布腺占,位于F島的核電站,受9級特大地震影響痒谴,放射性物質(zhì)發(fā)生泄漏衰伯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一积蔚、第九天 我趴在偏房一處隱蔽的房頂上張望意鲸。 院中可真熱鬧,春花似錦、人聲如沸怎顾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽槐雾。三九已至夭委,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間募强,已是汗流浹背株灸。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留擎值,地道東北人慌烧。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像鸠儿,于是被迫代替她去往敵國和親屹蚊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,060評論 2 355