【バズる動画の探し方】youtubeAPIとpythonで人気動画をCSVで抽出するアプリを作った

youtube

先日駆け出しyoutuberさんから「これから動画投稿を頑張って行きたいんだけど、どんな動画を作ればいいのかわからない」という相談を頂きました。

そこではyoutuberの累計登録者数と累計再生回数を一覧で確認できるサイトがあるのでそこを参考にしてみてはいかが?と回答しましたが、得意な事がない人がyoutubeで成功するにはすでに人気の高い動画ネタを参考に+αするのが近道なんじゃないかと考えました。

そうなると過去にバズった動画の一覧みたいなリストが欲しくなるので、期間指定の出来る再生数ランキングみたいなツールをpythonで作ってみました。当記事は作り方の解説が長いので、すぐに使ってみたい方は目次の「コピペコード」「使い方」辺りから読むと楽しいと思います。

完成したアプリはこんな感じ

アプリの名前はシンプルに「Buzz↗List」としました、コピペコードは当記事の下の方で公開していますんで良かったら使ってみて下さい。

デスクトップアプリ版も作りました

pythonを使えない方や自作している時間が無い方向けに、Buzz↗Listをデスクトップアプリにしてみました。noteの方でダウンロードできますんで必要な方は試してみて下さい。

【動画投稿者へ】フォロワーが少なくても再生数が稼げる動画ネタの探し方|DIYプログラミング|note
動画投稿者の皆さんこんにちは、youtubeのデータをごにょごにょして色んなアプリを作っているスマイルと言います('ω')ノ 先日読者の方から「バズる動画ネタの探し方」に関して質問されまして、そういえばズバッと解決するサービスとかアプリって見た事ないなと思い「Buzz↗List」というアプリを作ってみました。 ...

基本の仕組み

youtubeAPIのsearchメソッドには再生回数の多い順で並び替えるパラメータがあるので、特定の期間内で多くの再生数を叩き出した動画を取得できればそれがバズった動画のリストになるんじゃないかなーっと思ったのがアイデアのスタートでした。

ただし、普通に再生回数の多い順だけで並べてしまうとフォロワーが多く有名なyoutuberの動画で上位が埋め尽くされそうな気がするので、投稿者のチャンネル登録者数も一緒に取得して任意のフォロワー数以下のyoutuberが投稿した動画のみを収集するようにしてみます。

例えば、

動画登録者数経過日数再生回数
a100万人7日間200万再生
b1万人7日間30万再生

こんな2本の動画がある場合、僕はbの方がバズってんじゃないかと思いますが人によってバズりの基準が微妙に違う気がするんで、登録者・投稿日・再生回数をパラメータで指定できるようにして好きな範囲の動画をごっそり取れまっせ!という仕上がりのアプリにしたいです。

レシピ

無料で作るための材料はこちら。

  • googleアカウント
  • youtube API
  • python

全部無料の素材を調理するだけで作れます、プログラミングはマジでコスパの良い趣味。コストっていうかお金を稼ぐ事も出来ちゃうのでぜひチャレンジして下さい。

それぞれの材料の使い方は詳しい記事がたくさんありますんで、下記の補足をクリックして準備しといて下さいな。

作ってみる

記事下にコピペコードを用意しましたんでこれをpythonに貼るだけで動きます。が、それだけだと味気ないのでスクリプトの構造や工夫せざるを得ない部分なども工程別に解説していきます。

行数は短い簡単なスクリプトですが地味にこまごまと工夫している部分もあるので、良かったら読んでみて下さい。

youtubeAPIキーの取得

とりあえずyoutubeAPIを使うためにはAPIキーを用意します、具体的な取得方法は下記の記事で解説していますんでまだ持っていない方は読んでみて下さい。

searchメソッドで動画データを取得

それではyoutubeAPIのsearchメソッドでデータを取得してみます、使用するパラメータは以下らへん。

パラメータ機能備考
order結果の並べ替えviewCountで固定
q検索キーワード(-)で除外検索も可能
regionCode国の指定海外動画とかもとれるように
publishedAfter,Before期間指定よく使いそうな期間のボタンを作っておく?
videoCategoryIdカテゴリ指定YouTubeの動画カテゴリ一覧」参照
channelIdチャンネル指定特定のyoutuberに限定する場合

order以外の値を入力できるようにして取得する動画の条件を細かくフィルタリング出来るように作ります。例えばスクリプトはこんな感じ。

import urllib.request
import urllib.parse
import json

#パラメータ
APIKEY = 'APIキー'
key_word = '魚釣り'
regionCode = 'JP'
publishedAfter = '2022-11-14T00:00:00.000Z'
publishedBefore = '2022-11-22T00:00:00.000Z'
videoCategoryId = ''
channelId = ''

#searchメソッドで動画ID一覧取得
param = {
    'part':'snippet',
    'q':key_word,
    'regionCode':regionCode,
    'maxResults':50,
    'order':'viewcount',
    'publishedAfter':publishedAfter,
    'publishedBefore':publishedBefore,
    'type':'video',
    'channelId':channelId,
    'key':APIKEY
}

#videoCategoryIdはブランクでパラメータを渡すとエラーになるので値がある時のみパラメータ付ける
if not videoCategoryId:
    pass
else:
    param['videoCategoryId'] = videoCategoryId

target_url = 'https://www.googleapis.com/youtube/v3/search?'+urllib.parse.urlencode(param)
print(target_url)
req = urllib.request.Request(target_url)

with urllib.request.urlopen(req) as res:

    search_body = json.load(res)
    print(search_body)

searchメソッドでは「2022/11/14~2022/11/22の間に投稿した魚釣りに関連する動画」を抽出してみます、実行結果はこの通り。

めっちゃ見にくいけどとりあえず取れてるっぽい。

ちなみにyoutubeAPIのリクエストURLは「YouTube Data APIリクエストジェネレーター」で簡単に作れるので、パラメータの付け方が良くわからん方は使ってみて下さい。

そもそもyoutubeAPIの使い方がイマイチわからんという方は下記の記事で解説していますんでどうぞ。

動画の再生回数を取得する

searchメソッドでは動画の再生回数は取得できないので、取得した動画IDをキーにvideoメソッドを叩きデータを補完する必要があります。videoメソッドでは再生回数の他にも再生時間・グッドなど動画ごとの詳しいデータを得られるので、フィルタリングの条件をさらに詳細に詰める事もできますが、今回は再生数を取るだけにしておきます。

スクリプトの続きはこんな感じ。

for item in search_body['items']:
    #video・cnannelメソッド用list作成
    video_list.append(item['id']['videoId'])
    channels_list.append(item['snippet']['channelId'])
    #出力用データに追記
    buzz_lists.append( {'videoId':item['id']['videoId'], 'channelId':item['snippet']['channelId']} )

#videoメソッドで動画情報取得-----------------------------------------------------------------
param = {
    'part':'snippet,statistics',
    'id':",".join(video_list),
    'key':APIKEY
}
target_url = 'https://www.googleapis.com/youtube/v3/videos?'+(urllib.parse.urlencode(param))
req = urllib.request.Request(target_url)
print(target_url)
try:
    with urllib.request.urlopen(req) as res:
        videos_body = json.load(res)

        #出力用データに追記
        v = 0
        for item in videos_body['items']:
            buzz_lists[v]['title'] = item['snippet']['title']
            buzz_lists[v]['description'] = item['snippet']['description']
            buzz_lists[v]['viewCount'] = item['statistics']['viewCount']
            buzz_lists[v]['publishedAt'] = item['snippet']['publishedAt']
            buzz_lists[v]['thumbnails'] = item['snippet']['thumbnails']['high']['url']
            buzz_lists[v]['video_id'] = item['id']
            v += 1

except urllib.error.HTTPError as err:
    print(err)
    break
except urllib.error.URLError as err:
    print(err)
    break

searchメソッドの返り値からvideo_idを抜き出してvideoメソッド用のリクエストURLを作ります。videoメソッドから取得した各値は後でアウトプットする用のbuzz_lists変数に格納しておく感じにしました。

チャンネル登録者数を取得する

単純に動画の再生数でランキングしちゃうとフォロワーの多いチャンネルの動画が上位を占めそうですよね。企画・構成など知名度を除いた要素で人気が出ている動画を探すには、チャンネル登録者数の割に再生数が多い動画を探す必要がありそうです。

こういった動画を探すには検索結果からフォロワーの多いチャンネルを除く必要がありますが、searchメソッドだけではチャンネル登録者数が取得できないので、再生回数と同じようにchannelメソッドを叩いてチャンネルのフォロワー数を取得しデータを補完する必要があります。

スクリプトはこんな感じ。

#channelメソッドで登録者数取得-----------------------------------------------------------------
param = {
    'part':'snippet,statistics',
    'id':",".join(channels_list),
    'key':APIKEY
}
target_url = 'https://www.googleapis.com/youtube/v3/channels?'+(urllib.parse.urlencode(param))
print(target_url)
req = urllib.request.Request(target_url)

try:
    with urllib.request.urlopen(req) as res:
        channels_body = json.load(res)

        #出力用データに追記
        c = 0
        for buzz_list in buzz_lists:
            list_search = [ item for item in channels_body['items'] if item['id'] == buzz_list['channelId'] ]
            buzz_lists[c]['name'] = list_search[0]['snippet']['title']
            buzz_lists[c]['subscriberCount'] = list_search[0]['statistics']['subscriberCount']
            buzz_lists[c]['channel_url'] = 'https://www.youtube.com/channel/'+list_search[0]['id']
            c += 1

except urllib.error.HTTPError as err:
    print(err)
    break
except urllib.error.URLError as err:
    print(err)
    break

ほとんどvideoメソッドでの処理と同じなんですが、channelsメソッドは複数のIDを含めてリクエストした場合なぜかIDの並べた順に値が返って来ない謎のランダムレスポンス仕様になっている事を発見。

帰って来た値を単純にforでbuzz_listsに格納してしまうと順番が狂ってしまうので、buzz_lists側からchannelIdをキーにchannelsメソッドの返り値を検索して回帰的に配列に追加するという回りくどい処理になってしまったのが16-22行目です。

とはいえこれで動画を投稿したチャンネルの登録者数も取得できたので、再生回数とフォロワー数を指定して動画を抽出できるようになりました。ここまで出来ればほぼ仕組みは完成したようなもんです。

さっそく次の条件で動画を取得してフィルタリングのテストをしてみましょう。

  • キーワード = ‘魚釣り’
  • 期間(から)= ‘2022-11-14T00:00:00.000Z’
  • 期間(まで) = ‘2022-11-22T00:00:00.000Z’

上記の条件で取得したデータがこちら。

[
    {'videoId': '6HO4-DlU46A', 'channelId': 'UCKtKKtjaaPKA1Oj8Ldnfsdg', 'viewCount': '207171', 'subscriberCount': '591000'}, 
    {'videoId': 'qMXWSec_1fc', 'channelId': 'UConvFaZ-_3fdb3mLBd20SYA', 'viewCount': '166132', 'subscriberCount': '7700'}, 
    {'videoId': 'zyQww452pjc', 'channelId': 'UCKtKKtjaaPKA1Oj8Ldnfsdg', 'viewCount': '88799', 'subscriberCount': '591000'}, 
    {'videoId': 'BpvbNqCiTD8', 'channelId': 'UCzd4Dnz_fuQSIDTCWo11MaQ', 'viewCount': '37002', 'subscriberCount': '120000'}, 
    {'videoId': '8SZ6cng10O4', 'channelId': 'UCqMDCgp37r-tRNaMGsIDgwA', 'viewCount': '22241', 'subscriberCount': '333000'}, 
    {'videoId': 'nJKlGFfqKow', 'channelId': 'UCumTkkzAHkgeRC0awA-Kk8Q', 'viewCount': '21696', 'subscriberCount': '85600'}, 
    {'videoId': 'VAZ6EQr8FmI', 'channelId': 'UClXp11APoI4hghKb6LI7WNQ', 'viewCount': '8543', 'subscriberCount': '27400'}, 
    {'videoId': 'EK5fv03cbts', 'channelId': 'UCG93OA_iStahnxC2KikSTeQ', 'viewCount': '7704', 'subscriberCount': '33100'}, 
    {'videoId': 'EF1x2gJSRWs', 'channelId': 'UCJjt98MrWsOcwLVHw1RbKeA', 'viewCount': '5184', 'subscriberCount': '308'}, 
    {'videoId': 'HxUveqIefzw', 'channelId': 'UCUZF6S1_6napJQPRtYDsC5w', 'viewCount': '5164', 'subscriberCount': '231'}, 
    {'videoId': 'wf0BLK-G10s', 'channelId': 'UCf5noRUJ0bqtZb3tHiz48og', 'viewCount': '4703', 'subscriberCount': '66200'}, 
    {'videoId': 'jtNL4Xcrxcg', 'channelId': 'UCJjt98MrWsOcwLVHw1RbKeA', 'viewCount': '4341', 'subscriberCount': '308'}, 
    {'videoId': 'FNlJDtZr7Tk', 'channelId': 'UCEc-bYBkAx5T0nl9peYX2Rg', 'viewCount': '3459', 'subscriberCount': '6890'}, 
…省略…
    {'videoId': 'WcKm1L2BuN4', 'channelId': 'UC1kFaGwoW3mjED8jKIHrCcw', 'viewCount': '22', 'subscriberCount': '1160'}, 
    {'videoId': 'WcFSRN0ekAU', 'channelId': 'UC3uzC6QLAaIGFPSJU_gYb8Q', 'viewCount': '0', 'subscriberCount': '198'}
    ]

そして次の条件でフィルタリングして狙った動画がとれるか確認。

  • 再生回数5,000回以上
  • チャンネル登録者数 1,000以下

結果はこちら。

[
    {'videoId': 'EF1x2gJSRWs', 'channelId': 'UCJjt98MrWsOcwLVHw1RbKeA', 'viewCount': '5184', 'subscriberCount': '308'}, 
    {'videoId': 'HxUveqIefzw', 'channelId': 'UCUZF6S1_6napJQPRtYDsC5w', 'viewCount': '5165', 'subscriberCount': '231'}
]

よさそう!サンプルデータの再生数ではバズったと言いにくい規模感ですが、好きなパラメータを入れて納得の基準を探してみて下さい。

取得した動画をフィルタリングしてCSV出力

必要なデータが揃ったので取得した動画データを再生回数と登録者数でフィルタリング出来るようになりました。仕組み的には簡単でフィルタリング用の値を入れた変数とbuzz_list内の再生回数・登録者数をifで比較しているだけです。

ifで条件に一致したレコードの内、CSVに出力する値は「動画タイトル・動画概要欄・再生回数・動画公開日時・サムネURL・動画URL・チャンネル名・チャンネル登録者数・チャンネルURL」くらい揃っていれば色々使えそうかなと思います。

ただし動画URLに関してはAPI上にデータが存在しないっぽいので、video_idに肉付けしてURLを作る必要があります。さらにURLパターンが異なるショート動画と普通の動画が混じっているので、ショート動画の場合は「https://www.youtube.com/shorts/○○○」を、普通の動画の場合は「https://www.youtube.com/watch?v=○○○」の形に動画URLを生成するように工夫したのが7-13行目ですね。

シュート動画ではないvideo_idに「https://www.youtube.com/shorts/○○○」でアクセスすると303で「https://www.youtube.com/watch?v=○○○」にリダイレクトされる仕様になっているので、requestsライブラリ使ってhistoryが存在するか確認する事でショート動画か普通の動画かを判別しています。

#指定した再生回数以上 and 登録者数以下の場合のみCSVに吐く-------------------------------
csv_outputs = []
for buzz_list in buzz_lists:

    if( int(buzz_list['viewCount']) >= viewcount_level and int(buzz_list['subscriberCount']) <= subscribercount_level ):

        #ショート動画の存在チェック
        if not requests.get('https://www.youtube.com/shorts/' + buzz_list['video_id']).history:
            print('ショートよ')
            video_url = 'https://www.youtube.com/shorts/' + buzz_list['video_id']
        else:
            print('ショートじゃなーい')
            video_url = 'https://www.youtube.com/watch?v=' + buzz_list['video_id']

        #CSV出力用
        csv_outputs.append([buzz_list['title'], buzz_list['description'], buzz_list['viewCount'], buzz_list['publishedAt'], buzz_list['thumbnails'], video_url, buzz_list['name'], buzz_list['subscriberCount'], buzz_list['channel_url'] ])
        #ループ数管理用
        buzz_lists_count.append(buzz_list)

#CSV追記
writer.writerows( csv_outputs )

任意の件数収集できるまでループ

ここまでで狙った条件の動画を取得する仕組みまでは出来ましたが、searchメソッドは1回の実行で最大50件までしか取得できない仕様なので、50件中指定した条件の動画がいくつあるかは実行するまで分からない、という状態になっちゃってます。もしかしたら1件もないかもしれない。

バズった動画リストって言うからにはせめて数十件くらいは一覧で見たいですよね。なので、収集したい件数を指定してその件数に達するまで、動画の収集処理をループさせてみました。

該当のスクリプトはこんな感じ。

#無限ループ
while True:

    …省略…

    #条件に合致する動画が必要数集まるまでループ-----------------------------------------
    print(len(buzz_lists_count))
    if( len(buzz_lists_count) >= video_count ):
        break

仕組みは簡単でwhile True:で無限ループ状態にしつつ、条件に合致したレコード数が保存されているbuzz_lists_countと取得件数を指定した値が保存されているvideo_countを比較して、必要数以上動画が集まったらbreakしているだけです。

これで多分スクリプトは完成したので、実際に使ってみます。

はい完成、みんなが見たかったバズった動画リストが吐き出されたんじゃないでしょうか、僕的には結構イメージ通りにできました。

コピペコード

CLIアプリ用のコピペコードを置いておきますんで必要な方は使ってみて下さい。

import urllib.request
import urllib.parse
import requests
import json
import csv
import datetime

#-------↓パラメータ入力↓-------

APIKEY = 'youtubeAPIキー'
key_word = 'ゲーム'
regionCode = 'JP'
publishedAfter = '2022-11-14T00:00:00.000Z'
publishedBefore = '2022-11-22T00:00:00.000Z'
viewcount_level = 0
subscribercount_level = 5000
video_count = 10
videoCategoryId = ''
channelId = ''

#-------↑パラメータ入力↑-------

dt_now = datetime.datetime.now().strftime('%Y%m%d_%H%M%S')
nextPageToken = ''
buzz_lists_count = []
csv_outputs_header = []
csv_outputs_header.append(['title', 'description', 'viewCount', 'publishedAt', 'thumbnail', 'video_url', 'name', 'subscriberCount', 'channel_url'])

#書き込み用CSV開く
with open(dt_now + '_youtube-buzz-list.csv', 'w', newline='', encoding='UTF-8') as f:
    writer = csv.writer(f)
    writer.writerows(csv_outputs_header)

    #無限ループ
    while True:

        buzz_lists = []
        #searchメソッドで動画ID一覧取得
        param = {
            'part':'snippet',
            'q':key_word,
            'regionCode':regionCode,
            'maxResults':50,
            'order':'viewcount',
            'publishedAfter':publishedAfter,
            'publishedBefore':publishedBefore,
            'type':'video',
            'channelId':channelId,
            'pageToken':nextPageToken,
            'key':APIKEY
        }
        #videoCategoryIdはブランクでパラメータを渡すとエラーになるので値がある時のみパラメータ付ける
        if not videoCategoryId:
            pass
        else:
            param['videoCategoryId'] = videoCategoryId

        target_url = 'https://www.googleapis.com/youtube/v3/search?'+urllib.parse.urlencode(param)
        print(target_url)
        req = urllib.request.Request(target_url)
        try:
            with urllib.request.urlopen(req) as res:

                search_body = json.load(res)
                video_list = []
                channels_list = []

                for item in search_body['items']:
                    #videoメソッド用list作成
                    video_list.append(item['id']['videoId'])
                    channels_list.append(item['snippet']['channelId'])
                    #出力用データに追記
                    buzz_lists.append( {'videoId':item['id']['videoId'], 'channelId':item['snippet']['channelId']} )
                    
                #videoメソッドで動画情報取得-----------------------------------------------------------------
                param = {
                    'part':'snippet,statistics',
                    'id':",".join(video_list),
                    'key':APIKEY
                }
                target_url = 'https://www.googleapis.com/youtube/v3/videos?'+(urllib.parse.urlencode(param))
                req = urllib.request.Request(target_url)
                print(target_url)
                try:
                    with urllib.request.urlopen(req) as res:
                        videos_body = json.load(res)

                        #出力用データに追記
                        v = 0
                        for item in videos_body['items']:
                            buzz_lists[v]['title'] = item['snippet']['title']
                            buzz_lists[v]['description'] = item['snippet']['description']
                            buzz_lists[v]['viewCount'] = item['statistics']['viewCount']
                            buzz_lists[v]['publishedAt'] = item['snippet']['publishedAt']
                            buzz_lists[v]['thumbnails'] = item['snippet']['thumbnails']['high']['url']
                            buzz_lists[v]['video_id'] = item['id']
                            v += 1

                except urllib.error.HTTPError as err:
                    print(err)
                    break
                except urllib.error.URLError as err:
                    print(err)
                    break
                    
                #channelメソッドで登録者数取得-----------------------------------------------------------------
                param = {
                    'part':'snippet,statistics',
                    'id':",".join(channels_list),
                    'key':APIKEY
                }
                target_url = 'https://www.googleapis.com/youtube/v3/channels?'+(urllib.parse.urlencode(param))
                print(target_url)
                req = urllib.request.Request(target_url)

                try:
                    with urllib.request.urlopen(req) as res:
                        channels_body = json.load(res)

                        #出力用データに追記
                        c = 0
                        for buzz_list in buzz_lists:
                            list_search = [ item for item in channels_body['items'] if item['id'] == buzz_list['channelId'] ]
                            buzz_lists[c]['name'] = list_search[0]['snippet']['title']
                            buzz_lists[c]['subscriberCount'] = list_search[0]['statistics']['subscriberCount']
                            buzz_lists[c]['channel_url'] = 'https://www.youtube.com/channel/'+list_search[0]['id']
                            c += 1

                except urllib.error.HTTPError as err:
                    print(err)
                    break
                except urllib.error.URLError as err:
                    print(err)
                    break

                #指定した再生回数以上 and 登録者数以下の場合のみCSVに吐く-----------------------------------------
                csv_outputs = []
                for buzz_list in buzz_lists:

                    if( int(buzz_list['viewCount']) >= viewcount_level and int(buzz_list['subscriberCount']) <= subscribercount_level ):

                        #ショート動画の存在チェック
                        if not requests.get('https://www.youtube.com/shorts/' + buzz_list['video_id']).history:
                            print('ショートよ')
                            video_url = 'https://www.youtube.com/shorts/' + buzz_list['video_id']
                        else:
                            print('ショートじゃなーい')
                            video_url = 'https://www.youtube.com/watch?v=' + buzz_list['video_id']

                        #CSV出力用
                        csv_outputs.append([buzz_list['title'], buzz_list['description'], buzz_list['viewCount'], buzz_list['publishedAt'], buzz_list['thumbnails'], video_url, buzz_list['name'], buzz_list['subscriberCount'], buzz_list['channel_url'] ])
                        #ループ数管理用
                        buzz_lists_count.append(buzz_list)

                #CSV追記
                writer.writerows( csv_outputs )

            #条件に合致する動画が必要数集まるまでループ-----------------------------------------
            print(len(buzz_lists_count))
            if( len(buzz_lists_count) >= video_count ):
                break

            #nextPageTokenが表示されなくなったらストップ
            if 'nextPageToken' in search_body:
                nextPageToken = search_body['nextPageToken']
            else:
                break

        except urllib.error.HTTPError as err:
            print(err)
            break
        except urllib.error.URLError as err:
            print(err)
            break

使い方

作業を効率化するために無限ループを採用しています。手順を守らないとyoutubeAPIキーのリソースを1発で消費し切っちゃう事もあるので使い方を必ず確認して下さい。
※youtubeAPIキーの割り当てリソースを増やすにはクォータ数の増加申請がありますので、ゴリゴリ分析・作業したい方は試してみて下さい。

入力可能なパラメータ

10-19行目で指定できるパラメータはこんな感じ。

名称内容備考
APIKEYyoutubeAPIキーYouTube APIを利用するための手順を画像付きで丁寧に解説する
key_wordsearchメソッドの検索用キーワードタイトル・概要欄・チャンネル名など様々な要素と関連性の高い動画を返す
regionCode指定した国での検索結果を返す国コードはalpha-2で指定
publishedAfter動画投稿日時の指定(から)RFC 3339形式のdate-time値で指定する(1970-01-01T00:00:00Z)
publishedBefore動画投稿日時の指定(まで)同上
viewcount_level再生回数の指定入力した値以上の再生回数の動画のみ取得
subscribercount_levelチャンネル登録者の指定入力した値以下のチャンネル登録者の動画のみ取得
video_count取得する動画件数の指定ちょっと多く取得する場合もある
videoCategoryId動画カテゴリの指定YouTubeの動画カテゴリ一覧
channelIdチャンネルIDの指定チャンネルIDの調べ方

これらを組み合わせれば大抵のニーズには対応できるかなと思われます。このパラメータで何をコントロールしているのかは「アプリの作り方」辺りを読むと理解が深まると思います。

リソース消費の節約

上記スクリプトで出力されるyoutubeAPIのレスポンスは再生回数の多い順に並んでいるので、チャンネル登録者数だけ基準を決めて実行するだけで十分良さげな動画リストを取得できます。再生回数の指定は対象となる動画が多過ぎる場合に絞り込む目的で使う感じがいいと思います。

例えば再生回数0回以上・チャンネル登録者数5,000人以下の条件で実行すると、フォロワーが5,000人未満のチャンネルが投稿した動画の内、再生数の多い順に動画データが取得されます。

バズりやすいキーワードの探し方

なぜか知っている人が少ない気がしますが、youtubeで人気の検索キーワードはgoogleトレンドで調べる事ができます。ただし検索回数の実数が表示されているわけではなく、100をmaxとした指標でボリュームの増減を表現しています。

このgoogleトレンドで急上昇している検索キーワードと、当アプリを組み合わせると実際に関連動画がどれくらい再生数を上げているか確認する事が可能ですし、急上昇キーワードに関連する動画がまだ公開されていない場合はお宝発見の可能性大で、ライバルが気付く前にバズるキーワードを独占する可能性すらあるかもしれません。

具体的にはこんな感じでバズりキーワードを調べます。

■ 期間を過去30日間に設定する(30日未満はトピックが表示されないため)

■ 検索クエリをBuzz↗Listにセットして検索ボリュームとライバルを確認(サンプルキーワードはミックスナッツ)

■ 再生数が上がりそうでライバルの少ないキーワードが見つかるまで繰り返す

今回はgoogleトレンドを使いましたが急上昇キーワードが分かればツールは何でもいいです、指定キーワードがyoutube側でバズっているか確認するためにBuzz↗Listが役に立つよねって話です。

上記の様に簡単な手順ですが、やみくもにバズりそうな動画を探し回るよりずっと効率的だと思いますんで、動画ネタを探しているyoutuberさんはぜひ試してみて下さい。

抽出する動画の絞り込み

キーワード検索だとチャンネル名も関連度に含めて動画を収集してしまうので、例えば食材としての「きのこ」に関係する動画が欲しくてもチャンネル名に「きのこ」を含むゲーム実況の動画も入ってきてしまいます。なので、収集対象を限定する方法をご紹介します。

■ 特定のジャンルに限定して動画を収集したい場合は、パラメータの「動画カテゴリ」を指定する事で結果を絞る事が可能です。上記の「きのこ」の例だと料理に関する動画を集めたい場合は、料理動画が含まれる場合が多い「26:ハウツーとスタイル」を指定する事できのこ→料理に関連する動画に限定できます。

■ 上記サンプルのように除外したいチャンネルが明確な場合は「検索キーワード -“チャンネル名”」のように除外検索でチャンネル名を指定する事でもノイズを除去する事が可能です。

■ 最初から参考にしたいyouuberがすでに決まっている場合は、パラメータの「チャンネルID」に収集対象にしたいyoutuberのチャンネルIDを入力する事ができます、チャンネルIDはカンマ区切りで複数入力可能なのでこっちの方が便利な方もいるかもしれません。

まとめ

いかがだったでしょうか、youtuberにとって実用的なアプリが完成したんじゃないかと思います。センスがある人は閃きでコンテンツを量産できるのかもしれませんが、僕ら凡人はコツコツと努力して再現性の高い手順を見つけるしかないのかなと思います。

そんなコツコツ型youtuberの方々にBuzz↗Listが役に立ったら嬉しいですね。人気者目指し頑張ってください(‘ω’)ノ

コメント