pythonで遊ぼうシリーズ!YouTube Data APIを使って人気ランキングを取得してみよう!

pythonで遊ぼう!!YouTube検索編

pythonで遊ぼう!第3弾です!!

今回は、みんな大好きYouTubeの人気ランキングを取得してみようです!!

このシリーズ初となるAPIを使用した実装になります!!

今回使用するYouTube Data APIは、

Google様が簡単にデータを取得したりできるようにと準備してくださったプレゼントみたいなものです!w

これ使って色々面白いことできるので、興味のある方はぜひ調べてみてくださいね!!

APIって他にもtwitterだったり、facebookだったり、LINEだったり、たくさん公開されているものがありますので、今後の記事でもこの中のどれかはでてくるかもです!!

とりあえず今回は、YouTube Data APIを使った人気ランキング取得プログラムを実装していきたいと思います!!

ではレッツゴー!!

実装準備

ローカル環境の設定などが完了していないと上手くいきませんので、初回記事の実装準備を参考にやってみてくださいね!!

では、今回の実装の準備をしていきましょう!!

まずはライブラリのインストールを!と言いたいところなんですが、今回はその前にYouTube Data APIの登録を行っていきます!!

手順に沿って行けば簡単にできるので頑張っていきましょう!!

googleアカウントを持っていることが必須になりますので、お持ちでない方はgoogleアカウントの取得を行ってください!!

YouTube Data API取得手順
  • Cloud Console にアクセス
  • ライブラリ一覧からYouTube Data APIを選択
  • プロジェクトを作成
  • APIを有効化
  • 認証情報を作成
  • APIキーの取得


上記が手順となります!!

より詳しく解説している記事がありましたので、そちらの記事を見ながらAPIキーの取得まで行ってください!!

参考記事:http://piyohiko.webcrow.jp/kids_tube/help/index.html

では、APIキーを取得出来た方はいつものライブラリのインストールしていきましょう!!

コマンドによるライブラリインストール
  • pip3 install –upgrade google-api-python-client

今回は1つだけです!!

APIキーの取得が少し大変ですが、手順に沿えば必ずできるので踏ん張って頑張りましょう!!

実行ファイルなど

では今回もまずは概要ざざっと紹介しちゃいます!!

ディレクトリ構造フォルダファイルの違いに注意してくださいね!)

youtube_search_ranking_for_python(親フォルダ) 
    > src(関連フォルダやファイルを入れておくフォルダ)
        > execute.py(実行ファイル)
        > youtube.py(YouTube Data APIを使用して色々やるファイル)

execute.py

# -*- coding: utf-8 -*-
import sys
from youtube import Youtube

keyword = input('検索キーワードは?')
max_results = input('検索数は?')

Youtube().search(keyword, max_results)

print('検索が完了しました。')
sys.exit()

youtube,py

# -*- coding: utf-8 -*-
import sys
import pprint
from googleapiclient.discovery import build

class Youtube:
    DEVELOPER_KEY = "取得したAPIキー"
    YOUTUBE_API_SERVICE_NAME = "youtube"
    YOUTUBE_API_VERSION = "v3"

    def __init__(self):
        self.youtube = build(self.YOUTUBE_API_SERVICE_NAME,    self.YOUTUBE_API_VERSION, developerKey=self.DEVELOPER_KEY)

        # 検索スクリプト用変数
        self.search_list_part = 'snippet'
        self.search_video_list_part = 'snippet, statistics'
        self.search_list_order = 'viewCount'
        self.search_list_type = 'video'

    def search(self, keyword, max_results):
        search_response = self.youtube.search().list(
            part = self.search_list_part,
            q= keyword,
            maxResults = max_results,
            order = self.search_list_order,
            type = self.search_list_type,
        ).execute()

        video_ids = []
        for search_result in search_response.get("items", []):
            video_ids.append(search_result["id"]["videoId"])

        video_response = self.youtube.videos().list(
            part = self.search_video_list_part,
            id = video_ids
        ).execute()

        videos = {}
        for n, video_result in enumerate(video_response.get("items", []), 1):
            videos[n] = {
                'title' : video_result["snippet"]["title"],
                'viewCount' : video_result["statistics"]["viewCount"],
                'publishedAt' : video_result["snippet"]["publishedAt"],
            }
        
        print("\n検索結果:\n")
        pprint.pprint(videos, indent=4)

以上です!

前回は実行時に引数を用いたと思いますが、今回はinput()を使用した対話形式にしています!!

実行ファイルと処理ファイルとで分けています!部品化ってやつですね!!

ゴールとしては、

指定した検索件数分、指定したキーワードでの閲覧回数順で動画を取得し、タイトル閲覧回数公開日時を出力するです!!

概要はこんな感じでございます!!

以下、実行イメージ動画です!!

コード解説

まずは理解しやすいように処理順序を確認していきましょう!

処理順序
  1. ライブラリのimport
  2. input関数で検索キーワードなど取得
  3. YouTubeへの接続準備
  4. APIを使用して検索
  5. 検索結果表示

ライブラリのimport

今回は2ファイルあるのでそれぞれ見ていきましょう!

execute.py

import sys
from youtube import Youtube

2行目では今回作成したyoutube.pyをYoutubeという名前でimportしています!!

youtube.py

import sys
import pprint
from googleapiclient.discovery import build

実装準備でインストールしたgoogle-api-python-clientをimportしていますね!!

input関数で検索キーワードなど取得

execute.py

keyword = input('検索キーワードは?')
max_results = input('検索数は?')

Youtube().search(keyword, max_results)

まずはinput関数を使って対話形式で検索キーワードを取得します!

それを引数として、youtube.pyのsearch関数を実行しているって感じです!!

YouTubeへの接続準備

youtube.py

    DEVELOPER_KEY = "取得したAPIキー"
    YOUTUBE_API_SERVICE_NAME = "youtube"
    YOUTUBE_API_VERSION = "v3"

    def __init__(self):
        self.youtube = build(self.YOUTUBE_API_SERVICE_NAME, self.YOUTUBE_API_VERSION, developerKey=self.DEVELOPER_KEY)

上記は説明が難しいのですが、APIを使うための準備をしているというか、APIを通すための連絡線を構築しているというか、、、

とりあえず、APIを使えるようにしていると思ってくれたら良いです!!

DEVELOPER_KEY = "取得したAPIキー"

こちらはコメント通り、最初に取得したAPIキーを記載してくださいね!!

APIを使用して検索

youtube.py

    search_response = self.youtube.search().list(
            part = self.search_list_part,
            q= keyword,
            maxResults = max_results,
            order = self.search_list_order,
            type = self.search_list_type,
        ).execute()

        video_ids = []
        for search_result in search_response.get("items", []):
            video_ids.append(search_result["id"]["videoId"])

        video_response = self.youtube.videos().list(
            part = self.search_video_list_part,
            id = video_ids
        ).execute()

長いですねーいやですねー!!でも安心してください!同じような処理を2回やっているだけなので!!

一回目がこれで、

    search_response = self.youtube.search().list(
            part = self.search_list_part,
            q= keyword,
            maxResults = max_results,
            order = self.search_list_order,
            type = self.search_list_type,
        ).execute()

2回目がこれ、

    video_response = self.youtube.videos().list(
            part = self.search_video_list_part,
            id = video_ids
        ).execute()

なぜ2回も検索をかけているかというと、閲覧回数を取得するためには1回目の検索結果で得られる動画ごとのIDが必要だからです!!

よく見ると、

1回目はself.youtube.search().list()

2回目はself.youtube.videos().list()

searchvideosという別の処理をしていますね!!

順序としては、search閲覧回数順(あくまで閲覧回数でソートを掛けてくれるだけで閲覧回数自体は取得できないんです!)で動画の情報を取得

searchで取得した動画ごとのIDを使って、videosを実行することで動画ごとのより詳細な情報を取得しているというわけなんですね!

なので、閲覧回数は別に知りたくないって方は2回目の処理はいらないというわけなんです!

検索結果表示

youtube.py

        videos = {}
        for n, video_result in enumerate(video_response.get("items", []), 1):
            videos[n] = {
                'title' : video_result["snippet"]["title"],
                'viewCount' : video_result["statistics"]["viewCount"],
                'publishedAt' : video_result["snippet"]["publishedAt"],
            }
        
        print("\n検索結果:\n")
        pprint.pprint(videos, indent=4)

最後ですね!

取得した情報をもとに、検索結果として必要な項目を作成し、それをpprint()でいい感じに出力しているという感じです!!

前回のスクレイピングの記事でも出てきたenumurateが今回も出てきましたね!!

こうやって一度使用した関数を違う処理でも使ってみるとすごく勉強になりますよ!

pprintは、配列形式のデータをいい感じに出力してくれるというライブラリです!(めっちゃざっくりですいません…)

まとめ

ここまでお読みいただきありがとうございます!

今回はYouTube Data APIを使った検索プログラムを実装をしていきました!

こんな感じで、APIを上手く使うと簡単にデータを取得できたり、何らかの処理を加えたりできるんです!!

APIは自作することも出来ますから、個人的には好きな分野の技術です!!

pythonで遊ぼうシリーズも今回で3回目!そろそろ違う言語とか使ったシリーズ始めようかなと思っています!!

pythonは最初の環境構築が少し大変だった気がするので、次は環境構築がほぼ必要のないGASを使ったシリーズかなとなんとなく考えていますー!!

自分にとっても勉強になるシリーズなので、これからもじゃんじゃん記事書いていきたいと思います!!

それではみなさん、素敵なYouTube Data APIライフをお送りください〜!!