「手越チャンネル見てたらAWS使いたくなった」

「Win Win Wiiin」を見て書こうとした話とは別なのだけど、忘れないうちにメモ。

あの番組で手越祐也チャンネルのヒストリーをやっていた。私も経緯をリアルタイムで見ていたので、再生回数が落ちた後の話を興味深く聞いた。当時YouTubeをよく知らなくて開設当初の再生回数が凄かった頃、その価値を私は全然わかっていなかった。無人島の2回目3回目の頃は数字の変化に少し気づき「あれ?サムネイルが地味なのかな?連続ものは数値が落ちるのかな?」なんて素人ながら考えていた。でも次の「サロン始めます動画」は予想もしてない方向性に「ええっ」っと驚き、その翌日に「滝行・火渡り」がきたときは「え?」と思った。なんだろう、いわゆる「ずっこける」って感じだろうか。そして「再生数が伸びない」という現象を目の当たりにした。

その頃からちょっと心配になり、手越祐也チャンネル超絶見守りモードに入った。動画がアップされそうな日の夜8時くらいになると何がくるんだろうと気になり、アップされ次第即見る。それから深夜0時くらいまでの4時間の上昇率をチェックし、朝の数値を予想して、目が覚めてからそれを超えているかを確認する。朝起きて8万〜9万、初動も20万くらいだっただろうか(「踊ってみた」以外)。あの頃の動画はテレビのバラエティ味が強いので小学生と安心して見ていたけど、上の子に言わせると「わざわざ見なくても内容がわかる。あーはいはい、てごしが滝行したのね、って感じ」とのことだった。上の子は何十とチャンネル登録をしていて、私みたいにクイズノックと手越チャンネルくらいしか見ていない素人とは違うから、一般視聴者もそんな感じだったのかもと思う。

そこからのコラボ強化への流れは「Win Win Wiiin」で取り上げられていた通りだ。私はいつ頃からか手越くんのチャンネルの「動画の内容と再生数、高評価数、低評価数」を「ユーチュラ」というサイトで見るのが日課になっていた。動画によっては爆発的に伸びたり、びっくりするくらい再生されなかったりするので、「こういう動画を上げるのはどういう意図があるんだろう」と疑問に思ったりもしていたのだけど、番組を見た限り戦略があるようだし、ちゃんと本人が統計情報もコメントも読んでいるんだな、とわかったのでそれならそれでいいか、と思った。そして、その「戦略」を踏まえて、動画の数値をしっかり眺めてみたくなった。

と、ここまでが心情の説明でここからが本題。
(以下手越くん関係ない完全なる作業記録になる)

再生回数を眺めるには「ユーチュラ」は便利なのだが、広告が鬱陶しいし古いデータは残らない。
動画の再生数の増加率を眺めるためにはどうしても自分でデータを持っておくしかない。
そこで検索したところ、以下の記事を見つけた。
10時間くらいでYouTubeチャンネルの再生回数を取得するサーバレスな構築を作ってみた

この記事の何がいいかって「アイカツ」で始まり「アイカツ」で終わるところと、「そもそもなぜこのような構築を作ろうと思ったのか」に「愛です!」とあるところだ。私もこうやってずっと手越くんのチャンネルを見守っているのを「愛です!」と即答するようなまっすぐな人間になりたいものだ。
それに、他に手段はいくらでもあるだろうけど、わざわざアマゾンウエブサービス(AWS)を業務とか関係なく日常のために使うとか、ちょっと憧れる。

さて、最終目標は上の記事にあるようにAWSを使って外部でプログラムを動かしデータを取得するところにおくとして、とりあえず、ローカルのパソコンでデータを取得するプログラムを作ってみることにした。
コードを参考にしたのは以下の記事。

【Python】YouTube Data API v3を利用した特定チャンネルの動画情報取得

先の記事でなくこちらの記事を参考にしたのは、とりあえずすぐ手元で動きそうなもので試したかったのと、手越くんのチャンネルの全動画について情報を取得したかったから。
この記事には「YouTube Data API v3のAPI Keyの取得」についても説明がある。

なお、私の使っているMacBook AirのPythonがデフォルトの2.7だったからか、このプログラムは文字コードの記述を足す必要があった。そもそも私の環境にはこのプログラムで使っているPandasやgoogle-api-python-clientのライブラリを入れるためのpipすら入っていなかったので、easy_installでpipを入れてから各ライブラリをインストールする、という手順も踏んでいる。

ここまでで、自分のパソコンで手動でプログラムを動かして、手越祐也チャンネルの全動画の再生数等をCSV形式で取得することができるようになった。しかし、一定時間に自動でデータを取得しないと意味がない。そこで、プログラムの出力ファイル名に日付と時間を入れるように書き換え、cronを使って1時間に1回のペースで動かしてみることにした。絶対パスで記述するのを忘れていて(プログラム中の出力ファイル名も)そこだけ躓いたけど、1時間に1回自動でデータは取れるようになった。(1日24回動かしたらYouTube Data API v3の割り当てがギリギリな感じ。多分。)

データを取るだけならここまででいいのだけど、どうしても癖でパソコンを終了させてしまうし、最初の感銘を受けた記事を使っていない。
そこで、次のステップとしてAWSを使用して 動かすことに挑戦してみることにした。

私はAWS完全なる初心者でなにもわかっていない。具体的にどういうサービスがあって何ができるのかも全く知らない。無料利用枠がどの程度なのかもわかっていないが、とりあえず一年は無料で使えそうだったのでアカウントをとった。最初の記事を見る限り、AWS Lambdaというものでプログラムを動かすようなので以下の記事を参考にしてLambdaを使ってみることにした。

AWS LambdaをPythonで使ってみた ライブラリの読み込みや環境変数の注意点について解説

この記事はとても初心者に優しかった。これでAWS Lambda上で作ったプログラムをCloudWatchで定期実行する流れのおおよそがわかる。

(ちなみにこの記事はPython3.6で書かれていたので、私もPython3を入れとこうと、何も指定せず入れたら3.9だった。まあ、いいか、と思ったけど、Lambdaランタイムで指定できる最新が3.8だったのでこれをみてpyenvを入れてきりかえた。https://techacademy.jp/magazine/24451

とりあえず、上の記事を見ながら、私がローカルで使っていたプログラムコードをlambda_handler(event, context): の中に差し込む形でlambda_function.pyを作成した。
そして、使っているライブラリ(Pandas等)を同じフォルダにインストールし、zipで圧縮しアップロードしてみてテストしてみた。

あれ?エラーが出る。

どうやらPandasで使っている Numpyが引っかかるらしい。
https://dev.classmethod.jp/articles/serverless-framework-lambda-numpy-scipy/
にもあるのだけど、「Pure Pythonなライブラリじゃない場合、Amazon Linux環境でビルドしたファイルをパッケージングする必要がある」のだそうである。Numpyについては「LambdaのLayer機能を利用することで今回紹介する方法を使わなくても利用できます」とあるのだが、それ使ってもPandas自体に同じ問題があるようで、心が折れかけた。

プログラム修正してPandas使わないことにするべきか、https://qiita.com/thimi0412/items/4c725ec2b26aef59e5bd のようにするべきか悩んでいたところ、以下の記事を見つけた。

AWS LambdaでPython外部ライブラリのLayerを作る前に

一気にPandas問題解決。
なお、google-api-python-clientについては先人の仕事が見当たらなかったので、自分でレイヤを作成した。以下の記事にはImport問題についても書いてあったのでそちらも参考にした。

Python用Google APIクライアントライブラリのImportエラーが発生してしまう問題をなんとかする

(ちなみにこの記事にあるようにフォルダ名を「python」にせず、適当なものにしていたらうまくいかなかった。適当よくない。)

ここまでで、Pandasとgoogle-api-python-clientのレイヤを分けて、コードが編集できるようになったので、あとはLambdaの関数コードデザイン画面でテストをしながら修正をした。最終的に詰まったのは、AWSのストレージS3に書き出す部分。

コードを参考にしたのは以下

AWS Lambda Python でtmpディレクトリにファイル作成してS3にアップロード

S3でデータ保存用のバケットを用意し、この記事にあるコードを参考にして/tmpに保存したファイルをS3の指定バケットに保存するようにしたのだが、パーミッションの問題が出て保存できない。
S3のバケット側で設定するのだと思い込んでいたけど、調べたらLambdaの関数側に実行ロールを与える必要があるとのこと。基本なんですかね。基本なんでしょうね。

Lambda 実行ロールに Amazon S3 バケットへのアクセスを許可するにはどうすればよいですか?

ということで、ここまでで「AWS Lambda上のコードを定期的に動かしAWS S3上に手越祐也チャンネルの全動画のタイトルと再生数と高評価数と低評価数とコメント数をCSV形式で保存する」ことまではできるようになった。最初の記事はLINE通知したり、DB利用したりのステップもあるけど、ここまでで一つ達成した感がある。でもこのままだとファイルが増えていくだけなので、これをどうするかを次の課題に。


ほぼ自分の忘備録を兼ねた作業記録だけど、まあ世の中には、手越くんについて、こんな楽しみ方をしている人もいるよ、ってことで。