家計簿アプリZaimデータの分析・可視化基盤を作った話
この記事のまとめ:
- 家計簿アプリのZaimのデータを分析する基盤を作りましたので概要を説明しています。
背景
我が家の家計簿はZaimで付けているのですが、すべての項目を計算に使いたいわけでないので、細かい分析は手動でやっているのがこれまででした。ただ、クレジット支払いの確定は2ヶ月、3ヶ月くらいかかってしまうため、その度に集計し直すのが面倒でした。
そこで探すとZaim Analysis Platformというものを作られている方がおられたので、それを使ってみようとしたのですが、利用しているパッケージが古かったりしてうまく動かないきませんでした。
そうなったらこのZaim Analysis Platformをベースに自分好みにアレンジしようというのが今回の話です。
リポジトリ
ひとまず今回作ったリポジトリを載せておきます。
実行方法はリポジトリを見ていただければわかると思いますので、本記事では inTheRye/zaim-analysis-platform からの主な変更点について簡単に説明します。
主な変更点
早速ですが何を変更したのかまとめておきます。
1. Airflowのバージョンアップ
タスクスケジューラのApache Airflowについて、Apacheに寄贈される前のAirflowのバージョンが使われておりましたが、現在は既にApache寄贈前の関連パッケージのダウンロードができないようになっていました。
そのため、Apache Airflowにベースイメージとして zhongjiajie/docker-airflow を使用して、AirflowのDockerコンテナを作り変えました。
2. Airflowのアーキテクチャ変更
既存で使われていたAirflowのアーキテクチャが、分散処理用のWorkerであるCeleryが使われていたのですが、Airflowで実行するタスクは zaim.net からの毎日1回だけデータをスクレイピングで取得するだけの単純処理で、同時に複数処理を行うこともないため、Local実行に変更しました。
Apacheのアーキテクチャなどについてはこちらの記事でまとめていますのであまり知らない方はこちらをご参照ください。
Apache Airflow入門 Apache Airflow初心者がAirflowのアーキテクチャを理解し、チュートリアルを動かすまでの手順をまとめています。
3. スクレイピングで使用するSeleniumのブラウザの変更
Airflowで実行するスクレイピングのタスクで使用するSeleniumとブラウザについて、既存で使われていたものはPhantomJSが使われていましたが、こちらは既に非推奨となりサポート外となっておりますので、Chromeに変更しました。
4. Selenium Remote Controlの使用とそれ用のStandaloneサーバーのDockerコンテナの追加
上記のChromeの使用にあたって、AirflowのWorkerノードのコンテナ内にChromeをインストールするのはマイクロサービスの概念からするとあまり筋のいいやり方ではないので、Selenium Standaloneサーバーのコンテナを立ち上げ、WorkerノードからはPythonでリモートでSelenium Standaloneサーバーのブラウザを制御するようにしました。
Selenium Remote Controlの概要についてまとめていますので、ご興味あればご覧ください。
Selenium Remote Control環境をDockerで構築する Seleniumによるブラウザの自動制御を行うサーバーを立ち上げ、リモートで制御するSelenium Remote Control環境をDockerで構築する方法をまとめています。
Dockerで構築したSeleniumサーバーをPythonから制御するサンプルコードを紹介しています。
5. ElasticsearchとKibanaのバージョンアップ
ElasticsearchとKibanaのバージョンを5.5.2から最新の6.6.2にバージョンアップしました。
6. ElasticsearchにZaimのデータをストアするときにドキュメントのインデックスの追加
ここがやりたかったことでもあるのですが、zaim.net からスクレイピングしたデータには、直接的に支払・収入・振替を表す項目がなく、不便だったので新たに “payment_income” のインデックスを追加しました。“payment” (支払)、“income” (収入)、“transfer” (振替)のいずれかの値を取ります。
また、特定期間の情報だけを取ってくるために “year” と “month” のインデックスを追加しました。
システムアーキテクチャ
上記の変更に伴って、システムアーキテクチャは下図のようになっています。基本的にはユーザー側はKibanaとAirflowのWeb UIだけ使えば十分です。
処理の流れ
もともとの処理から大きく変わっていません。もともとの作者のQiitaをご覧ください。 ただ、1点だけ変更しているのは、Elasticsearchへのデータ登録はPythonで行うように変更したので、AirflowのDAGsには1つのタスクしかありません。
- 我が家のZaimデータを描画する基盤を作った
トラブルシューティング
Airflowでのタスクのログの確認
Airflowでエラーが起こっている場合は、まずはログを見ましょう。
Treeを表示します。
タスクを表示します。
ログを表示します。
下は成功ログですが、失敗していたらエラーログが吐き出されていますのでそれをもとにデバッグしましょう。
今回は以上です。 最後まで読んでいただき、ありがとうございます。
関連記事
Pythonでウェブスクレイピング Pythonでウェブスクレイピング(ウェブクローリング)する上で基本的な処理として下記を紹介しています。
コメント
コメントを投稿