【募集終了案件】YoutubeDataAPIv3を用いてスクレイピング→スプレッドシートに保存

pythonに初めて触れてから約1年が経ちましたので
趣味の競馬ばかりに対してばかりでなく
そろそろ本腰いれて案件をとっていけるように簡単な案件から
経験を積んでいこうと画策中。

↓↓↓今回やらせていただく募集終了済みの案件（ランサーズ様より本文抜粋）↓↓↓

----------------------------------------------------------------------------------
youtube上のキーワード検索した状態で、
指定の条件にある動画のURL、再生回数、登録日付、チャンネル登録者数、タイトルなどの情報を抜き出してスプレッドシートに反映させたい

指定の条件は、再生回数/チャンネル登録者数＝○％以上　・・・a％以上
　　　　　　　○日以内に投稿されたもの　・・・b日以内
　　　　　　　検索キーワード　・・・キーワード'c'
という条件

指摘の検索キーワードで条件に該当する動画をひたすら集めてくる形
キーワードは複数登録可能
キーワードの選定はこちらでやります

----------------------------------------------------------------------------------

環境はanaconda/jupyternotebook/python3でやっていきます。
実際のこちらの作業順序としては
#YoutubeAPIv3の使用申請、キーを取得
#条件a,b,cを取得
（ここでは再生回数/チャンネル登録者数１００％以上、1800日以内
検索キーワード…ものまね　とする）
あらかじめgoogleスプレッドシートのセルにリサーチ希望の
条件a,b,cが書かれているとする
![test_before.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534312/17a9133f-7584-6c0e-331e-730a8c782185.jpeg)

（test.py実行前）

#json形式で動画情報取得、一度pd.Dataframeに格納

```python
import pandas as pd
from googleapiclient.discovery import build

YOUTUBE_API_KEY = 'xxx'

youtube = build('youtube', 'v3', developerKey=YOUTUBE_API_KEY)

part='snippet'
q = import_value_C
order = 'viewCount'
type = 'video'
num = 1 #num*５件を検索

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()

dic_list = []
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']]
df_get = pd.concat([df1,df2], axis = 1)
```

#条件に合わない動画情報をDrop

```python
#指定の条件に絞る
import datetime
#再生回数/チャンネル登録者数＝a％以上(サンプルは１００％以上/変数viewrate)
drop_list = []
for i in range(0,df_output.shape[0]-1,1):
    videoviewcount = int(df_output.iloc[i,6])
    subscriberCount = int(df_output.iloc[i,-1])
    viewrate = round(videoviewcount/subscriberCount * 100,1)
    if viewrate < import_value_A:
        drop_list.append(i)

df_output_percent = df_output.drop(drop_list)
#b日以内に投稿されたもの以外は削除(サンプルは1800日、約6年)

drop_list = []
for j in range(0,df_output_percent.shape[0]-1,1):
    upload_date = df_output_percent.iloc[j,2].split('T')[0].split('-')

    dt1 = datetime.datetime(year=int(upload_date[0]), month=int(upload_date[1]), day=int(upload_date[2]), hour=0)
    dt_dis = int(str(datetime.datetime.now() - dt1).split(" days, ")[0])
    if dt_dis > import_value_B:
        drop_list.append(j)
        
df_output_drop = df_output_percent.drop(drop_list)
```

#条件に合う動画情報のみgoogleスプレッドシートに書き込み

![test_after.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534312/7bd327b1-b442-9a00-914a-125ec08dd0b1.jpeg)
(test.py実行後）

ここまでやって、test.pyを何かしらの方法でクライアントが使用できる形にして
納品となり案件完了ですかね。

またgoogleスプレッドシートに書き込まれたセルの情報をpythonに反映させるのは
①googleスプレッドシートに対して情報取得（googleAPI,スプレッドシートの秘密鍵,スプレッドシートキー取得必要)
②セルの情報を取得（条件a,b,c取得）
という流れになります。

#作成中に参考にしたサイト様
YoutubeAPIv3
https://qiita.com/g-k/items/7c98efe21257afac70e9
googleスプレッドシート読み書き
https://tanuhack.com/operate-spreadsheet/

ご覧いただきありがとうございました。
夏季休暇中にASIN、twitterAPIを使った案件にも触れていきます。