スクレイピングで資産管理アプリを自作する方法【Python初心者向けガイド】前編

プログラミング

私のお気に入りの資産管理アプリ「お金のコンパス」がサービス終了してしまいました。

ほかのアプリでは無課金では機能が制限されているものが多く、いっそのことアプリを自作すればいいのではと思いました。

そこでまずは、スクレイピングを利用して銀行口座から残高を取得する方法を紹介します。

動作環境:Windows11 64ビット Python 3.12.0

目次

今回の内容はこんな感じです。

サンプルコードを置いておきます。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import json

with open('file path', 'r') as file: #file pathにはIDとパスワードを書いたファイルのパスを書いてください
  d = json.load(file)

id = d.get('id')
password = d.get('pass')
options = webdriver.ChromeOptions()
# options.add_argument('--headless')
driver = webdriver.Chrome(options = options) #chrome起動
driver.get('https://delta2024.conohawing.com/sample/login.html') #仮のログイン画面のページ
id_window = driver.find_element(By.ID, 'username')
pass_window = driver.find_element(By.ID, 'password')
id_window.send_keys(id)
pass_window.send_keys(password)
login_button = driver.find_element(By.CLASS_NAME, 'login-button')
login_button.send_keys(Keys.RETURN)
value = driver.find_element(By.ID, 'amount')
number = value.text
number = number.replace(',', '')
number = int(number.replace('円', ''))
print(number)

自動ログインするとこんな感じになります(サンプルコードはバックグラウンドで動くのでChromeのウィンドウは開きません)

今回のプログラムを紹介するためにテスト用の仮のログイン画面と銀行口座風の画面を作りました。

ぜひご活用ください。

実際のページはこちら

ユーザー名:user

パスワード:hoge!hoge!

Google Chromeを起動

今回はseleniumというライブラリを使います。

インストールされていない方は以下のようにしてインストールしてください。

pip install selenium

インストールができたら以下のようにたったの2行でGoogle Chromeが起動します。

from selenium import webdriver
driver = webdriver.Chrome()

さらに次のように記述すればそのURLのページを開くことができます。

from selenium import webdriver
driver = webdriver.Chrome()
driver.get('URL') #開きたいWebサイトのURLを記述してください。

ここにログイン画面のURLを書けばOKです。

ChromeのGUI(画面)を使わずに起動する場合はオプションの指定が必要です。

バックグラウンドでプログラムを動かしたい方はheadlessのオプションを指定しましょう。

options = webdriver.ChromeOptions()
options.add_argument('--headless')
driver = webdriver.Chrome(options = options)

ログイン

次は口座にログインします。

やることは2つです。

  1. IDとパスワードを入力する
  2. ログインボタンを押す

IDとパスワードをソースに直接書くのは良くないそうなので、外部のファイルから読み込むことにします。

今回に関して言えばIDとパスワードを読み込むだけなのでファイル形式はtxtでもcsvでも良いと思いますが、私はこんな感じでjsonファイルにしました。

{
  "id":"user",
  "pass":"hoge!hoge!"
}

これをjsonモジュールを使用して読み込みます。

jsonモジュールは標準ライブラリなのでインストールの必要はありません。

idとpasswordにそれぞれIDとパスワードを格納します。

import json

with open('file path', 'r') as file: #file pathにはIDとパスワードを書いたファイルのパスを書いてください
  d = json.load(file)

id = d.get('id')
password = d.get('pass')

開いたログイン画面からIDとパスワードを入力するテキストボックスを探します。

Byモジュールのfind_elementメソッドを使用します。

id_window = driver.find_element(By.ID, 'username')
pass_window = driver.find_element(By.ID, 'password')

要素のidはサイトのソースコードを見てこんな感じで調べてください。

By.IDをBy.CLASS_NAME、By.XPATHとすることでそれぞれの要素をclass、xpathで取得できます。

今回は一旦idで取得しますが、都度適した方法に変えてください。

ここで取得した入力欄にそれぞれIDとパスワードを入力します。

id_window.send_keys(id)
pass_window.send_keys(password)

取得した要素にsend_keys()メソッドを使用して任意の文字や数字を入力します。

入力できたらあとはログインボタンを押すだけです。

login_button = driver.find_element(By.CLASS_NAME, 'login-button')
login_button.send_keys(Keys.RETURN)

まず、先ほど紹介した方法でログインボタンの要素を取得します。

ここで、ログインボタンの要素を押下したいわけですが、操作としてはログインボタンにEnterキーを入力することになります。

send_keys()メソッドの引数に特殊キーと呼ばれるKeys.RETURNを入力すると、その要素に対してEnterキーを入力するという動作ができます。

ちなみに、send_keys(keys.SHIFT,文字列)とするとシフトを押しながら文字列を入力して、send_keys(文字列,keys.Enter)とすると文字列を入力してEnterキーを押すといった処理になります。

残高取得

最後に、銀行口座のページに表示された残高を取得します。

方法としてはログインのときと同様にfind_elementを使用すれば可能です。

更に取得した要素にたいしてtextメソッドを実行すれば、その要素の中身の文字列を取得できます。

value = driver.find_element(By.ID, 'amount')
number = value.text #要素の文字列を取得

これを最終的にグラフにしたいのですが、ここで問題になるのが、文字列に含まれる桁区切りのコンマや円などです。

銀行口座として見る分には見やすくていいのですが、グラフにするには邪魔なので取り除きます。

number = number.replace(',', '') #コンマを消去
number = int(number.replace('円', '')) #円を消去しつつ整数に型変換

文字列に対してreplace()メソッドを使用し、コンマと円を取り除きます。

replace()メソッドは、第一引数に置き換える前の文字、第二引数に置き換えたい文字を書けばよいのですが、”の中に何も書かなければ消去することができます。

ついでに今後のために金額を文字列から整数に型を変換しておきます。

おわりに

今回は銀行口座にログインして口座の残高を取得するところまでやりました。

今回は仮に用意したサイトなのでスムーズにログインできましたが、実際のサイトは読み込み時間の問題や本人確認があったりと面倒な要素が多いので大変でした。

全てのパターンについては解説できないので、今回は最小限の操作のみ紹介させていただきました。

次回は取得した残高をグラフにしてスマホで確認するところまでいきたいと思います。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


コメント

タイトルとURLをコピーしました