ビジネスパーソン・ガジェット置場 empty lot for business

営業や仕事、それに伴う生活を便利に楽にするツール、ガジェットを作ります。既にあるツールも自分用にカスタマイズ。

検索ワードからyoutubeの動画情報を一括で取得する 【python + youtube api】

今回はこんな声に対応するガジェットです。
pythonを動画で勉強したいので一覧が欲しい。視聴回数の多いものから片っ端に視聴し実行してみよう!」
「Youtuberのネタを探したいけど、そのネタどのくらいの視聴回数、いいねがあるのか確認したい!」
f:id:kslabo51:20220226173731p:plain

youtubeの情報一括で取得します

youtubeからタイトル、URL、再生時間、視聴回数、いいね数などをまとめてyoutube APIで取得し一覧にするガジェットです。APIなのでyoutubeのサイトで一つずつ検索することもなく一括で票を取得できます。

f:id:kslabo51:20220226173901p:plain

このガジェットでできることはこちら

  • 検索したいキーワードに関連する動画の情報を取得できます。
  • 再生時間や視聴回数、いいねの数を確認できます。
  • URLも記載しているので直接動画に飛ぶことができます。
  • 視聴回数順に並べていますので一覧で確認できます。

注意点はこちら

  • 今回の設定では、視聴回数が◯◯回以上、いいねが◯◯回以上といった条件はつけていないため、そのような条件をつけるときは別途設定が必要です。
  • 取得数も1ページ目から取得という設定にしていますので、もっとたくさんの動画を設定する際は別途設定が必要です。

評価(自己)

役立ち度   ★★★★(良し)
効率化    ★★★★(良し)
ミス防止   ★★★★(良し)
楽しさ    ★★★★(良し)
操作性    ★★★★(良し)

実行環境

使用環境    csvyoutube Data API
使用言語 python
使用ライブラリ pandas、json、googleapiclient.discovery

今回のコード

# get_youtubeinfo.py


from googleapiclient.discovery import build
import pandas as pd
import json


def main():
    # jsonfileに保存しているapikeyを読み込み
    with open('secret.json', 'r') as f:
        API_KEY = json.load(f)

    # api_kyでyoutube Data APIを呼び出す    
    api_key = API_KEY['API_KEY']
    youtube_search = build('youtube', 'v3', developerKey=api_key) 

    # 今回検索するキーワード
    search_key = 'python'

    # 検索のパラメータ設定
    request_search = youtube_search.search().list(
        q=search_key,
        part='id, snippet',
        type="video",
        maxResults=25)

    # 検索実行
    res = request_search.execute()

    # 検索結果からタイトルとvideoのIDを取得しそれぞれリストに
    titles = []
    ids = []
    for item in res['items']:
        titles.append(item['snippet']['title'])
        ids.append(item['id']['videoId'])

    # タイトルとIDのデータフレームを作成し追加
    data = pd.DataFrame()
    data['タイトル'] = titles
    data['ID'] = ids


    # 各動画ごとに詳細情報取得
    _data = pd.DataFrame()
    for i in ids:
        get_info = youtube_search.videos().list(
            id = i,
            part = 'snippet, contentDetails, statistics'
        ) 
        response = get_info.execute()
        playback_time = response['items'][0]['contentDetails']['duration'].replace('PT', '').replace('H', '時間').replace('M', '分').replace('S', '秒')
        publisthday = response['items'][0]['snippet']['publishedAt'].split('T')[0]
        viewcount = response['items'][0]['statistics']['viewCount']
        likecount = response['items'][0]['statistics']['likeCount']
        d = pd.DataFrame(dict(ID=i, 再生時間=playback_time, 公開日=publisthday, 視聴回数=viewcount, いいね=likecount), index=[0])
        _data = pd.concat([_data, d])

    # 2つのデータフレームをマージ
    detail_data = pd.merge(data, _data, on='ID', how='left')

    #視聴回数といいねを整数にしインでッックスもリセット、視聴回数で並び替え
    detail_data['視聴回数'] = detail_data['視聴回数'].astype(int)
    detail_data['いいね'] = detail_data['いいね'].astype(int)
    detail_data.reset_index(drop=True)
    detail_data = detail_data.sort_values('視聴回数', ascending=False)
    detail_data['ID'] = 'https://www.youtube.com/watch?v=' + detail_data['ID']
    detail_data.rename(columns={'ID': 'URL'})

    # csvで吐き出し
    detail_data.to_csv('youtube_data.csv', index=False)


if __name__ == '__main__':
    main()