こんにちわ、あひるです。
今回は「Money Forward って見やすいけど、この辺が分かりにくいなぁ」「このデータだけ抽出したいなぁ」こういった疑問に答えます。
私はMoney Forwardを3年以上使っており、普段の生活ではアプリに表示されるグラフに満足していますが、「こういう軸で比較したいのに」と思ったことが度々あります。
ならば自分で作ってしまおう!と言うことで、本記事では、「Money Forward」のWebサイトの情報をPythonとLooker Studioを使って抽出し、可視化する方法について紹介します。
全体の流れは以下のようになります。
簡単な流れ
- [Python] Money Forward に自動ログイン
- [Python] 目的のデータをスクレイピング(抽出)
- [Python] データを加工
- [Python] スプレッドシートに書き込み
- [Bi] Looker Studioで可視化
それでわ、Let's go!!
準備
私は以下の環境で実行しています。
Chrome は事前にインストールしておきましょう。
実行環境
- Python 3.8.2
- Webdriver-manager 3.8.3
- gspread 5.7.2
- gspread-dataframe 3.30
- Selenium 4.7.2
Python からGoogleスプレッドシートを操作するには、Google Drive APIとGoogle Sheets APIの準備が必要ですが、今回の記事では主目的ではないので省略します。
外部リンクとなりますが、以下が参考になるかと思います。
Money Forward からのデータ抽出
ログイン後、資産のページに移動して
このテーブル情報を抽出します
コードは以下となります。
User_name, password にユーザーのサインイン情報を記入してください。
Python
user_name = "ログインID"
password="ログインパスワード"
#####
from selenium import webdriver
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options
import pandas as pd
import time
option = Options()
option.add_argument('--incognito')
option.add_experimental_option("excludeSwitches", ["enable-logging"])
driver = webdriver.Chrome(ChromeDriverManager().install(),options=option)
#####
driver.get(r"https://moneyforward.com/users/sign_in")
#driver.maximize_window()
time.sleep(5)
driver.implicitly_wait(10)
e = driver.find_element(By.XPATH,r"/html/body/main/div/div/div/div/div[1]/section/div/div/div[2]/div/a[1]")
e.click()
driver.implicitly_wait(10)
e = driver.find_element(By.XPATH,r"/html/body/main/div/div/div/div/div[1]/section/form/div[2]/div/input")
e.send_keys(user_name)
driver.implicitly_wait(10)
e = driver.find_element(By.XPATH,r"/html/body/main/div/div/div/div/div[1]/section/form/div[2]/div/div[3]")
e.click()
driver.implicitly_wait(10)
e = driver.find_element(By.XPATH,r"/html/body/main/div/div/div/div/div[1]/section/form/div[2]/div/input[2]")
e.send_keys(password)
driver.implicitly_wait(10)
e = driver.find_element(By.XPATH,r"/html/body/main/div/div/div/div/div[1]/section/form/div[2]/div/div[3]/input")
e.click()
driver.implicitly_wait(10)
e = driver.find_element(By.XPATH,r"/html/body/div/div/div/header/div[2]/ul/li[4]/a")
e.click()
url = driver.current_url
fi_table = driver.find_element(By.CSS_SELECTOR, "table.table-mf")
html = fi_table.get_attribute("outerHTML")
dfs = pd.read_html(html)
driver.close()
df = dfs[0]
df
Googleスプレッドシートへの書き込み
コードは以下となります。
key_name, spread_key にGoogle Drive APIとGoogle Sheets APIを記入してください。
Python
import gspread
from google.oauth2 import service_account
from google.auth.transport.requests import AuthorizedSession
key_name = 'ご自身のGoogle Drive API'
spread_key = "ご自身のGoogle Sheets API"
credentials = service_account.Credentials.from_service_account_file(key_name)
scoped_credentials = credentials.with_scopes(
['https://spreadsheets.google.com/feeds',
'https://www.googleapis.com/auth/drive']
)
gc = gspread.Client(auth=scoped_credentials)
gc.session = AuthorizedSession(scoped_credentials)
sheet = gc.open_by_key(spread_key)
print(sheet.title)
workbook = gc.open_by_key(spread_key)
worksheet = workbook.worksheet("加工するページ")
#以下、加工処理のため参考程度
s_df = pd.DataFrame(worksheet.get_all_values())
s_df.columns = s_df.iloc[0]
s_df = s_df.drop(s_df.index[[0]])
s_df = s_df.iloc[:,1:]
#スプレッドシートへ書き込み
from gspread_dataframe import set_with_dataframe
set_with_dataframe(workbook.worksheet("書き込み先のページ"), s_df, include_index=True)
加工処理は他にも行っているのですが、人によって異なると思いますので、大部分は割愛しています。
Looker Studio によるデータ可視化
Google Drive 上のスプレッドシートをデータソースとして選択して、お好みでグラフ化してみてください。
Looker Studio の使い方は機会があれば記事にしてみたいと思います。
まとめ
今回はMoney ForwardのWeb情報をスクレイピングし、Looker Studioで可視化する方法を紹介しました。
最も時間がかかったのはLooker Studioでした。
MicrosoftのPower BIは使い慣れているのですが、Looker Studioはそれよりも使い方にクセがあり、リレーションの組み方やグラフの細かな設定ができないなど、使いにくい印象がありました。
しかし、無料であり、Googleのプラットフォームということで、他のソリューションと親和性が高いというメリットがあるため、慣れるしかないと思っています。
それでわ