Python

Python 使用 pytube 自動下載 YouTube 影片教學與範例

本篇介紹如何使用 Python 的 pytube 模組,自動下載 YouTube 的影片。

pytube是一個專門用來下載 YouTube 影片的 Python 模組,除了提供程式介面的自動化下載功能,也附帶有指令下載工具,可以快速下載 YouTube 的影片。

安裝 pytube 模組

Python 的 pytube 模組可以透過標準的 pip 直接安裝:

# 安裝 pytube 模組
pip install pytube

指令下載 YouTube 影片

在 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

程式自動化下載 YouTube 影片

在 Python 的 pytube 模組也可以用於一般的指令稿中,撰寫自動化下載 YouTube 影片的程式。

下載 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

YouTubestreams 中通常會包含非常多種影片格式:

# 查看所有影片格式
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 撥放清單

若要以程式下載 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()
Share
Published by
Office Guide

Recent Posts

Python 使用 PyAutoGUI 自動操作滑鼠與鍵盤

本篇介紹如何在 Python ...

9 個月 ago

Ubuntu Linux 以 WireGuard 架設 VPN 伺服器教學與範例

本篇介紹如何在 Ubuntu ...

9 個月 ago

Linux 網路設定 ip 指令用法教學與範例

本篇介紹如何在 Linux 系...

9 個月 ago

Windows 使用 TPM 虛擬智慧卡保護 SSH 金鑰教學與範例

本篇介紹如何在 Windows...

10 個月 ago

Linux 以 Shamir’s Secret Sharing 分割保存金鑰教學與範例

介紹如何在 Linux 中使用...

11 個月 ago

Linux 以 Cryptsetup、LUKS 加密 USB 隨身碟教學與範例

介紹如何在 Linux 系統中...

11 個月 ago