YouTube Data API を使ってキーワード検索から動画の再生回数等の情報を取得し,可視化も実装する

YouTube Data API を使ってキーワード検索から動画の再生回数等の情報を取得し,可視化も実装します.

全国630店舗以上!もみほぐし・足つぼ・ハンドリフレ・クイックヘッドのリラクゼーション店【りらくる】

# YouTube Data APとは

YouTubeが提供しているAPIで、動画やチャンネル、再生リストに関わる情報を取得して、自分のWebサイトやアプリケーションで使用することができます。
公式のドキュメントが用意されているので、詳しくはこちらをご覧ください。
https://developers.google.com/youtube/v3/getting-started?hl=ja
引用元:YouTube Data API v3を使用して、YouTubeページと同じリストモジュールを作ってみた (opens new window)

YouTube が提供している API で、動画やチャンネルなど情報を取得して、自分の Web サイトやアプリケーションで使用することができます。
一日あたりのAPI使用量(クォータ)の上限が10000になっているので、注意して使用してください。
引用元:【Python】YouTube Data API を使って、いろんな情報を取得してみた! (opens new window)

# モジュールのインストール

!pip install google-api-python-client

# youtubeの情報を取得(複数の動画)

特定のキーワードで検索かけて,複数の動画の情報を取得します.

最終的には,DataFrameで出力します.

ここでは,以下の情報を取得します.

  • video_id
  • タイトル
  • クレイピング日時
  • 動画の公開日時
  • チャンネルタイトル
  • チャンネルID
  • 概要欄
  • サムネイル

# youtubeの情報をDataFrame形式で取得(前回と一緒)

ここでは,特定キーワードを含むタイトルの動画を再生回数順でDataFrame形式で取得します.

また,任意の動画数分だけ取得できるようにもしています.

import datetime
import pandas as pd
from apiclient.discovery import build

#numに入れた数字×5件の情報を取得
#その他のパラメーターはAPIから情報を取得するパラメータと同じ
# 動画のタイトル等を抜粋()
def get_video_info(part, q, order, type, num):
    dic_list = []
    search_response = youtube.search().list(part=part,q=q,order=order,type=type)
    output = youtube.search().list(part=part,q=q,order=order,type=type).execute()

    #一度に5件しか取得できないため何度も繰り返して実行
    for i in range(num):        
        dic_list = dic_list + output['items']
        search_response = youtube.search().list_next(search_response, output)
        output = search_response.execute()

    df = pd.DataFrame(dic_list)
    #各動画毎に一意のvideoIdを取得
    df1 = pd.DataFrame(list(df['id']))['videoId']
    #各動画毎に一意のvideoIdを取得必要な動画情報だけ取得
    df2 = pd.DataFrame(list(df['snippet']))[['channelTitle','publishedAt','channelId','title','description','thumbnails']]
    
    ddf = pd.concat([df1,df2], axis = 1)
    
    # 日本時刻に修正+9hours
    ddf['publishedAt'] = pd.to_datetime(ddf['publishedAt']) + datetime.timedelta(hours=9)

    return ddf

# 再生回数等の情報を取得

上記のタイトル情報を整理したDataFrameに再生回数等の情報を追記します.

  • 再生回数
  • good数
  • Bad数
  • コメント数
#videoIdを入力することで、その動画の具体的な再生回数やいいね数を取得する関数を作成
def get_statistics(id):
    statistics = youtube.videos().list(part = 'statistics', id = id).execute()['items'][0]['statistics']
    return statistics
def make_video_dataframe(q, order, _type, num):
    # 動画情報の取得
    df_snippet = get_video_info(part='snippet',q=q,order=order,type=_type,num = num)
    # 動画の再生回数等を取得
    df_static = pd.DataFrame(list(df_snippet['videoId'].apply(lambda x : get_statistics(x))))
    
    # データフレームの結合
    df_output = pd.concat([df_snippet,df_static], axis = 1)
    
    # スクレイピング日時を入力
    scrape_date = str(datetime.date.today()).replace('-','')
    df_output['scrape_date'] = scrape_date
    
    return df_output

# コードの実行

以下のコードで実行します.

# 引数
part='snippet'
q = 'ボードゲーム'
order = 'viewCount'
_type = 'video'
num = 10 #Max:75/day->75*5=375本/day

# APIの取得
YOUTUBE_API_KEY = 'AIzaSyCjNsPtyaDBn0_mOW0DbxNhU9BxkCrqPAs'
youtube = build('youtube', 'v3', developerKey=YOUTUBE_API_KEY)

# 情報をデータフレーム形式で取得
df_youtube = make_video_dataframe(q, order, _type, num)
display(df_youtube.head())

# csvに出力
# df_youtube.to_csv('BoardGame_scape.csv', index=False)
videoId channelTitle publishedAt channelId title description thumbnails viewCount likeCount dislikeCount favoriteCount commentCount scrape_date
0 ASusE5qjoAg 東海オンエア 2019-05-31 20:58:15+00:00 UCutJqz56653xV2wwSvut_hQ 【目指せ商品化】文理対抗!ガチンコボードゲーム作り対決! 東海オンエアってもう「チャンネル登録してください」とか「高評価よろしくお願いします」とか言わ... {'default': {'url': 'https://i.ytimg.com/vi/AS... 4936615 127696 1870 0 4431 20210701
1 GzPq9KfVIj8 東海オンエア 2019-06-01 19:40:40+00:00 UCutJqz56653xV2wwSvut_hQ 【理系編】文理対抗!ガチンコボードゲーム作り対決! 語尾が戻ってきました。うれしいです。 「だってばよ」時代は、概要欄も一言くらいにとどめていた... {'default': {'url': 'https://i.ytimg.com/vi/Gz... 4834242 180949 1573 0 5015 20210701
2 SgZzIrugEnU すごろくや公式チャンネル 2019-10-04 00:59:53+00:00 UC-eApqGqN0N_S2s2ARJgt-A すごろくやCM「ボードゲーム、おうちでやろう。」編 Credits: Director : 清水貴栄 (DRAWING AND MANUAL) ... {'default': {'url': 'https://i.ytimg.com/vi/Sg... 2726310 102 12 0 2 20210701
3 BNv7zbORfVM ジャニーズJr.チャンネル 2019-08-07 21:45:00+00:00 UC1cHlPIE-kqiPvpyYz2O8rQ Snow Man 【ボードゲーム】ベストアクトで演技力対決してみた! どうもSnow Manです! 今回はボードゲームをやりまぁす。挑戦したゲームは、演技力が試さ... {'default': {'url': 'https://i.ytimg.com/vi/BN... 2704157 NaN NaN 0 3635 20210701
4 1y4_v6PnsOE Snow Man 2020-05-13 19:30:00+00:00 UCuFPaemAaMR8R5cHzjy23dQ Snow Man「リモートでボードゲームに挑戦」みんな顔が黒くなった! 2年ぶりにあのゲームをやってみました。 しかもリモートスタイルで! するとみんな...とんで... {'default': {'url': 'https://i.ytimg.com/vi/1y... 2428688 NaN NaN 0 8891 20210701

# データフレームの可視化

# 日本語フォントのダウンロード

そのまま可視化すると,日本語が文字化けしてしまうため,以下のコードで日本語フォントのダウンロードを実施します.

日本語用のフォントは以下のURLからダウンロードします.

https://github.com/hirasu1231/matplotlib_japanese/blob/main/ipag.ttf

import os
import pprint
import time
import urllib.error
import urllib.request
import json

def download_file(url, dst_path):
    try:
        with urllib.request.urlopen(url) as web_file:
            data = web_file.read()
            with open(dst_path, mode='wb') as local_file:
                local_file.write(data)
    except urllib.error.URLError as e:
        print(e)
        
# 日本語用のフォントのDL
download_file('https://github.com/hirasu1231/matplotlib_japanese/raw/main/ipag.ttf', 'ipag.ttf')

# データフレームの可視化

下記のコードで日本語設定を反映し,データフレームの可視化を実装します.

pandasでのプロットも実装しています.

import matplotlib
import matplotlib.pyplot as plt
from matplotlib import font_manager

# 日本語のフォント設定
f = "ipag.ttf"
font_manager.fontManager.addfont(f) # フォントの追加
font_name = plt.matplotlib.font_manager.FontProperties(fname = f).get_name() # 追加フォント名
matplotlib.rc('font', family=font_name) # 追加フォントの設定

# データフレームの可視化
df_youtube['viewCount'] = df_youtube['viewCount'].astype(float)
df_youtube.groupby('title').sum().sort_values(by = 'viewCount', ascending = False).plot( kind='bar', y = 'viewCount', figsize = (25,10), fontsize = 20)

# 参考サイト

【Python】YouTube Data API を使って、いろんな情報を取得してみた! (opens new window)

YouTube Data API v3を使用して、YouTubeページと同じリストモジュールを作ってみた (opens new window)

Youtube Data APIを使ってPythonでYoutubeデータを取得する (opens new window)

Search: list | YouTube Data API | Google Developers (opens new window)

全国630店舗以上!もみほぐし・足つぼ・ハンドリフレ・クイックヘッドのリラクゼーション店【りらくる】

YouTube Data API を使ってキーワード検索から動画のタイトル等の情報を取得する

YouTube Data API を使ってキーワード検索から動画のタイトル等の情報を取得する

YouTube Data API を使ってキーワード検索から動画のタイトル等の情報を取得します.

YouTube Data APIから得た情報からサムネイル画像をダウンロードする

YouTube Data APIから得た情報からサムネイル画像をダウンロードする

YouTube Data API を使ってキーワード検索から動画の再生回数等の情報を取得します.