この記事でわかること
- マネーフォワードの資産データを、pythonのseleniumライブラリで収集します。
- 私はプログラマではないので、動けば良いという考えです!
Pythonコード | seleniumを利用
’23 4/1追記
二段階認証のボタンのXpathが変わっていました。修正しました。
またget_valuesの関数を使った評価額の取得が出来なくなっていました。
この点を修正し、コード全体の仕様を変更しました(アセットリストの使用を止め、単に表から数値を抽出することにします。)
コード全体1:スクレイピング
このコードによって、マネーフォワードの資産ページまで移動できます。
from selenium import webdriver
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager #追加
from time import sleep
import re
import subprocess
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = "Meiryo" #日本語
EMAIL = ""#認証のメールアドレス
PASSWORD = ""#認証のパスワード
TWO_STEP_AUTHENTICATION_SETTING_CODE = ""#二段階認証のコード
#---実行---
#クロームブラウザを立ち上げ
browser = webdriver.Chrome(ChromeDriverManager().install())
browser.get("https://id.moneyforward.com/sign_in/email")
# マネーフォワードwebpage操作1
# 認証
ele_name = browser.find_element(By.XPATH,
'/html/body/main/div/div/div/div/div[1]/section/form/div[2]/div/input')
ele_name.send_keys(EMAIL)
sleep(3)
ele_login = browser.find_element(By.XPATH,
'/html/body/main/div/div/div/div/div[1]/section/form/div[2]/div/div[3]/input')
ele_login.click()
sleep(3)
elem_password = browser.find_element(By.XPATH,
'/html/body/main/div/div/div/div/div[1]/section/form/div[2]/div/input[2]')
elem_password.send_keys(PASSWORD)
sleep(3)
elem_login2 = browser.find_element(By.XPATH,
' /html/body/main/div/div/div/div/div[1]/section/form/div[2]/div/div[3]/input')
elem_login2.click()
sleep(3)
# マネーフォワードwebpage操作2
#二段階認証
two_step_authentication = ['oathtool', '--totp',
'--base32', TWO_STEP_AUTHENTICATION_SETTING_CODE]
auth_code = re.findall(
r'\d+', subprocess.check_output(two_step_authentication).decode('utf-8'))
elem_auth_number = browser.find_element_by_xpath(
'/html/body/main/div/div/div/section/div[1]/section/form/div[2]/div/div[1]/input')
elem_auth_number.send_keys(auth_code[0])
sleep(3)
elem_auth = browser.find_element_by_xpath(
'/html/body/main/div/div/div/section/div[1]/section/form/div[2]/div/div[2]/button')
elem_auth.click()
sleep(3)
# マネーフォワードwebpage操作3
# アカウント選択ページ
elem_money_forward = browser.find_element_by_xpath(
'/html/body/main/div/div/div/div[1]/div/ul/li/a')
elem_money_forward.click()
sleep(3)
# トップページ
elem_choose_account = browser.find_element_by_xpath(
'/html/body/main/div/div/div/div/div[1]/section/form/div[2]/div/div[2]/input')
elem_choose_account.click()
sleep(3)
# 資産ページ
elem_portfolio = browser.find_element_by_xpath(
'/html/body/div[1]/div[1]/div[1]/header/div[2]/ul/li[4]/a')
elem_portfolio.click()
sleep(3)
コード2:webページの表から数値の抽出
このコードによって、資産ページから数値を抽出できます。
#預金・現金・暗号資産
table_mf = browser.find_element(By.CLASS_NAME, "bs-detail")
trs = table_mf.find_elements(By.TAG_NAME,"tr")
for i in range(1,len(trs)):
list = [x.text for x in trs[i].find_elements(By.TAG_NAME,"td")[:]]
print(list)
#資産の内訳
table_mf = browser.find_element(By.CLASS_NAME, "bs-total-assets")
trs = table_mf.find_elements(By.TAG_NAME,"tr")
for i in range(len(trs)):
list = [x.text for x in trs[i].find_elements(By.TAG_NAME,"td")[:]]
print(list)
#投資信託
table_mf = browser.find_element(By.CLASS_NAME, "margin-top")
trs = table_mf.find_elements(By.TAG_NAME,"tr")
for i in range(1, len(trs)):
list = [x.text for x in trs[i].find_elements(By.TAG_NAME,"td")[:]]
print(list)
解説
ライブラリ(selenium, webdriver_manager)
seleniumとwebdriver_managerが必要ですので、適宜ダウンロードして下さい。
conda install -c conda-forge selenium
conda install -c conda-forge webdriver-manager
二段階認証
二段階認証をMoneyFoward ME 側で設定して下さい。こちらのページが参考になります。
下記にログインに必要な情報を入れて下さい。
EMAIL = ""#認証のメールアドレス
PASSWORD = ""#認証のパスワード
TWO_STEP_AUTHENTICATION_SETTING_CODE = ""#二段階認証のコード
Xpathの調べ方 ’22 8/22追記
スクレイピングに際し、もしパスが変わってしまって困っている方いれば、下記の方法で調べられますよ。
ele_login = browser.find_element(By.XPATH,
‘/html/body/main/div/div/div/div/div[1]/section/form/div[2]/div/div[4]/input‘)
まとめ | マネーフォワードのpythonスクレイピング
Python(seleniumライブラリ)を用いてマネーフォワードに自動ログインし、予め用意したアセットタイプを基に資産リストをデータフレームで作成しました。
一応旧バージョンの文章を残しておきます。
アセットリストの準備
名前からどういう資産なのかを判断するために、リストを作っておきます。
“asset_type_list.csv”という名前でアセットリストを作成して、pythonコードと同じフォルダに置いています。
#アセットタイプリストをロード
asset_type_list = pd.read_csv("asset_type_list.csv")
asset_type_list.csvには「マネーフォワード上で表示される名称」と「アセットタイプ」を示したものを準備します。一字異なるとダメなので、コピペがよいです。
証券会社によって同じ商品でも表示が異なるので、実際に表示されるものを書いて下さい!
私が作った例を下に載せます。
name,asset_type
三菱UFJ国際-eMAXIS Slim 全世界株式(オール・カントリー),stock
SBI-SBI・全世界株式インデックス・ファンド,stock
SBI-SBI・V・全米株式インデックス・ファンド,stock
(Pythonのノートブックを使っている場合ですが、)asset_type_listは下のように表示されればOKです。
資産一覧 (名称、評価額、損益額、アセットタイプ)
マネーフォワードから抽出した資産リスト(変数名df)は、名称、評価額、損益額、アセットタイプが表示されればOKです。asset_type_listに記載したようにasset_typeが表示されることを確認して下さい。他の項目は下記の通りです。
- value_vl ・・・評価額
- value_pl・・・損益額
コメント