LoginSignup
7
14

More than 1 year has passed since last update.

pythonでyoutube動画をダウンロード

Last updated at Posted at 2021-03-24

この記事は著作権法違反を助長するものではありません(実際にダウンロードする際は自己責任でお願いします)

pytube

pythonでyoutube動画をダウンロードするには、pytubeというモジュールを使います
pytubeはpipコマンドで入ります

$ python -m pip install pytube

エラーが出た場合はこちらのコマンドを試してみてください

$ python -m pip3 install pytube3

使い方

from pytube import YouTube

url = #YouTube動画のURL
for y in YouTube(url).streams.all():
    print(y)

YouTube(url).streams.all()だけだとリストが返ってきて見ずらいのでfor文で見やすくします。
これを実行するとitagと動画の保存形式が出てくると思います
pytubeではこのitagで保存形式を指定します

from pytube import YouTube

url = #YouTube動画のURL
YouTube(url).streams.get_by_itag("itag").download("保存先ディレクトリ(フルパス)"):

上記のプログラムでダウンロードできます
また、download()は何も指定しないと自動的にカレントディレクトリに保存されます。

ソースコード

from pytube import YouTube

url = input("urlを指定してください")
for y in YouTube(url).streams.all():
    print(y)
itag = input("itagを入力してください")
YouTube(url).streams.get_by_itag(int(itag)).download()
print("ダウンロードが終了しました")

itagは数値でないといけないのですが、input()で代入すると文字として扱われてしまうので、int()で数値に変換します

タイムアウト付き
from pytube import YouTube
from timeout_decorator import timeout, TimeoutError

@timeout(300)
def download(url, itag):
    YouTube(url).streams.get_by_itag(int(itag)).download()

def set():
    url = input("urlを指定してください")
    for y in YouTube(url).streams.all():
        print(y)
    itag = input("itagを入力してください")
    return url, itag

def startdownload(url, itag):
    try:
        download(url, itag)
        print("ダウンロードが終了しました")
    except TimeoutError:
        print("タイムアウトしました")

def main():
    url, itag = set()
    startdownload(url, itag)

if __name__ == "__main__":
    main()

pytubeにはタイムアウトがない(多分)ので、timeout_decoratorでタイムアウトを設定してあげます(上記コードでは5分)
タイムアウトが付いてると処理が少し遅くなるそうなので、もうちょっと長めに設定してもいいかもしれません

timeout_decoratorもpipで入ります

$ python -m pip install timeout_decorator

def文の前に付くアットマーク(@)の文はデコレーターという意味を持ちます
まあデコレーターのことは下記サイトを見てもらえれば分かりやすいと思います
- アットマーク演算子の使い方

テキストファイルからURLを取得する場合

from pytube import YouTube

with open("ファイルパス", "r") as file:
    url = file.read().split("\n")
for d in url:
    for y in YouTube(d).streams.all():
        print(y)
    itag = input("itagを入力してください")
    YouTube(d).streams.get_by_itag(int(itag)).download()
print("ダウンロードが終了しました")

read()でテキストファイルを読み込み、split("\n")で改行で区切りリスト化、それをfor文で回すとできます。

終わり

いかがでしたでしょうか?
pytubeは便利なモジュールですが、冒頭でも述べたように、実際に使う際は自己責任でお願いします。

参考

7
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
14