python

【Python】初心者必見!PythonでYouTube情報を可視化

YouTubeでの検索結果をもっと効率的に整理できないか?
例えば、特定のキーワードで動画を探したとき、再生回数やチャンネル登録者数、再生時間を簡単に一覧化できたら便利ですよね。

本記事では、YouTube APIPythonを使って、実現する方法を解説します。
YouTube APIを使用して、データ分析を行うためのデータ取得を実施していきましょう。

APIを使用するための事前準備

YouTube Data APIを使用するための事前準備を行います。

Google Cloud Platformアカウントの作成

まず、YouTube Data APIを利用するためには、Google Cloud Platform(GCP)のアカウントが必要です。

以下の順で、アカウントを作成が可能です。

1.ウェブブラウザでGoogle Cloud Platformにアクセスします。

2.画面右上の「コンソールに移動」ボタンをクリックします。

3.Googleアカウントでのログインを求められます。
  ログイン後、GCPの利用規約に同意し、アカウント情報を入力して登録を完了します。

これで、GCPのアカウント作成が完了です。

新規プロジェクトの作成

次に、APIを利用するためのプロジェクトを作成します。

1.GCPコンソールの画面上部の「プロジェクトを選択」ボタンをクリックします。

2.表示されたウィンドウで「新しいプロジェクト」をクリックします。
  「プロジェクト名」を任意で入力します。
  今回は「YouTube Data API Project」にしています。
  「場所」は空欄で大丈夫です。

3.作成を押すとプロジェクトが作成されます。
  作成に成功すると、以下のような成功の通知が表示されます。

YouTube Data APIの有効化

次に、作成したプロジェクトで、YouTube Data APIを有効にします。

1.作成したプロジェクトを選択し、GCPコンソールのナビゲーションメニューから「APIとサービス」>「ライブラリ」を選択します。

2.検索バーに「YouTube Data API v3」と入力し検索結果から該当のAPIを選択します。

3.「有効にする」ボタンをクリックして、APIを有効化します。

これで、YouTube Data APIがプロジェクト内で利用可能になりました。

APIキーの取得

最後に、APIを呼び出す際に必要となるAPIキーを取得します。

1.「認証情報」を選択します。

2.「認証情報を作成」から「APIキー」を選択します。

3.数秒後、APIキーが生成され、ポップアップウィンドウに表示されます。
  このAPIキーを以後使用します。

YouTube Data APIを使用して情報取得

それでは、上記で取得したAPIを用いて、チャンネル情報の取得、動画検索、再生リストの取得などを試していきましょう。

ライブラリのインストール

まず、YouTube Data APIをPythonで利用するには、google-api-python-clientライブラリが必要です。
以下のコマンドでインストールしてください。

pip install google-api-python-client

特定のチャンネルの動画リスト取得

まずは、特定のチャンネルの動画リスト取得を行います。
特定のチャンネルがアップロードした動画のリストを取得するには、playlistItems().listメソッドを使用します。
また、動画の詳細情報を取得するのに、videos().listメソッドを使用します。
コード全体は以下の通りになります。

import pandas as pd
from googleapiclient.discovery import build

API_KEY = 'xxxxx  # ここにあなたのAPIキーを入力
CHANNEL_ID = 'xxxxxx'  # 取得したいチャンネルのID

# YouTube APIクライアントの構築
youtube = build('youtube', 'v3', developerKey=API_KEY)

# チャンネルの情報を取得してアップロード再生リストIDを取得
channel_response = youtube.channels().list(
    part='contentDetails',
    id=CHANNEL_ID
).execute()

uploads_playlist_id = channel_response['items'][0]['contentDetails']['relatedPlaylists']['uploads']

# アップロード再生リスト内の動画を取得
playlist_response = youtube.playlistItems().list(
    part='snippet',
    playlistId=uploads_playlist_id,
    maxResults=10  # 取得する動画数
).execute()

# 動画情報を取得
data = []
for item in playlist_response['items']:
    video_id = item['snippet']['resourceId']['videoId']
    title = item['snippet']['title']
    published_at = item['snippet']['publishedAt']

    # 動画の詳細情報を取得
    video_response = youtube.videos().list(
        part='statistics',
        id=video_id
    ).execute()

    stats = video_response['items'][0]['statistics']
    like_count = stats.get('likeCount', '0')  # イイネ数
    comment_count = stats.get('commentCount', '0')  # コメント数

    # データをリストに格納
    data.append({
        'タイトル': title,
        '動画ID': video_id,
        'URL': f'https://www.youtube.com/watch?v={video_id}',
        '投稿日時': published_at,
        'イイネ数': int(like_count),
        'コメント数': int(comment_count),
    })

# データフレームを作成
df = pd.DataFrame(data)

# Excelファイルとして出力
output_file = 'youtube_videos_1.xlsx'
df.to_excel(output_file, index=False)

チャンネルIDの取得

取得したいYouTubeチャンネルページを開き、チャンネルの説明文をクリックします。
チャンネル共有 >チャンネルIdをコピーをクリックします。

YouTube APIの設定

最初に、APIキーを設定、クライアントの構築を実施します。
合わせて上で取得したチャンネルIDを設定しています。

API_KEY = 'xxxxx  # ここにあなたのAPIキーを入力
CHANNEL_ID = 'xxxxxx'  # 取得したいチャンネルのID

# YouTube APIクライアントの構築
youtube = build('youtube', 'v3', developerKey=API_KEY)

チャンネル情報の取得

指定したチャンネルのアップロード動画リストを取得します。

channel_response = youtube.channels().list(
    part='contentDetails',
    id=CHANNEL_ID
).execute()

uploads_playlist_id = channel_response['items'][0]['contentDetails']['relatedPlaylists']['uploads']

uploads_playlist_id: このIDを使って、チャンネルの動画リストを取得します。

動画リストの取得

アップロードされた動画の情報を取得します。

playlist_response = youtube.playlistItems().list(
    part='snippet',
    playlistId=uploads_playlist_id,
    maxResults=10
).execute()

maxResults: 取得する動画数を設定しています。ここでは10件にしています。

動画ごとの詳細情報の取得

各動画のイイネ数やコメント数など動画の詳細情報を取得していきます。

video_response = youtube.videos().list(
    part='statistics',
    id=video_id
).execute()

stats = video_response['items'][0]['statistics']
like_count = stats.get('likeCount', '0')
comment_count = stats.get('commentCount', '0')

likeCount: イイネ数。
commentCount: コメント数。

データの格納とデータ出力

取得した情報をリスト形式で保存します。

data.append({
    'タイトル': title,
    '動画ID': video_id,
    'URL': f'https://www.youtube.com/watch?v={video_id}',
    '投稿日時': published_at,
    'イイネ数': int(like_count),
    'コメント数': int(comment_count),
})

データをpandasでExcelファイルに保存します。

df = pd.DataFrame(data)
df.to_excel('youtube_videos_1.xlsx', index=False)

実行結果は以下のようになりました。

特定の動画のコメント取得

次は特定動画のコメントを取得していきます。
コメントを一括で取得してユーザの動画への反応を確認するのに役立ちます。

コードは以下の通りになります。

import pandas as pd
from googleapiclient.discovery import build

API_KEY = 'xxxxxx'  # ここにあなたのAPIキーを入力
VIDEO_ID = 'xxxxxxx'  # コメントを取得したい動画のID

# YouTube APIクライアントの構築
youtube = build('youtube', 'v3', developerKey=API_KEY)

# コメントの取得
comments_response = youtube.commentThreads().list(
    part='snippet',
    videoId=VIDEO_ID,
    maxResults=10  # 取得するコメント数
).execute()

# データをリストに格納
data = []
for item in comments_response['items']:
    comment = item['snippet']['topLevelComment']['snippet']
    author = comment['authorDisplayName']  # 投稿者名
    text = comment['textDisplay']  # コメント本文
    like_count = comment.get('likeCount', 0)  # イイネ数(デフォルトは0)
    published_at = comment['publishedAt']  # コメント日時

    data.append({
        '投稿者': author,
        'コメント': text,
        'イイネ数': like_count,
        '投稿日': published_at,
    })

# データフレームを作成
df = pd.DataFrame(data)

# Excelファイルとして出力
output_file = 'youtube_comments_1.xlsx'
df.to_excel(output_file, index=False)

動画IDの取得

まず、動画IDの取得を行います。
動画IDは、取得したい動画のURLのv=xxxxxxxとなっている部分です。

コメントの取得

指定した動画のコメント情報を取得します。

# コメントの取得
comments_response = youtube.commentThreads().list(
    part='snippet',
    videoId=VIDEO_ID,
    maxResults=10  # 取得するコメント数
).execute()

maxResults: 取得するコメント数を設定しています。ここでは10件にしています。

コメント詳細情報の取得

指定した動画のコメントについて順に取得していきます。
今回は、投稿者名、コメント本文、イイネ数、コメント日時を取得しています。

for item in comments_response['items']:
    comment = item['snippet']['topLevelComment']['snippet']
    author = comment['authorDisplayName']  # 投稿者名
    text = comment['textDisplay']  # コメント本文
    like_count = comment.get('likeCount', 0)  # イイネ数(デフォルトは0)
    published_at = comment['publishedAt']  # コメント日時

データの格納とデータ出力

取得した情報をリスト形式で保存します。
データをpandasでExcelファイルに保存します。

    data.append({
        '投稿者': author,
        'コメント': text,
        'イイネ数': like_count,
        '投稿日': published_at,
    })

# データフレームを作成
df = pd.DataFrame(data)

# Excelファイルとして出力
output_file = 'youtube_comments.xlsx'
df.to_excel(output_file, index=False)

実行結果は以下のようになりました。

キーワード検索+再生時間、いいね数、閲覧数の情報を取得

最後にキーワード検索を行い、検索結果の動画を詳細情報とともに出力していきます。
キーワードに対してどのような動画がどのくらい再生されているか、イイネを押されているかなどYoutube動画分析を行う際に役立ちます。

コードは以下の通りになります。

import pandas as pd
import re
from googleapiclient.discovery import build

# APIキーの設定
API_KEY = 'xxxxxx'  # ここにあなたのAPIキーを入力

# 検索キーワードの設定
SEARCH_QUERY = 'Python プログラミング'  # 検索したいキーワード

# YouTube APIクライアントの構築
youtube = build('youtube', 'v3', developerKey=API_KEY)

# 動画検索の実行
search_response = youtube.search().list(
    part='snippet',
    q=SEARCH_QUERY,
    type='video',
    maxResults=50  # 取得する動画数
).execute()

# 検索結果から動画IDのリストを作成
video_ids = [item['id']['videoId'] for item in search_response['items']]

# 動画の詳細情報の取得
video_response = youtube.videos().list(
    part='snippet,statistics,contentDetails',
    id=','.join(video_ids)
).execute()

# ISO 8601形式の再生時間を "時間:分:秒" に変換する関数
def convert_duration(iso_duration):
    match = re.match(r'PT(?:(\d+)H)?(?:(\d+)M)?(?:(\d+)S)?', iso_duration)
    hours = int(match.group(1)) if match.group(1) else 0
    minutes = int(match.group(2)) if match.group(2) else 0
    seconds = int(match.group(3)) if match.group(3) else 0
    return f'{hours:02}:{minutes:02}:{seconds:02}'

# データをリストに格納
data = []
for item in video_response['items']:
    title = item['snippet']['title']  # 動画タイトル
    video_id = item['id']  # 動画ID
    channel_title = item['snippet']['channelTitle']  # チャンネル名
    publish_time = item['snippet']['publishedAt']  # 公開日時
    view_count = item['statistics'].get('viewCount', 'N/A')  # 再生回数
    like_count = item['statistics'].get('likeCount', 'N/A')  # イイネ数
    duration = item['contentDetails']['duration']  # 再生時間 
    readable_duration = convert_duration(duration)  # 再生時間 変換

    # チャンネル登録者数を取得
    channel_id = item['snippet']['channelId']
    channel_response = youtube.channels().list(
        part='statistics',
        id=channel_id
    ).execute()
    subscriber_count = channel_response['items'][0]['statistics'].get('subscriberCount', 'N/A')

    # データを追加
    data.append({
        'タイトル': title,
        'チャンネル名': channel_title,
        'チャンネル登録者数': subscriber_count,
        '公開日': publish_time,
        'URL': f'https://www.youtube.com/watch?v={video_id}',
        '再生回数': view_count,
        'いいね数': like_count,
        '再生時間': readable_duration
    })

# データフレームを作成
df = pd.DataFrame(data)

# Excelファイルとして出力
output_file = 'youtube_search_results_1.xlsx'
df.to_excel(output_file, index=False)

検索クエリの設定

検索したいワードを設定します。

SEARCH_QUERY = 'Python プログラミング'

検索結果の取得

キーワードをもとに、動画の検索を実施します。

search_response = youtube.search().list(
    part='snippet',
    q=SEARCH_QUERY,
    type='video',
    maxResults=50
).execute()

maxResults: 取得する動画数。ここでは50件。

再生時間の変換

YouTubeの再生時間は PT1H14M15S のようなISO 8601形式で提供されます。
この形式を、時間:分:秒「01:14:15」に変換します。

def convert_duration(iso_duration):
    match = re.match(r'PT(?:(\d+)H)?(?:(\d+)M)?(?:(\d+)S)?', iso_duration)
    hours = int(match.group(1)) if match.group(1) else 0
    minutes = int(match.group(2)) if match.group(2) else 0
    seconds = int(match.group(3)) if match.group(3) else 0
    return f'{hours:02}:{minutes:02}:{seconds:02}'

正規表現を使い、時間(H)、分(M)、秒(S)を抽出。
存在しない場合は 0 を代入。

残りのコードは上記で解説した内容と同じになりますので省きます。

実行結果は以下のようになりました。

まとめ

YouTube APIとPythonを使った動画情報の取得とExcel出力の方法を解説しました。

YouTube APIを活用すれば、動画検索結果を効率的に整理し、分析や共有が簡単になります。再生回数やチャンネル登録者数、再生時間などを一覧でデータ化することで、データ分析を行うことができます。

また、ツールなどに組み込んで、定期的に情報収集するなども考えられます。
YouTube関連の情報収集、ツール作成の際は、積極的に活用していければと思います。