本篇介紹如何使用 Python 的 pytube
模組,自動下載 YouTube 的影片。
pytube
是一個專門用來下載 YouTube 影片的 Python 模組,除了提供程式介面的自動化下載功能,也附帶有指令下載工具,可以快速下載 YouTube 的影片。
pytube
模組Python 的 pytube
模組可以透過標準的 pip
直接安裝:
# 安裝 pytube 模組
pip install pytube
在 Python 的 pytube
模組附帶了一個 pytube
指令稿,可以讓使用者快速下載 YouTube 影片:
# 下載 YouTube 影片
pytube https://youtube.com/watch?v=2lAe1cqCOXo
執行之後就會將 YouTube 下載並儲存為 MP4 影片。
pytube
指令稿也可以下載 YouTube 撥放清單中的所有影片:
# 下載 YouTube 影片
pytube https://www.youtube.com/playlist?list=PLS1QulWo1RIaJECMeUT4LFwJ-ghgoSH6n
若只需要下載 YouTube 影片的聲音部分,不需要影像,可以加上 -a
或 --audio
參數,並指定下載的格式,例如:
# 下載 YouTube 影片的聲音部分 pytube -a mp4 https://youtube.com/watch?v=2lAe1cqCOXo
我們可以加上 -l
或 --list
參數查詢 YouTube 影片有哪一些格式可以下載:
# 查詢 YouTube 影片的格式 pytube -l https://youtube.com/watch?v=2lAe1cqCOXo
Loading video... <Stream: itag="17" mime_type="video/3gpp" res="144p" fps="12fps" vcodec="mp4v.20.3" acodec="mp4a.40.2" progressive="True" type="video"> <Stream: itag="18" mime_type="video/mp4" res="360p" fps="24fps" vcodec="avc1.42001E" acodec="mp4a.40.2" progressive="True" type="video"> <Stream: itag="22" mime_type="video/mp4" res="720p" fps="24fps" vcodec="avc1.64001F" acodec="mp4a.40.2" progressive="True" type="video"> <Stream: itag="137" mime_type="video/mp4" res="1080p" fps="24fps" vcodec="avc1.640028" progressive="False" type="video"> <Stream: itag="248" mime_type="video/webm" res="1080p" fps="24fps" vcodec="vp9" progressive="False" type="video"> <Stream: itag="399" mime_type="video/mp4" res="1080p" fps="24fps" vcodec="av01.0.08M.08" progressive="False" type="video"> <Stream: itag="136" mime_type="video/mp4" res="720p" fps="24fps" vcodec="avc1.4d401f" progressive="False" type="video"> <Stream: itag="247" mime_type="video/webm" res="720p" fps="24fps" vcodec="vp9" progressive="False" type="video"> <Stream: itag="398" mime_type="video/mp4" res="720p" fps="24fps" vcodec="av01.0.05M.08" progressive="False" type="video"> <Stream: itag="135" mime_type="video/mp4" res="480p" fps="24fps" vcodec="avc1.4d401e" progressive="False" type="video"> <Stream: itag="244" mime_type="video/webm" res="480p" fps="24fps" vcodec="vp9" progressive="False" type="video"> <Stream: itag="397" mime_type="video/mp4" res="480p" fps="24fps" vcodec="av01.0.04M.08" progressive="False" type="video"> <Stream: itag="134" mime_type="video/mp4" res="360p" fps="24fps" vcodec="avc1.4d401e" progressive="False" type="video"> <Stream: itag="243" mime_type="video/webm" res="360p" fps="24fps" vcodec="vp9" progressive="False" type="video"> <Stream: itag="396" mime_type="video/mp4" res="360p" fps="24fps" vcodec="av01.0.01M.08" progressive="False" type="video"> <Stream: itag="133" mime_type="video/mp4" res="240p" fps="24fps" vcodec="avc1.4d4015" progressive="False" type="video"> <Stream: itag="242" mime_type="video/webm" res="240p" fps="24fps" vcodec="vp9" progressive="False" type="video"> <Stream: itag="395" mime_type="video/mp4" res="240p" fps="24fps" vcodec="av01.0.00M.08" progressive="False" type="video"> <Stream: itag="160" mime_type="video/mp4" res="144p" fps="24fps" vcodec="avc1.4d400c" progressive="False" type="video"> <Stream: itag="278" mime_type="video/webm" res="144p" fps="24fps" vcodec="vp9" progressive="False" type="video"> <Stream: itag="394" mime_type="video/mp4" res="144p" fps="24fps" vcodec="av01.0.00M.08" progressive="False" type="video"> <Stream: itag="139" mime_type="audio/mp4" abr="48kbps" acodec="mp4a.40.5" progressive="False" type="audio"> <Stream: itag="140" mime_type="audio/mp4" abr="128kbps" acodec="mp4a.40.2" progressive="False" type="audio"> <Stream: itag="249" mime_type="audio/webm" abr="50kbps" acodec="opus" progressive="False" type="audio"> <Stream: itag="250" mime_type="audio/webm" abr="70kbps" acodec="opus" progressive="False" type="audio"> <Stream: itag="251" mime_type="audio/webm" abr="160kbps" acodec="opus" progressive="False" type="audio">
itag
是 YouTube 區分影片格式用的標籤,我們可以透過這裡的 itag
值來指定下載的影片格式,例如下載 webm 格式、品質為 50k bps 的聲音檔:
# 查詢 YouTube 影片的格式 pytube --itag 249 zh-TW https://youtube.com/watch?v=2lAe1cqCOXo
在 Python 的 pytube
模組也可以用於一般的指令稿中,撰寫自動化下載 YouTube 影片的程式。
首先從 pytube
模組引入 YouTube
,建立 YouTube
物件:
from pytube import YouTube # 建立 YouTube 物件 yt = YouTube('http://youtube.com/watch?v=2lAe1cqCOXo')
我們可以透過 YouTube
物件取得一些影片的基本資訊:
# 影片標題 print(yt.title)
YouTube Rewind 2019: For the Record | #YouTubeRewind
# 影片縮圖 print(yt.thumbnail_url)
https://i.ytimg.com/vi/2lAe1cqCOXo/sddefault.jpg
在 YouTube
的 streams
中通常會包含非常多種影片格式:
# 查看所有影片格式 print(yt.streams)
[<Stream: itag="17" mime_type="video/3gpp" res="144p" fps="12fps" vcodec="mp4v.20.3" acodec="mp4a.40.2" progressive="True" type="video">, <Stream: itag="18" mime_type="video/mp4" res="360p" fps="24fps" vcodec="avc1.42001E" acodec="mp4a.40.2" progressive="True" type="video">, <Stream: itag="22" mime_type="video/mp4" res="720p" fps="24fps" vcodec="avc1.64001F" acodec="mp4a.40.2" progressive="True" type="video">, <Stream: itag="137" mime_type="video/mp4" res="1080p" fps="24fps" vcodec="avc1.640028" progressive="False" type="video">, <Stream: itag="248" mime_type="video/webm" res="1080p" fps="24fps" vcodec="vp9" progressive="False" type="video">, <Stream: itag="399" mime_type="video/mp4" res="1080p" fps="24fps" vcodec="av01.0.08M.08" progressive="False" type="video">, <Stream: itag="136" mime_type="video/mp4" res="720p" fps="24fps" vcodec="avc1.4d401f" progressive="False" type="video">, <Stream: itag="247" mime_type="video/webm" res="720p" fps="24fps" vcodec="vp9" progressive="False" type="video">, <Stream: itag="398" mime_type="video/mp4" res="720p" fps="24fps" vcodec="av01.0.05M.08" progressive="False" type="video">, <Stream: itag="135" mime_type="video/mp4" res="480p" fps="24fps" vcodec="avc1.4d401e" progressive="False" type="video">, <Stream: itag="244" mime_type="video/webm" res="480p" fps="24fps" vcodec="vp9" progressive="False" type="video">, <Stream: itag="397" mime_type="video/mp4" res="480p" fps="24fps" vcodec="av01.0.04M.08" progressive="False" type="video">, <Stream: itag="134" mime_type="video/mp4" res="360p" fps="24fps" vcodec="avc1.4d401e" progressive="False" type="video">, <Stream: itag="243" mime_type="video/webm" res="360p" fps="24fps" vcodec="vp9" progressive="False" type="video">, <Stream: itag="396" mime_type="video/mp4" res="360p" fps="24fps" vcodec="av01.0.01M.08" progressive="False" type="video">, <Stream: itag="133" mime_type="video/mp4" res="240p" fps="24fps" vcodec="avc1.4d4015" progressive="False" type="video">, <Stream: itag="242" mime_type="video/webm" res="240p" fps="24fps" vcodec="vp9" progressive="False" type="video">, <Stream: itag="395" mime_type="video/mp4" res="240p" fps="24fps" vcodec="av01.0.00M.08" progressive="False" type="video">, <Stream: itag="160" mime_type="video/mp4" res="144p" fps="24fps" vcodec="avc1.4d400c" progressive="False" type="video">, <Stream: itag="278" mime_type="video/webm" res="144p" fps="24fps" vcodec="vp9" progressive="False" type="video">, <Stream: itag="394" mime_type="video/mp4" res="144p" fps="24fps" vcodec="av01.0.00M.08" progressive="False" type="video">, <Stream: itag="139" mime_type="audio/mp4" abr="48kbps" acodec="mp4a.40.5" progressive="False" type="audio">, <Stream: itag="140" mime_type="audio/mp4" abr="128kbps" acodec="mp4a.40.2" progressive="False" type="audio">, <Stream: itag="249" mime_type="audio/webm" abr="50kbps" acodec="opus" progressive="False" type="audio">, <Stream: itag="250" mime_type="audio/webm" abr="70kbps" acodec="opus" progressive="False" type="audio">, <Stream: itag="251" mime_type="audio/webm" abr="160kbps" acodec="opus" progressive="False" type="audio">]
我們可以利用條件篩選功能,選出我們要的串流格式來下載,例如先篩選 progressive 類型的 MP4 影片格式:
# 篩選 progressive 類型的 MP4 影片格式 progMP4 = yt.streams.filter(progressive=True, file_extension='mp4') print(progMP4)
[<Stream: itag="18" mime_type="video/mp4" res="360p" fps="24fps" vcodec="avc1.42001E" acodec="mp4a.40.2" progressive="True" type="video">, <Stream: itag="22" mime_type="video/mp4" res="720p" fps="24fps" vcodec="avc1.64001F" acodec="mp4a.40.2" progressive="True" type="video">]
接著找出解析度最好的 MP4 影片:
# 找出解析度最好的 MP4 影片 targetMP4 = progMP4.order_by('resolution').desc().first() print(targetMP4)
<Stream: itag="22" mime_type="video/mp4" res="720p" fps="24fps" vcodec="avc1.64001F" acodec="mp4a.40.2" progressive="True" type="video">
決定好要下載的影片串流格式之後,即可進行下載:
# 下載影片 video_file = targetMP4.download() print(video_file)
/home/ubuntu/tmp/YouTube Rewind 2019 For the Record YouTubeRewind.mp4
下載的影片檔案預設會放在目前的執行目錄之下,我們也可以在 download()
的參數中直接指定下載影片檔案的放置目錄:
# 下載影片並儲存至 /tmp/youtube_dl 目錄 video_file = targetMP4.download("/tmp/youtube_dl") print(video_file)
/tmp/youtube_dl/YouTube Rewind 2019 For the Record YouTubeRewind.mp4
若要以程式下載 YouTube 撥放清單中的所有影片,可以使用 Playlist
功能。
首先以 YouTube 撥放清單網址來建立 Playlist 物件:
from pytube import Playlist # 建立 Playlist 物件 p = Playlist('https://www.youtube.com/playlist?list=PLS1QulWo1RIaJECMeUT4LFwJ-ghgoSH6n')
或是以 YouTube 撥放清單中的其中一部影片網址來建立 Playlist 物件也可以:
# 建立 Playlist 物件 p = Playlist('https://www.youtube.com/watch?v=41qgdwd3zAg&list=PLS1QulWo1RIaJECMeUT4LFwJ-ghgoSH6n')
Playlist 物件中會包含一些撥放清單的基本資訊:
# 撥放清單標題 print(p.title)
Python Tutorial for Beginners (For Absolute Beginners)
撥放清單終究包含了所有影片的 YouTube 物件,所以只要以迴圈的方式逐一下載每部 YouTube 影片即可:
# 逐一處理撥放清單中的影片 for video in p.videos: # 下載 YouTube 影片 video.streams.first().download()