😺
PythonからYouTube Data APIを叩いてアップロード済み動画のリストを取得する
YouTube Data API
を使って動画の情報を取得する流れが分かったので、PythonでAPIを叩いてデータを取得します。
前回の記事はこちらです。
今回作成したソースコードはこちらにあります。
実行すると以下のようなデータが取得できます(HIKAKINさんのチャンネルの動画を取得)。
[
{
"id": "OD7wsfblIAU",
"image": "https://i.ytimg.com/vi/OD7wsfblIAU/hqdefault.jpg",
"likes": 21506,
"publishedAt": "2022-03-10T10:30:14Z",
"title": "LINEのボイス付きスタンプ100連発したらYouTuberは怒るか検証w【3.11チャリティー・売上寄付】",
"views": 757197
},
{
"id": "RJKo3bDCBGo",
"image": "https://i.ytimg.com/vi/RJKo3bDCBGo/sddefault.jpg",
"likes": 22632,
"publishedAt": "2022-03-08T11:15:14Z",
"title": "【No.1決定戦】チョコフォンデュタワーに色んなアイス突っ込んでどれが1番合うか試してみたwww",
"views": 1001088
},
{
"id": "5FalwD0yHb0",
"image": "https://i.ytimg.com/vi/5FalwD0yHb0/hqdefault.jpg",
"likes": 23017,
"publishedAt": "2022-03-08T11:14:36Z",
"title": "息継ぎ無しでビートボックス世界最長記録目指した結果… #Shorts",
"views": 546196
},
ポイント
認証
今回はサーバサイドやローカルでの実行を想定してAPIKEYを利用しました。
APIKEIの取得はこちらを参考にしました。
google-api-python-client
Google APIのPython Clientを使います、pip
でインストールしました
service objectの作成
APIを叩くためにservice object
を生成します、以下の例ではDEVELOPER_KEY
は.env
に記載しています。
api_service_name = "youtube"
api_version = "v3"
DEVELOPER_KEY = getenv('DEVELOPER_KEY')
def get_authenticated_service():
return googleapiclient.discovery.build(
api_service_name, api_version, developerKey = DEVELOPER_KEY)
service object
を作成します。
youtube = get_authenticated_service()
プレイリストに含まれる動画のIDを取得
プレイリストに含まれる動画のID(videoId)を取得する部分です。
def get_video_id_in_playlist(playlistId):
video_id_list = []
request = youtube.playlistItems().list(
part="snippet",
maxResults=50,
playlistId=playlistId,
fields="nextPageToken,items/snippet/resourceId/videoId"
)
while request:
response = request.execute()
video_id_list.extend(list(map(lambda item: item["snippet"]["resourceId"]["videoId"], response["items"])))
request = youtube.playlistItems().list_next(request, response)
return video_id_list
- service objectに対して
playlistItems().list()
でプレイリストの情報を取得する -
part
で取得したい情報を指定する、snippet
を指定するとvideoId
が取得できる -
maxResults
は最大で50、それ以上はpaginationが必要 -
playlistId
に取得対象のプレイリストのIDを指定する -
fields
でレスポンスに含まれる情報を絞り込む- レスポンスが速くなるのとquotaの消費が抑えられる
-
playlistItems().list_next(request, response)
で次のページを指すrequest
オブジェクトが取得できる、最後のページになるとNone
が返る
上記のコードでプレイリストに含まれる動画のIDの配列が取得できます
動画の詳細情報を取得する
動画のIDを使って詳細情報を取得します。
def get_video_items(video_id_list):
video_items = []
chunk_list = list(chunks(video_id_list, 50)) # max 50 id per request.
for chunk in chunk_list:
video_ids = ",".join(chunk)
request = youtube.videos().list(
part="snippet,statistics",
id=video_ids,
fields="items(id,snippet(title,description,publishedAt,thumbnails),statistics(viewCount,likeCount))"
)
response = request.execute()
video_items.extend(response["items"])
return video_items
-
list(chunks(video_id_list, 50)) # max 50 id per request.
- 1回のrequestで取得できる動画(ID)が最大50個なので、IDの配列を50個単位に分割します
- chunkに分割するコード
def chunks(lst, n):
"""Yield successive n-sized chunks from lst."""
for i in range(0, len(lst), n):
yield lst[i:i + n]
-
videos().list()
で動画の情報を取得します -
part
にsnippet,statisticsを指定しています、statisticsには再生数
やいいね
が含まれています -
id
に動画のIDを指定します、,
で複数のIDを指定することができますvideo_ids = ",".join(chunk)
-
fields
で取得する情報を指定しています
get_video_items(['OD7wsfblIAU'])
のように実行すると次のようなデータが取得できます
[
{
"id": "OD7wsfblIAU",
"snippet": {
"description": "◆「ヒカキン SMILEスタンプ」はコチラ\nhttps://store.line.me/stickershop/product/25452/ja\n\n◆「3.11 これからも、できること」特設サイト\nhttps://yahoo.jp/TKiGZx\n\n◆「3.11 寄付は、チカラになる。」特設ページ\nhttps://yahoo.jp/ahLQTL\n\n @東海オンエア \n@はじめしゃちょー(hajime) \n@SeikinTV \n@瀬戸弘司 / Koji Seto \n@デカキン Dekakin \n@MasuoTV \n\n◆チャンネル登録はこちら↓\nhttp://www.youtube.com/user/hikakintv?sub_confirmation=1\n\n◆ツイッター\nhttps://twitter.com/hikakin\n\n◆インスタグラム\nhttps://instagram.com/hikakin/\n\n◆TikTok\nhttps://vt.tiktok.com/BTWxUN/\n\n◆ヒカキンゲームズ\nhttp://www.youtube.com/hikakingames\n\n◆ビートボックス動画のHIKAKINチャンネル\nhttp://www.youtube.com/HIKAKIN\n\n◆ラフな動画のHikakinBlog\nhttp://www.youtube.com/hikakinblog\n\n\n◆ヒカキンLINEスタンプはこちら\nhttps://store.line.me/stickershop/product/1022677/ja\n\n\n◆ヒカキンLINE公式アカウント\n●友達登録はこちら↓\nhttp://line.naver.jp/ti/p/%40hikakin\n\n#LINEスタンプ\n#LINE\n#YouTuber",
"publishedAt": "2022-03-10T10:30:14Z",
"thumbnails": {
"default": {
"height": 90,
"url": "https://i.ytimg.com/vi/OD7wsfblIAU/default.jpg",
"width": 120
},
"high": {
"height": 360,
"url": "https://i.ytimg.com/vi/OD7wsfblIAU/hqdefault.jpg",
"width": 480
},
"medium": {
"height": 180,
"url": "https://i.ytimg.com/vi/OD7wsfblIAU/mqdefault.jpg",
"width": 320
}
},
"title": "LINEのボイス付きスタンプ100連発したらYouTuberは怒るか検証w【3.11チャリティー・売上寄付】"
},
"statistics": {
"likeCount": "21917",
"viewCount": "762998"
}
}
]
参考情報
アップロード済み動画
を取得するサンプル
Discussion