【Python】YouTube APIで動画データを取得する方法

  • YouTubeの動画データ(再生回数、いいね数など)を取得するには?
  • PythonでYouTube APIを扱うには?

本記事ではこのような疑問を解決します。


YouTubeにアップされている動画のタイトルや再生数、いいね数などの情報を一覧で取得できたら便利ですよね。

さらにcsvファイルなどに出力して分析を行えばマーケティング等に活かすことができます。


そこで今回はPythonによってYouTube APIで動画データを取得する方法を解説します。


なお、今回作成するプログラムは「任意の検索キーワードを入力するとそのキーワードがタイトルに入った動画一覧を再生回数が多い順に取得してcsvファイルに出力する」というものです。

APIキーを取得する

まずはYouTube APIを利用するためにGCP(Google Cloud Platform)で操作を行います。

GCPアカウントをまだお持ちでない方はこちらから作成してください。
(今回は無料の範囲内で利用可能です。)


それでは以下の手順でAPIキーを取得しましょう。

GCPコンソールにアクセスする

・ナビゲーションメニューから「APIとサービス」を選択する

・「APIとサービス」のメニューから「ライブラリ」を選択する

・「YouTube Data API v3」と検索して選択する
(「YouTube」と入れれば予測変換で出てくる)

・「有効化」をクリックする

・「APIとサービス」のメニューに戻り、「認証情報」を選択する

・「+認証情報を作成」をクリックして「APIキー」を選択する

以上の操作でAPIキーが取得できました。

なお、APIキーについては名前や利用範囲を好きなように編集できます。
※今回はそのまま利用

環境を構築する

次にプログラムを動かすための環境を構築していきます。

今回使用するPythonのパッケージ管理ツールにはPoetryを使用します。
(もちろんpipなどでも問題ありません。)

Poetryがインストールされていない場合は、
Poetry公式ドキュメントに沿ってインストールしてください。


それではPoetryで環境を構築していきます。

ちなみに、バージョンは以下の通りです。
・Python 3.10.5
・Poetry 1.1.14



最初にPoetryプロジェクトを作成しましょう。

$ poetry new youtube_api
※プロジェクト名は好きなものに変えてもらってOKです。

作成したプロジェクトのディレクトリに移動します。

$ cd youtube_api

必要なPythonライブラリをインストールします。

$ poetry add google-api-python-client pandas

最後に今回コードを記述するPythonファイルを作成しておきましょう。

$ touch main.py

これで以下のディレクトリ構成になっているはずです。

 youtube_api
 ├── pyproject.tomol
 ├── poetry.lock
 ├── main.py
 ├── README.rst
 ├── youtube_api
             └── (中身省略)
 ├── tests
             └── (中身省略)

Pythonコードを記述する

ここまででコードを書く準備が整いました。

実際に記述するコードは以下の通りです。

import argparse
from apiclient.discovery import build
import pandas as pd


YOUTUBE_API_KEY = '取得したAPIキー'
YOUTUBE_API_SERVICE_NAME = "youtube"
YOUTUBE_API_VERSION = "v3"


youtube = build(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION, developerKey=YOUTUBE_API_KEY)


# 動画の再生回数やいいね数、お気に入り数などを取得する処理
def get_statistics(id):
    statistics = youtube.videos().list(part='statistics', id=id).execute()['items'][0]['statistics']
    return statistics


# 動画データ一覧を取得する処理
def get_video_info(part, q, order, type, num):
    search_list = []
    for i in range(num):
      if i == 0:
        search_query = youtube.search().list(
          part=part,
          q=q,
          order=order,
          type=type,
          maxResults=10,# maxResults→5~50
          )
      else:
        search_query = youtube.search().list_next(
          search_query,
          api_response,
        )

      api_response = search_query.execute()

      search_response = api_response.get("items", [])
      for v in search_response:
        id = v["id"]["videoId"]
        title = v["snippet"]["title"]
        description = v["snippet"]["description"]
        channel_title = v["snippet"]["channelTitle"]
        statistics = get_statistics(id)
        if "viewCount" in statistics:
          view_count = statistics["viewCount"]
        else:
          view_count = 0
        if "likeCount" in statistics:
          like_count = statistics["likeCount"]
        else:
          like_count = 0
        if "favoriteCount" in statistics:
          favorite_count = statistics["favoriteCount"]
        else:
          favorite_count = 0
        if "commentCount" in statistics:
          comment_count = statistics["commentCount"]
        else:
          comment_count = 0
        url = 'https://www.youtube.com/watch?v=%s' % id
        published_at = v["snippet"]["publishedAt"]
        result = [id, title, description, channel_title, view_count, like_count, favorite_count, comment_count, url, published_at]
        search_list.append(result)
    return search_list



def main(args):
  data = get_video_info(part='snippet', q=args.keyword, order='viewCount', type='video', num=args.num)
  df = pd.DataFrame(data, columns=['ID', 'タイトル', '説明', 'チャンネル名', '再生回数', 'いいね数', 'お気に入り数', 'コメント数', 'URL', '公開日時'])
  df.to_csv('video_list.csv')


if __name__ == '__main__':
    parser = argparse.ArgumentParser(
        add_help=True
    )
    subparsers = parser.add_subparsers()

    parser_convert = subparsers.add_parser('get_video_list', help='get video list')
    parser_convert.add_argument('--keyword', '-k', required=True)
    parser_convert.add_argument('--num', '-n', required=True, type=int)
    parser_convert.set_defaults(handler=main)

    args = parser.parse_args()

    if hasattr(args, 'handler'):
        args.handler(args)
    else:
        parser.print_help()

今回は一度に取得できる動画件数を10件とし、
get_video_info()の引数numに渡した値分処理を繰り返します。

つまり、一回のコマンド実行で「10件 × num回」分の動画件数を取得することができます。

プログラムを動かしてみる

最後に実際にプログラムを動かしてみましょう。

今回のプログラムではコマンドライン引数に検索キーワード(-k)と取得回数(-n)を指定します。

以下のコマンドを実行します。

$ poetry run python main.py get_video_list -k "プログラミング" -n 3
※タイトルに「プログラミング」が入っている動画を再生回数が多い順に30件取得する

実際に出力されたcsvファイルは以下の通りです。

YouTube API サンプルcsvファイル

これで無事にYouTubeから動画データを取得することができました!

まとめ

以上がPythonによってYouTube APIで動画データを取得する方法になります。

簡単な手順で自由に任意の動画データを取得することができました。

SNSの市場調査をはじめとしたマーケティング等に役立ててみてください!