Categories: Python

【Python】pytubeを使ってYouTubeの動画をダウンロードする

この記事ではpytubeを使ってYouTubeの動画をダウンロードする方法を解説します。

pytubeを使うことで簡単にYouTubeの動画をダウンロードすることができます。

それでは、早速インストール方法や使い方を見ていきましょう!

インストール

pytubeは、pipでインストールできます。

pip install pytube

YouTubeオブジェクトの生成

pytubeを使うには、まずYouTubeオブジェクトを生成します。

from pytube import YouTube

class YouTube(
    url: str,
    on_progress_callback: ((Any, bytes, int) -> None) | None = None,
    on_complete_callback: ((Any, str | None) -> None) | None = None,
    proxies: Dict[str, str] = None,
    use_oauth: bool = False,
    allow_oauth_cache: bool = True
)

以下のような引数が定義されています。

url YouTubeの動画のURL
on_progress_callback 進行状況イベント用のユーザー定義のコールバック関数
on_complete_callback 完了イベント用のユーザー定義のコールバック関数
proxies pytubeによって使用されるプロキシ アドレスへの辞書マッピング プロトコル
use_oauth ユーザーにYouTubeへの認証を求めるプロンプトを表示します
allowed_oauth_cache OAuth トークンをマシン上でローカルにキャッシュします

基本的にはダウンロードしたいYouTubeの動画のURLを渡して初期化すれば良い。今回はYouTube Japan 公式チャンネルの「マリオのコミュニティが視聴回数 1000 億回を突破」のURLを使わして頂いてます。

from pytube import YouTube

# ダウンロードしたい動画のURL
url = 'https://www.youtube.com/watch?v=JOfoPFH3DYc'

# YouTubeオブジェクトの生成
yt = YouTube(url)

動画の情報の取得

YouTubeオブジェクトから以下のような情報を取得することができます。

# 動画のタイトル
print(yt.title)

# サムネイルのURL
print(yt.thumbnail_url)

# チャンネルのURL
print(yt.channel_url)

# 動画の説明(概要欄)
print(yt.description)

# チャンネルID
print(yt.channel_id)

# 動画のID
print(yt.video_id)

# レーティング
print(yt.rating)

# 公開日
print(yt.publish_date)

他にもプロパティが定義されているので必要な場合は以下のサイトを参考にしてください。

Linkpytube.__main__ — pytube 15.0.0 documentation

動画をダウンロードする

動画をダウンロードするには、ストリームの中から解像度やタイプを選んでfilter()などで絞り込み、download()を実行してダウンロードします。

ストリームを取得するにはstreamsを使います。ここでpytube.exceptions.RegexMatchErrorという例外が送出された方は 実行できない場合 に飛んでください。

print(yt.streams)
# [<Stream: itag="17" mime_type="video/3gpp" res="144p" fps="8fps" vcodec="mp4v.20.3" acodec="mp4a.40.2" progressive="True" type="video">, 
# <Stream: itag="18" mime_type="video/mp4" res="360p" fps="30fps" vcodec="avc1.42001E" acodec="mp4a.40.2" progressive="True" type="video">, ...]

例えば解像度が720pでMP4の動画をダウンロードしたい場合は以下のような感じになります。

yt.streams.filter(res='720p', file_extension='mp4').first().download()

filter()メソッドで解像度720pかつMP4の動画に絞り込み、first()メソッドでその中の最初の要素を取得し、download()メソッドでダウンロードしています。

他にもorder_by()メソッドやdesc()メソッドなどでフィルタリングやソートが可能です。

Linkpytube.query — pytube 15.0.0 documentation

また、download()メソッドにも多数の引数が定義されています。output_path引数で保存場所を決めたり、filename引数でファイル名を変更できたりします。

Linkdownload() - Stream Object - API — pytube 15.0.0 documentation

実行できない場合

pytube 15.0.0 を使った場合、streamsを実行するとpytube.exceptions.RegexMatchErrorという例外が送出されてしまうことがある。

このエラーは、pytube.exceptions.RegexMatchError: get_throttling_function_name: could not find match for multiple に記述されている通りにpytubecipher.pyfunction_patterns変数を以下のように書き換えると解消される。

function_patterns = [
    # https://github.com/ytdl-org/youtube-dl/issues/29326#issuecomment-865985377
    # https://github.com/yt-dlp/yt-dlp/commit/48416bc4a8f1d5ff07d5977659cb8ece7640dcd8
    # var Bpa = [iha];
    # ...
    # a.C && (b = a.get("n")) && (b = Bpa[0](b), a.set("n", b),
    # Bpa.length || iha("")) }};
    # In the above case, `iha` is the relevant function name
    r'a\.[a-zA-Z]\s*&&\s*\([a-z]\s*=\s*a\.get\("n"\)\)\s*&&.*?\|\|\s*([a-z]+)',
    r'\([a-z]\s*=\s*([a-zA-Z0-9$]+)(\[\d+\])?\([a-z]\)',
]

まとめ

この記事では、pytubeを使ってYouTubeの動画をダウンロードする方法を解説しました。

pytubeのおかげでとても簡単にYouTubeの動画をダウンロードすることができましたが、悪いことに使わないように注意しましょう!

それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ

ゆうまる

独学でプログラミングを勉強しているおじさん。いろんな言語を勉強したが浅く広くなためあまり仕事につながらない。また忘れっぽいため自分のブログを備忘録としても使っている。産まれてこのかたずっとネコを飼ってる生粋のネコ派。最近お腹が出てきて筋トレに奮闘中!

Recent Posts

【Dart】コンストラクタのデフォルト引数について

Dartのコンストラクタのデフォルト引数…

2週間 ago

【Unity】有料アセットを無料で手に入れる方法

この記事では、Unityの有料アセットを…

4か月 ago

【Python】任意の秒数だけ処理を一時停止する方法【sleep()関数】

この記事では、Pythonで任意の秒数だ…

1年 ago

【Python】Wordの文書の新規作成と読み書き

この記事では、Pythonを使ってWor…

1年 ago

【Python】メタクラスって結局なんなの?

この記事では、Pythonのメタクラスに…

1年 ago