知識の枝

"All is well"

Python Youtube APIを使って動画検索

約69日前 2021年8月20日18:36
デジタル
Python API

改訂履歴


2021/8/20 投稿

1. 背景


Pythonを使った開発中に覚えたことを備忘録として残します。

今回はYoutube APIを使って動画検索する方法を解説します。


2. 目的


Youtube APIの利用方法を簡単に理解する。


3. はじめに


みなさんAPIって聞いたことありますよね?

Application Programming Interface の頭文字をとって「API」です。

「アプリやソフト」 と 「別のプログラム」を簡単につなぐ仕組みのことをこう呼びます。


と言っても訳が分からないと思うので、今回の投稿記事を例に例えます。

アプリ(ウェブアプリケーション)として「Youtube」

プログラムとして「Python」を用います。



みなさんは普段どのようにしてYoutubeの動画を見ていますか?

ブラウザで youtube.com にアクセスし、検索フォームにキーワードを入力して目的の動画を探しますよね?

これが普通のアプリの使い方です。



では例えば「令和最新版」に関する動画の情報を集めたい場合を想定します。

「令和最新版」と検索フォームに入力し、出てきた動画の情報を1つずつ収集してエクセルにまとめるのも良いですが、

情報量が膨大過ぎて一生終わる気がしませんね。。



そんな場合はプログラムを組んで情報を収集するのが効率的です。

Pythonを使ってYoutubeの情報を収集するなら、例えばスクレイピングを使うと効率的に集められそうです。

スクレイピングを行えば、ウェブページの中身を解析して必要な情報を抜き取ることが可能です。


でも待って下さい。

スクレイピングは便利なのですが、サービス提供者の意図しない(望んでいない)利用方法である可能性があります。

機械的に何度もアクセスすることが出来てしまうので、サーバーに余計な負荷が掛かり他のユーザーにまで迷惑を与えるかもしれません。

そんな理由で実際にはスクレイピング(クローリング)を禁止しているサイトも多く見受けられます。


またスクレイピングOKなサイトだったとしても、そのプログラムを書くにはウェブページの構成を分析する必要がありますので、思っていたより手間が掛かります。

手間が掛かる割には、サービス提供者がページ構成を変えたら一気に使い物にならなくなるので、不安定な方法と言わざるをえません。



そこで登場するのが「API」です。

APIは一般的にサービス提供者によって提供されます。

例えばYoutubeのAPIは所有者であるGoogleが提供しています。


上記のようにAPIはサービス提供者によって公開されているオフィシャルな仕組みですので、スクレイピングのように禁止されることはありません。

またAPIは特定のルールに沿って作成されている為、そのルールが変更されない限りは安定的に同じプログラムで情報収集が可能です。



プログラムはそのプログラムのルール通りに動きます。

これはAPIも同じで、

ルールに沿ってプログラムを書けば、ルールに沿って答えが返ってきます。

このルールがあるおかげで、プログラミングとの相性が良いのです。



ここまで聞くとAPIすげー!API使ってみたい!ってなりませんか?

Youtube APIを例に解説していきますので、APIの便利さに触れてみて下さい!



4. APIを使ってみる


4.1 - 前準備


全てのAPIがこの前準備を必要とするわけではありません。

Youtube APIの場合は必要 と思って頂けたら大丈夫です。


Youtube APIを使う場合、「APIキー」と呼ばれる鍵が必要になります。

この鍵が無いとYoutubeの便利なAPIを利用できませんので、まずは取得したいと思います。


APIキーは「Google Cloud Platform」というGoogleのウェブサービス上で発行可能です。

Googleアカウントにログインした状態で Google Cloud Platform にアクセスすると下記のような画面が開きます。




まず初めにプロジェクトを作成する必要があるので、下記手順でササッと作ります。



画面左上の「プロジェクトの選択」をクリックし、「新しいプロジェクト」をクリックします。

ページが移動し、新しいプロジェクトの作成画面になります。

好きなプロジェクト名を付けて、「作成」ボタンをクリックしましょう。



少し待ってプロジェクトが無事作成されると、画面右上に通知が出ます。



通知の「プロジェクトを選択」をクリックしましょう。

プロジェクトページに移動できます。




画面左のナビゲーションメニューを開き、「APIとサービス」>「ライブラリ」をクリックします。



出てきた検索フォームに「youtube data api」と打ち込むと候補に「youtube data api v3」が出てきますので、それを選択しましょう。






「有効にする」をクリックしてAPIを有効にします。





少し待つと下記の画面に飛ばされます。

右上の「認証情報を作成」をクリックし、APIキーを発行します。






APIを選択 → 「YouTube Data API v3」を選択

データの種類 → 「一般公開データ」を選択

作成ボタンをクリック

これでAPIキーが発行されます。



APIキーを確認したいときは、ナビゲーションメニューの「APIとサービス」>「認証情報」をクリック。





もし忘れた場合はこの方法でOKです。


これで前準備が完了しました。



4.2 - Youtube APIを使う


さて、それでは早速PythonでYoutube APIを使ってみましょう!

PythonにはYoutube APIを簡単に扱うことが可能なライブラリが用意されています。

pip installでPython環境にライブラリをインストールしておきます。
pip install google-api-python-client

では動画情報を取得するコードに移ります。

今回は「キーワードを入れたら、関連する動画の動画タイトルを取得する」プログラムを作りたいと思います。
【search_youtube.py】#後で使うのでpyファイルで作成しておきます

from apiclient.discovery import build #先程インストールしたライブラリをインポート

# Youtube API settings
API_KEY = 'AIzaSyBDrgDYjZ6mjxhogehogehoge2rlpHshDk'
YOUTUBE_API_SERVICE_NAME = 'youtube'
YOUTUBE_API_VERSION = 'v3'

youtube = build(
YOUTUBE_API_SERVICE_NAME,
YOUTUBE_API_VERSION,
developerKey=API_KEY
)
APIを使う為の準備を行いました。

「API_KEY」には先程取得したキーを指定します。

その他は上記のままでOKです。

続いて動画を取得する関数を作成します。
# さっきの続き

def get_video_info(keyword):
# search settings
youtube_query = youtube.search().list(
part='id,snippet',
q=keyword,
type='video',
maxResults=5,
order='relevance',
)

# execute()で検索を実行
youtube_response = youtube_query.execute()

# 検索結果を取得し、リターンする
return youtube_response.get('items', [])
検索したいキーワードを引数に与えると、関連度順に動画が5件取得される関数です。

「part」→ 取得したい情報の種類。とりあえず全部取得したければ「"id, snippet"」とすればOKです。

「q」→ 検索したいキーワード。今回は関数の引数を渡す。

「type」→ 検索クエリの対象を絞ります。今回は「video」

「maxResults」→ 検索結果を何件取得するか。今回は5件にしています。最大50です。

「order」→ 検索結果のソート手段です。relevanceは関連度順です。

【orderオプション】
date – リソースを作成日の新しい順に並べます。
rating – リソースを評価の高い順に並べます。
relevance – リソースを検索クエリの関連性が高い順に並べます。このパラメータのデフォルト値です。
title – リソースをタイトルのアルファベット順に並べます。
videoCount – アップロード動画の番号順(降順)にチャンネルを並べます。
viewCount – リソースを再生回数の多い順に並べます。

Data API リファレンス


そしてexecute()で検索が実行されます。


検索結果は「items」という入れ物の中に入っています。

「items」の中には各動画の情報が下記のJSON形式で格納されています。

{
"kind": "youtube#searchResult",
"etag": etag,
"id": {
"kind": string,
"videoId": string,
"channelId": string,
"playlistId": string
},
"snippet": {
"publishedAt": datetime,
"channelId": string,
"title": string,
"description": string,
"thumbnails": {
(key): {
"url": string,
"width": unsigned integer,
"height": unsigned integer
}
},
"channelTitle": string
}
}
今回の場合は上記の構造体が動画5件分入っています。

上記の構造体を見たら何となく分かると思うのですが、動画IDやチャンネルIDなどのID情報が不要であれば、検索設定の「part」はsnippetだけにしても問題ありません。
# 変更前
part='id,snippet',

# ID情報が不要なら
part='snippet',

それではリターンで返ってきたデータから動画の情報を取り出してみましょう。

今回欲しいのは「動画タイトル」です。

動画タイトルは「snippet」>「title」の部分に保存されています。

動画5件の動画タイトルを取得します。
# 先程作った関数を実行
data = get_video_info("令和最新版")

# 取得したデータから5件分の動画タイトルをforループで出力します。
for video in data:
print(video['snippet']['title'])
forループで取り出した個別のデータ:videoはそれぞれが上記で示したJSON構造を持っています。


したがって「title」が欲しい場合は「video」の「sunippet」の「title」という選び方になります。
# video の snippet の title
video['snippet']['title']


試しに動作確認してみます。

アウトプットはこんな感じでした。
from search_youtube import youtube_get_video as yts
>>> data = yts("令和最新版")
>>> for video in data:
... print(video["snippet"]["title"])
...
【令和最新版3700円】100時間使えてIPX7防水!?Tribitの完全ワイヤレスイヤホン「FlyBuds3」が謎すぎて衝撃が強すぎるんだけど…【レビュー,7月20日発売】
Amazonサクラチェッカー危険度90%!星4.8 レビュー数700超えで3Dを超えた6D仕様の謎の完全ワイヤレスイヤホンを試したら衝撃の結果に!【Touch Two C5S】
【令和最新版】予算1735円で超超格安ゲーミングPCを作ってみた!!最新3Dゲームも余裕で遊べちゃう…?!【ジャンク自作PC】
【令和最新版】ウォーターサーバー 比較表【2020】
【令和最新版】UMA・未確認生物が実在する証拠が出まくっている件について。【心霊】【都市伝説】
※簡易確認の為対話モードで実行しています。

あとはみなさんの好きなように情報を取得して下さい。



4.3 - 補足


上記はあくまで一例です。

他にもオプションが色々ありますので、気になる方は公式リファレンスを確認下さい。
リファレンス Search


4.4 - 何が起きてるの?


さっき動かしたプログラムって結局何が起きているの?

という方向けに簡単に説明したいと思います。


プログラムの中で

「検索クエリを作ってexecute()」なんてやっていましたが、やっていることは単純なんです。

ウェブAPIというのは「適切なURL」に「適切なパラメータ」を持ってアクセスすれば「決まった答え」が返ってくる。

ただそれだけなんです。


上記のYoutube APIも同でプログラムの中でURLをコネコネ作ってアクセスしているだけなんです。

ですので、プログラムを書かなくてもブラウザで同じことができます。

下記はURLをブラウザに直接打ち込んだ例です。



「適切なURL」というのがエンドポイントと呼ばれる部分
# エンドポイントURL
https://www.googleapis.com/youtube/v3/search

ここに「適切なパラメータ」をくっつけます。
# 適切なパラメータ
?type=video&part=id,snippet&q=令和最新版&key=AIzaSyBDrgDYjZ6mjxhogehogehoge2rlpHshDk

# くっつけたURL
https://www.googleapis.com/youtube/v3/search?type=video&part=id,snippet&q=令和最新版&key=AIzaSyBDrgDYjZ6mjxhogehogehoge2rlpHshDk

このURLにGETリクエストでアクセスすると誰でも同じ結果が得られます。

※APIキー部分はそれぞれ個人のものを使いましょう
※GETリスエスト・・・ブラウザでURL叩いて開けばそれはGETリクエスト


この「URLを作ってGETリクエストしてJSONデータをもらってくる作業」を簡単にしてくれるのが最初にインストールした「google-api-python-client」ライブラリです。

今回紹介したのはあくまで「検索」だけです。

他にも色々な使い方があり、それを詰め込んで便利に使えるようにしたのが上記のライブラリです。

私も他の機能は使ったことが無いので詳しくは語れませんが。。



5. さいごに


APIについて少しでも理解して頂けましたか?

APIに触れたことが無い方にこの便利さが伝われば良いなと思っています。

お疲れ様でした。