Youtubeの動画の情報を取得する

# youtubeで検索したいキーワードから複数の動画情報を一気にとりだしてみる。

## 事前に必要な準備
- youtube Data APIの登録
　APIの登録とキーを取得する。
　[Google Cloud Platform](https://console.developers.google.com/project)にアクセスしYouTube Data APIを有効化。
　その後、認証情報作成をおこないAPIキーを取得する。

詳しくは、[Youtube Data APIの登録](https://qiita.com/g-k/items/7c98efe21257afac70e9)

## まずは、youtube data apiで動画を検索してみる

一日に調べられるquotaの上限を超えないように注意
```python:kennsaku.py
from apiclient.discovery import build

YOUTUBE_API_KEY = '    '  #ここに取得したキーを入れる
youtube = build('youtube', 'v3', developerKey=YOUTUBE_API_KEY)

search_response = youtube.search().list(
    part='snippet',
    q='pythonスクレイピング',  #ここに調べたいワードを入れる
    order='viewCount',
    type='video',
).execute()

search_response['items'][0]
```

`出力結果`

{'kind': 'youtube#searchResult',
 'etag': 'wN11aWDldiSKtbpeH45z6PiieG8',
 'id': {'kind': 'youtube#video', 'videoId': 'vRFVS_FNLwY'},
 'snippet': {'publishedAt': '2021-04-15T11:15:01Z',
  'channelId': 'UCwhKqH0jDKm5vPOZ7WQ2R1A',
  'title': '【ひろゆき】Pythonについて語るひろゆきまとめ【ひろゆき プログラミング言語 切り抜き】',
  'description': '00:00 おすすめのプログラミング言語 00:05 Pythonイキり 01:20 量子コンピューター向けプログラミング言語 01:26 今Pythonが ...',
  'thumbnails': {'default': {'url': 'https://i.ytimg.com/vi/vRFVS_FNLwY/default.jpg',
    'width': 120,
    'height': 90},
   'medium': {'url': 'https://i.ytimg.com/vi/vRFVS_FNLwY/mqdefault.jpg',
    'width': 320,
    'height': 180},
   'high': {'url': 'https://i.ytimg.com/vi/vRFVS_FNLwY/hqdefault.jpg',
    'width': 480,
    'height': 360}},
  'channelTitle': 'ひろゆきキャリア【切り抜き】',
  'liveBroadcastContent': 'none',
  'publishTime': '2021-04-15T11:15:01Z'}}

こんな感じで、検索結果の最も再生回数の多い動画の情報を取得できた。ひろゆきこんなとこにまでいたんか

ただ、これでは一つしか取得できない、、、

## 一度にたくさんの動画を取得

一度に多数の動画をとりだし、そこから欲しい情報のみ取り出してデータフレームのいれる関数を作成する。
今回は基本的な動画データのほかに再生回数、いいね、コメント数なども取得してみたいのでそれ用のメソッドを後からデータフレームに貼り付けます。
　　
```python:

import pandas as pd

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()
    #何度も繰り返して実行
    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)
    df1 = pd.DataFrame(list(df['id']))['videoId']
    df2 = pd.DataFrame(list(df['snippet']))[
        ['channelTitle', 'publishedAt', 'channelId', 'title', 'description']]
    ddf = pd.concat([df1, df2], axis=1)
    return ddf

df_out = get_video_info(part='snippet',q='pythonスクレイピング',order='viewCount',type='video',num = 10)


def get_statistics(id):
    statistics = youtube.videos().list(part='statistics', id=id).execute()[
        'items'][0]['statistics']
    return statistics

df_static = pd.DataFrame(
    list(df_out['videoId'].apply(lambda x: get_statistics(x))))

df_output = pd.concat([df_out, df_static], axis=1)
df_output
```

`出力結果`
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2637560/11ddc581-0981-9bb2-cc20-6da6f26ccf32.png)

こんな感じでデータフレームに結果を入れることができた。

## 得られたデータの保存
このデータをexcelファイルに保存しておく。
```python:
df_output.to_excel('C:保存したいパス.ファイル名.xlsx')
```

## データの可視化
最後にデータ結果を可視化してどのようなデータが抽出できたか見ておく。

```python:
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'MS Gothic'

df = pd.read_excel('C:パス.xlsx',usecols=[2,7,8],header=0)

df.plot.bar('channelTitle','viewCount',figsize=(12,4))
df.plot.bar('channelTitle','likeCount',figsize=(12,4))
```
`出力結果`

![output_3_bar.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2637560/baa0aaf4-00f9-a82f-05e1-8c594e70bf06.png)

可視化については、もっと有用的なデータの見方を考えていく必要があると感じました。