アナリティクス記事 解析方法 記事

【YouTube API #2】YouTube の動画リスト収集してみた

APIの準備コードアナリティクス記事

本サイトでは YouTube Data API v3 をよく使っているので、その使い方を紹介しておきます。

はじめに

広告

想定する読者

プログラミングをあまりしたことがないが、何かコードでしてみたい人。

玄人(エンジニア)など、簡単にコピペして使いたい人

本記事でできること

YouTube で気になるチャンネルの動画リストを API を使って収集してみましょう。

チャンネルの ID を入力として、動画の ID・投稿日・動画のタイトル・概要欄を集めます。

準備と実例


まずは、API を使って通信するための準備を行います。
「API KEY がないよ」って人がいましたら、こちらの記事で作成の方法を解説していますので作成をお願いします。

from apiclient.discovery import build
YOUTUBE_API_SERVICE_NAME = 'youtube'
YOUTUBE_API_VERSION = 'v3'
API_KEY = 'xxxxxxxxxx' # 取得した API キーを記述
youtube = build(
  YOUTUBE_API_SERVICE_NAME,
  YOUTUBE_API_VERSION,
  developerKey=API_KEY
)

チャンネルID とは、YouTubeのサイト内でチャンネルのホーム画面の URL であるhttps://www.youtube.com/channel/UCxxxxxxxx の “UCxxxxxxxx” の部分です。次に情報を見たいチャンネルの ID を使って、以下のコードを実行してください。

pageToken = ""
response = youtube.search().list(
  part = "snippet",
  channelId = "UCxxxxxxxx",
  maxResults = 50, # 一回の問合せの上限値
  order = "date", #日付順にソート
  pageToken = pageToken,
).execute()

中身を見るために一つ目の要素を print してみると、

print(response.get("items", [])[0])

下のような出力になります(動画を特定する情報はマスクしてあります)。

{'kind': 'youtube#searchResult',
  'etag': 'etag',
  'id': {'kind': 'youtube#video', 'videoId': 'videoId'},
  'snippet': {'publishedAt': '動画の投稿日',
  'channelId': 'UCxxxxxxxx',
  'title': '動画のタイトル',
  'description': '概要欄',
  'thumbnails': {'default': {'url': 'thumbnailsのurl',
  'width': 120,
  'height': 90},
  'medium': {'url': 'thumbnailsのurl',
    'width': 320,
    'height': 180},
  'high': {'url': 'thumbnailsのurl',
    'width': 480,
    'height': 360}},
  'channelTitle': 'チャンネル名',
  'liveBroadcastContent': 'none',
  'publishTime': '動画の投稿日'}}

次に ‘id’ 内にある videoId、’snippet’ 内にある投稿日(publishedAt)・動画のタイトル(title)・概要欄(description)を抽出しましょう。動画の情報が取得できていることがわかります。

videoId = []
publishedAt = []
videoTitle = []
description = []
for item in response.get("items", []):
  if item["id"]["kind"] != "youtube#video":
    continue
  videoId = [item["id"]["videoId"]]+videoId
  publishedAt = [item["snippet"]["publishedAt"][:10].replace("-",'/')] + publishedAt
  videoTitle = [item["snippet"]["title"]] + videoTitle
  description = [item["snippet"]["description"]] + description

これで最新50本の動画の情報を収集することができました。

ところが、多くの YouTube チャンネルでは50本以上の投稿がなされています。。。


pageToken の活用


上では紹介した方法では、一回の問い合わせで最大で50件の結果しか得られませんでした。

安心してください。
さらに次の50件を得るために、YouTube Data API v3 では pageToken が用意されています。

pageTokenは response[“nextPageToken”] に入っているので、それを使って最後のページになるまで while ループで回します。

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

videoId = []
publishedAt = []
videoTitle = []
description = []
pageToken=''

while pageToken != None
  response = youtube.search().list(
    part = "snippet",
    channelId = "UCxxxxxxxx",
    maxResults = 50,
    order = "date", #日付順にソート
    pageToken = pageToken,
  ).execute()

for item in response.get("items", []):
  if item["id"]["kind"] != "youtube#video":
    continue
  videoId = [item["id"]["videoId"]]+videoId
  publishedAt = [item["snippet"]["publishedAt"][:10].replace("-",'/')] + publishedAt
  videoTitle = [item["snippet"]["title"]] + videoTitle
  description = [item["snippet"]["description"]] + description

  if "nextPageToken" in response:
    pageToken = response["nextPageToken"]
  else:
    pageToken = None

これで50件以上の動画リストも取れるようになりました!

pageToken でたどることのできるページ数には限界があるようなので、動画投稿数の多いチャンネルの場合は全ての動画を収集できない可能性があります。

そのような場合は日付で区切ってクエリを作ることで、解決が可能です。こちらはリクエストがあれば、また記事にしようと思います。

今回は以上になります。

今後は分析記事で使っているコードの紹介もしていきたいと思っています。

あなたが自分の手でコードを書く助けになれば幸いです。

本サイトでは、YouTube の API を使って得た情報をもとにチャンネル分析を行ったりしていますので、ぜひそちらの記事ものぞいて行ってください。

タイトルとURLをコピーしました