0
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【プログラムの制作過程】複数の動画をyoutubeから自動で取得

Posted at

この記事は、python初心者が初めて動画を取得し保存する
プログラムを作ったので、どのような制作過程を経て行ったか
淡々と書いていったものになります。

似たようなプログラムをごろごろと転がっていますが、
どのように調べ、どのように実装していったか
自身の成長記録みたいな感じでこの記事を書いていきます。

※注意

youtubeのダウンロードは自己責任でお願いいたします。

.

.

.

制作イメージ

キーワード(検索ワード)を元に、その動画を指定した数だけ取得。
動画をダウンロードして、キーワード(検索ワード)の名前でフォルダを作成。
そのフォルダに動画を保存していきます。

環境

OS : Big Sur 11.2.3
conda version : 4.8.3
python version : 3.8.3
Jupyter Notebook

実装

制作イメージにある機能要件を満たすために、
一気に作り込まず、調べて実装できそうなところから
進めていきました。

.
また、調べ方、検索の方法として、
なるべく最新の記事の情報を参考にしました。

理由は、使うバージョンや環境が異なっていると、
なんか面倒くさそうだからです。

.
サクサクと実装できて、エラーでつまづく時間は最小にしたいので、
こんな感じのマイルールを設けていました。

youtube動画のキーワード検索を自動化

サンプルコードをそのままコピペして実行できれば、楽ちんなので
コピペして動かせそうなものを探しました。
調べた記事で最も参考になったのが下記の記事です。

参考記事:Python+APIでYouTube動画を自動検索。ダウンロードも?

image.png

Google APIキーの取得も必要なので、記事を参考に進めていけば、
サンプル通りに動画のタイトルとURLを取得できました。

youtubeから動画をダウンロード

取得したURLをもとに動画をダウンロードできないか調べました。
参考記事:動画をダウンロードしてみる(Python)youtube-dl

下記のソースを先程のソースに加えて、
取得したURLの動画をダウンロードできないか試しました。

from __future__ import unicode_literals
import youtube_dl

ydl_opts = {}
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
    ydl.download(['https://www.youtube.com/watch?v=BaW_jenozKc'])

.
合体させたソースがこちら
image.png

インポートするモジュールを定義しているところに、2行追加。

ダウンロードの部分を書いている残りの3行は、
取得したURLの情報をスコープの範囲内で使用できるように、
if分の階層に追加しました。

.
image.png

ダウンロードしたファイルは、保存先を定義していないので、
Pythonファイルが置いているディレクトリに保存されます。

ディレクトリ作成と保存

動画がダウンロードされて、よかったのですが、
これがもし30、40、5000兆件ダウンロードしようとすると
整理がとても大変になりますよね。

なので、検索ワードの名前のフォルダを作成して、
そこに動画を入れていけないか調べました。

参考記事:ディレクトリの作成と削除

.

最終的に完成させたのがこちら。

.
▼ソース

from apiclient.discovery import build
from __future__ import unicode_literals
import youtube_dl
import os

api_key = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'

def get_videos_search(keyword):
    youtube = build('youtube', 'v3', developerKey=api_key)
    youtube_query = youtube.search().list(q=keyword, part='id,snippet', maxResults=25)     #取得件数設定
    youtube_res = youtube_query.execute()
    return youtube_res.get('items', [])

keyword = input("検索ワードを入力してください:")

# os.mkdir('/Users/XXXXX/Desktop/' +keyword)
result = get_videos_search(keyword)

for item in result:
    if item['id']['kind'] == 'youtube#video':
        print(item['snippet']['title'])
        print('https://www.youtube.com/watch?v=' + item['id']['videoId'])
        
        url = 'https://www.youtube.com/watch?v=' + (item['id']['videoId'])
        ydl_opts = {
           'outtmpl': keyword+ '/%(title)s.%(ext)s'
        }
        with youtube_dl.YoutubeDL(ydl_opts) as ydl:
            try:
                ydl.cache.remove()
                ydl.download([url])
            except youtube_dl.DownloadError as error:
                pass

▼実行結果
image.png

▼フォルダの中身
image.png

ディレクトリの作成

参考記事の通り、os モジュールで用意されている mkdir 関数を使います。
それを先頭の部分に追加。

import os

youtube-dlを使用してydl_optsにディレクトリの設定ができると
調べてわかったので、ydl_optsに検索ワードの名前でフォルダを作成し、
そこに動画を保存するようにさせました。

...
for item in result:
    if item['id']['kind'] == 'youtube#video':
        print(item['snippet']['title'])
        print('https://www.youtube.com/watch?v=' + item['id']['videoId'])
        
        url = 'https://www.youtube.com/watch?v=' + (item['id']['videoId'])
  これ=> ydl_opts = {
           'outtmpl': keyword+ '/%(title)s.%(ext)s'
        }
...

エラー回避

ダウンロードを実行している際に、エラーで停止することがありました。
調べたら、キャッシュのクリア?が問題かなと思ったので、
なんとなく追加してみました。

認識が間違っているかもしれないので、有識者の方
ご指摘をいただけると助かります。

...
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
            try:
                ydl.cache.remove()
                ydl.download([url])
            except youtube_dl.DownloadError as error:
                pass

あとがき

インデントやスコープ等の基礎知識があれば、エラーで悩む時間も少なく
簡単に実装できるのではないかと思いました。

0
4
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
0
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?