
使用 pytube 套件下載 YouTube 影片
昨天,我打開去年自己寫的 YouTube 下載器,想要下載全集的城市獵人 TV 版本,結果發現不能用了!上網查了一下,目前想要下載影片要用 pytube 套件 (去年我是用 pytube3),雖然花了一點時間查詢,不過除了找到要將套件改成 pytube 外,還額外發現了可以下載清單影片的方法 (之前我是用解析網址的方式和爬蟲,去找清單裡的網址),方法很簡單,今天來分享給大家試試!
1. 首先,打開 Anaconda Prompt / cmd,於命令提示字元視窗中輸入「pip install pytube」後,按 Enter。

可以看到目前的版本是 10.9.2
到它的網站查看,是前幾天更新的!

2. 打開 Jupyter Notebook,並新增一個檔案。

於第一列輸入「from pytube import YouTube」匯入套件,按 Shift + Enter 執行並跳到下一列。

於第二列輸入「yt = YouTube(‘https://www.youtube.com/watch?v=gvDPqvOYz7c’)」(可以找自己喜歡的影片,把網址取代掉。)

於第三列輸入「yt.streams.first().download()」開始下載影片

但這樣下載下來的影片,通常都不是最高畫質!

雖然我們可以先把 yt.streams 給 print 出來,從裡面 res 找到最高畫質的,再用 filter 方法,篩選後下載,但這個方式很麻煩。

不過在 pytube 的說明文件,有提供一個方法,可以直接下載最高畫質的影片!
請在新的一列輸入「yt.streams.get_highest_resolution().download()」(這個就是把剛剛的 first 改成 get_highest_resolution 方法),輸入完後執行。

下載完後可以發現,影片的畫質變高了!

但其實 1280 * 692 並不是這個影片的最高畫質,這個影片的最高是 2160p,用 get_highest_resolution 可以載到的是「一個有影片 + 聲音的最高畫質的影片」,如果直接用 filter 方法,下載 2016p 的影片,這個影片檔是沒有聲音的,音檔要再另外載,之後再將它們合成。
Python 程式碼:
from pytube import YouTube
yt = YouTube('https://www.youtube.com/watch?v=gvDPqvOYz7c')
print("開始下載影片")
yt.streams.get_highest_resolution().download('./videos')
print("影片下載完成")
老師,請問能不能不寫程式碼,直接下載影片?
答案是可以喔!打開妳的 Anaconda Prompt / cmd,先用 cd 指令,到妳要下載影片的資料夾,然後輸入「pytube YouTube 網址」,YouTube 網址,可以是單一影片,或者是清單,輸入完後按 Enter 執行,影片就會下載囉!

不過因為有些影片,它是無法下載的,所以如果是下載清單影片,而且數量多的話,很容易載到無法下載的,然後就卡在那邊,所以接下來要來教怎麼用程式碼來下載清單影片,而且如果遇到不能載的,就跳過它,繼續下載下一部影片。
3. 回到 Jupyter Notebook,在新的一列輸入「from pytube import Playlist」匯入套件。

輸入「p = Playlist(‘https://www.youtube.com/playlist?list=PL12UaAf_xzfqa7zew_DxioZiS02Rcq_6w’)」設定清單網址

輸入下方內容,可以看到清單裡,影片的標題。
for video in p.videos:
print(video.title)

迴圈裡改成「video.streams.get_highest_resolution().download()」就可以下載影片了!不過剛剛也說過,如果影片不能載,出錯的話就會卡在那邊,所以我們要寫例外處理,當影片出錯時就跳過換下一部影片。
4. 將下方內容輸入至新的一列
for url in p.video_urls:
try:
yt = YouTube(url)
print(f'下載中 影片: {yt.title}')
yt.streams.get_highest_resolution().download('./videos')
except:
print(f'影片: {yt.title} 無法下載,跳過繼續下載下一部。', end='\n\n')
else:
print("影片下載完成", end='\n\n')

這次將迴圈更改,變數 url 存放清單裡,每一筆影片的網址,有幾部影片迴圈就會跑幾次!程式碼裡的 try、except、else,就是例外處理的程式,下載時如果出錯,就執行 except 裡的敘述,如果沒錯就執行最底下 else 裡的敘述。
Python 程式碼:
from pytube import YouTube, Playlist
p = Playlist('https://www.youtube.com/playlist?list=PL12UaAf_xzfqa7zew_DxioZiS02Rcq_6w')
for url in p.video_urls:
try:
yt = YouTube(url)
print(f'下載中 影片: {yt.title}')
yt.streams.get_highest_resolution().download('./videos')
except:
print(f'影片: {yt.title} 無法下載,跳過繼續下載下一部。', end='\n\n')
else:
print("影片下載完成", end='\n\n')

此次教學就到這邊!有問題歡迎留言討論,謝謝。
想下載最高畫質且有聲音的影片,請參考以下兩篇:
使用 You-Get 套件下載影片 – JB 程式筆記 (jbprogramnotes.com)
使用 You-Get 套件搭配 FFmpeg – JB 程式筆記 (jbprogramnotes.com)
如果覺得文章內容還不錯的話,麻煩請幫我點個讚!感謝
可以多點幾次喔~~
第一次點讚需使用 Google 或 Facebook 帳號註冊

