本記事ではPythonでYouTube Data API v3を介して動画を検索する方法について紹介します。 ここ最近のYouTubeの盛り上がりによって多種多様で高品質な動画を無料で楽しむことができるようになってきました。 これらの動画情報をプログラミングで自動的に収集し、閲覧したり分析できるようになると便利ですよね。 そこで実際に動画情報を検索するPythonコードとともに利用例を説明します。 本記事を読むことで、YouTube動画の検索方法、検索対象のフィルタリングに加えて、検索では省略されてしまう概要欄全文の取得方法がわかります。

目次

本記事では以下の環境で動作確認しています。

  • MacOS
  • Python 3.7.3
  • google-api-python-client 1.12.2

YouTube APIキーの発行

  • https://cloud.google.com/consoleを開く
  • 「プロジェクトを選択」で新しいプロジェクトを作成する
  • 「APIとサービス」の「ライブラリ」からYouTube Data API v3を検索する
  • YouTube Data API v3のページでAPIを有効にする
  • 「APIとサービス」の「認証情報」からAPIキーを作成する

YouTube APIキーの確認

  • https://cloud.google.com/consoleを開く
  • 「プロジェクトを選択」でYouTube APIを利用するプロジェクトを選択する
  • 「APIとサービス」の「認証情報」からAPIキーを確認する

google APIのPythonクライアントをインストール

pip install --upgrade google-api-python-client

これでYouTube Data API v3を利用する準備ができました。

キーワード検索

YouTube Data APIでは動画に対するさまざまなアクションが可能です。 その中で、今回は検索に焦点を当てます。

検索ではビデオ、チャンネル、再生リストを対象にキーワードに関連する情報を収集できます。 デフォルトではこれらすべてが検索対象ですが、特定の種類に限定して検索することも可能です。

from apiclient.discovery import build


# Set DEVELOPER_KEY to the API key value from the APIs & auth > Registered apps
# tab of
#   https://cloud.google.com/console
# Please ensure that you have enabled the YouTube Data API for your project.
DEVELOPER_KEY = 'REPLACE_ME'
YOUTUBE_API_SERVICE_NAME = 'youtube'
YOUTUBE_API_VERSION = 'v3'

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

# https://developers.google.com/youtube/v3/docs/search/list?apix=true#try-it
search_response = youtube.search().list(
    part='snippet',  # idも指定可能。idとsnippetの両方を対象にする場合は'id,snippet'と指定する。
    q='筋トレ',
    maxResults=50, # 最大で50件
    order='viewCount',  # date, rating, relevance, title, videoCountも指定可能。
    type='video',  # channel, playlistも指定可能。複数指定する場合はカンマで区切って与える。
).execute()

AND検索、OR検索

AND検索は+を区切り文字としてキーワードを結合します。

search_response = youtube.search().list(
    part='snippet',
    q='筋トレ+肩',
    maxResults=50,
    order='viewCount',
    type='video',
).execute()

OR検索では|を区切り文字としてキーワードを結合します。

search_response = youtube.search().list(
    part='snippet',
    q='筋トレ|肩',
    maxResults=50,
    order='viewCount',
    type='video',
).execute()

AND検索では肩の筋トレに関する動画が検索されますが、OR検索は筋トレもしくは肩に関する動画が対象となるので、香水/瑛人 MV再現 (covered by 瑛肩)が検索されるような違いが出ます。

動画の長さをフィルタリングする

動画の長さを指定してフィルタリングするには以下のようにvideoDurationを指定します。

search_response = youtube.search().list(
    part='snippet',
    q='筋トレ',
    maxResults=50,
    order='viewCount',
    type='video',
    videoDuration='long'  # longは20分以上、mediumは4分以上20分以下、shortは4分未満の動画を検索対象とする。
).execute()

動画の投稿日時をフィルタリングする

動画の投稿日時を基準に動画をフィルタリングするにはpublishedAfterもしくはpublishedBeforerを指定します。 publishedBeforeはその日時以前に投稿された動画、publishedAfterはその日時以降に投稿された動画のみを検索対象とします。

import datetime


day = datetime.date.fromisoformat('2020-09-24')
day = datetime.datetime.strftime(day, '%Y-%m-%dT%H:%M:%S.%fZ')
search_response = youtube.search().list(
    part='snippet',
    q='筋トレ',
    maxResults=50,
    order='viewCount',  # date, rating, relevance, title, videoCount, viewCount
    type='video',
    publishedAfter=day,  # 2020年9月24日0時以降に投稿された動画を検索対象とする。
).execute()

他にも指定可能なパラメータは公式リファレンスに説明があるので、自分が欲しい情報を取得できるかどうか調べたい方はご参照ください。

概要欄全文の取得

上記では検索APIを利用して動画情報を取得する方法を説明しました。

しかしながら、検索APIから取得できる動画の情報の中で、概要欄は長い場合、本文が省略され、末尾が...で終わっていることがあります。 そのため、概要欄全文が欲しい場合は検索APIだけでは対応できません。

概要欄全文を取得するには、以下のようにvideoIdを指定して以下のように動画情報を取得する必要があります。

video_id = 'VIDEO_ID'

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

videoIdはsearch_responseの中に含まれており、search_response['items'][0]['id']['videoId']のように取得できます。

動画を検索するコードと上記のコードを組み合わせることで概要欄全文を取得できるようになります。

おわり

本記事ではPythonを使ったYouTube Data APIの利用方法を紹介しました。 AND、OR検索の他に、動画の長さや投稿日時によるフィルタリング方法を解説しました。 また概要欄全文を取得する方法についても解説しました。

本記事ではYouTubeに投稿される動画の検索を焦点に当てて紹介しましたが、他の機能は以下のページが参考になります。

https://github.com/youtube/api-samples/tree/master/python


関連記事






最近の記事