APIを用いたデータ活用 Python プログラミング

YouTubeチャンネル内の動画一覧取得方法

2023年12月27日

広告

前置き

今回は指定したYouTubeチャンネル内の動画一覧を取得する方法について説明します。
このプロセスを通じて、動画の詳細な情報を収集し、様々な用途に活用することができます。

取得可能な情報

  • 動画のID
  • タイトル
  • 公開日時
  • カテゴリーID
  • 再生時間
  • 動画のタイプ(通常動画またはライブ)
  • 説明文
  • タグ
  • 再生回数
  • いいね数
  • お気に入り数
  • コメント数
  • 動画のURL

他にも取得可能な情報はありますが、基本的な情報は概ね取得できていると思います。

https://developers.google.com/youtube/v3/docs/videos/list?hl=en

チャンネルIDの確認方法

チャンネルIDの確認方法は下記の通りです。

ブラウザでの確認方法

  1. YouTubeにアクセス: ブラウザでYouTubeにアクセスし、興味のあるチャンネルのページに移動します。
  2. URLを確認: チャンネルのホームページのURLを確認します。URLは通常、次の形式のいずれかになります:
    • https://www.youtube.com/channel/[チャンネルID]
    • https://www.youtube.com/c/[カスタムチャンネル名]
    • https://www.youtube.com/user/[ユーザー名]
    この中で「channel/[チャンネルID]」の部分がチャンネルIDです。
  3. カスタムURLの場合: カスタムURL(youtube.com/c/[名前]youtube.com/user/[名前])の場合、チャンネルIDは直接URLには表示されません。この場合、ページのソースコードを表示し、チャンネルIDを探す必要があります。

サンプルコード

Pythonを使ってYouTube APIからこれらの情報を取得するサンプルコードを以下に示します。

import csv
import os
from datetime import datetime
from googleapiclient.discovery import build
import configparser
from tqdm import tqdm

# APIキーとチャンネルIDの取得関数(保存場所によってパスは変わります)
def get_api_key_from_config():
    config = configparser.ConfigParser()
    config.read('C:\xxx\config.ini')  # 実際のパスに置き換えてください
    return config['youtube']['API_KEY']

API_KEY = get_api_key_from_config()
channel_id = 'UCGYAYLDE7TZiiC8U6teciDQ' # 検索したいチャンネルIDを指定

youtube = build('youtube', 'v3', developerKey=API_KEY)

# チャンネル情報の取得
channel_response = youtube.channels().list(id=channel_id, part='snippet,contentDetails').execute()
channel_title = channel_response['items'][0]['snippet']['title']
playlist_id = channel_response['items'][0]['contentDetails']['relatedPlaylists']['uploads']

folder_name = 'youtube_channel'
user_name = "@HakaseFuyuki" #最終的に出力するファイル名につけたいだけなのでなくても問題ありません
file_name = f"youtube_channel_{user_name}_{datetime.now().strftime('%Y%m%d')}.csv"
os.makedirs(folder_name, exist_ok=True)
path = os.path.join(folder_name, file_name)

# CSVファイルへの書き込み
with open(path, mode='w', newline='', encoding='utf-8') as file:
    writer = csv.writer(file)
    writer.writerow(['Video ID', 'Title', 'Published At', 'Category', 'Duration', 'Video Type', 'Description', 'Tags', 'View Count', 'Like Count', 'Favorite Count', 'Comment Count', 'Video URL'])

    next_page_token = None
    while True:
        playlist_response = youtube.playlistItems().list(playlistId=playlist_id, part='snippet', maxResults=50, pageToken=next_page_token).execute()

        for video in tqdm(playlist_response['items']):
            # 動画の詳細情報の取得
            video_id = video['snippet']['resourceId']['videoId']
            video_url = f"https://www.youtube.com/watch?v={video_id}"
            video_details = youtube.videos().list(id=video_id, part='snippet,contentDetails,statistics').execute()['items'][0]

            title = video_details['snippet']['title']
            description = video_details['snippet']['description']
            published_at = video_details['snippet']['publishedAt']
            category_id = video_details['snippet']['categoryId']
            duration = video_details['contentDetails']['duration']
            view_count = video_details['statistics']['viewCount']
            tags = ', '.join(video_details['snippet'].get('tags', []))
            like_count = video_details['statistics'].get('likeCount', '0')
            favorite_count = video_details['statistics'].get('favoriteCount', '0')
            comment_count = video_details['statistics'].get('commentCount', '0')
            video_type = 'Live' if 'liveBroadcastContent' in video_details['snippet'] and video_details['snippet']['liveBroadcastContent'] != 'none' else 'Regular'

            writer.writerow([video_id, title, published_at, category_id, duration,video_type, description, tags,  view_count, like_count, favorite_count, comment_count, video_url])

        next_page_token = playlist_response.get('nextPageToken')
        if not next_page_token:
            break

注意点

  • video_type 列で通常動画 / ライブ動画の判定をしようとしていますが、配信中しか「ライブ」としての判定ができないようです。
  • ライブ配信時の同時接続数などはこのAPIからは取得が難しそうです(取得方法を見つけられていないだけかもしれませんが)
  • 1日の処理可能な量(クオータ上限)が決まっています。デフォルトでは10,000が上限ですが、上記のサンプルの場合は約1,300動画で約1,300消費しています。そのため、同じコードを7回ほど実行すると1日の上限に到達します。

取得した情報を使ってできること

  • 動画分析: 再生回数、いいね数、コメント数などを分析し、人気のコンテンツを特定できます。
  • データベース作成: チャンネル内のすべての動画情報をデータベース化し、簡単にアクセスできます。
  • レポート作成: チャンネルのパフォーマンスに関するレポートを作成します。

まとめ

今回は、YouTubeチャンネル内の全動画の情報の取得方法を紹介しました。
タグや動画説明に関しては未加工のため、これらの情報を活用することでより詳細な分析ができるようになるかもしれません。

-APIを用いたデータ活用, Python, プログラミング