SBI証券口座の資産残高を自動で取得する(python & selenium)〜selenium基礎編〜

資産がいくらあるのかを毎回確認するのはめんどくさい

みなさん、自分の口座においくら入ってますか?? …と問われたときにパッと答えられる人はなかなかいませんし、私も5桁円以下は全く覚えてません。

というか外貨もあるので、レートとか考えなきゃいけません。

めんどいので自動化しましょう。 というのが、今回のエントリ。

Selenium

Webサイトの回帰テストでよく用いられる、Seleniumを使いました。

Selenium実践入門 ―― 自動化による継続的なブラウザテスト (WEB+DB PRESS plus)

Selenium実践入門 ―― 自動化による継続的なブラウザテスト (WEB+DB PRESS plus)

実践 Selenium WebDriver

実践 Selenium WebDriver

Seleniumとはなんぞや?ってのはググればいくらでも出てくるので割愛ですが、 簡単に言うと人間の操作を自動でやってくれるもので、 スクショとかも勝手に撮らせることもできます。

環境構築

以前はWinマシンを使ってたのですが、 ついこないだmacbook airを買ったばっかりなので、 → kazuhitogo.hateblo.jp

環境を整えるところから…。

pythonとanacondaを使える前提から。

下記をmacのterminalから実行してseleniumのライブラリとchromedriver(chromeseleniumで動かすためのアプリ)をインストールする。 (一応仮想環境も別途作っておく

# selenium用仮想環境作成
conda create -n selenium python=3.7 anaconda
# selenium用仮想環境起動
conda activate selenium
# seleniumインストール
conda install selenium
# chromedriverインストール
brew cask install chromedriver

…簡単ですね。

さて、ここからはpythonのコード。

# seleniumのWebdriverインポート
from selenium import webdriver

# chrome driverインスタンス生成
driver = webdriver.Chrome()

# URL遷移
driver.get('https://site2.sbisec.co.jp/ETGate/')

これだけでブラウザが起動し、 SBI証券のWebサイトが開きます。

f:id:kazuhitogo:20181125182535p:plain

ここから ユーザーネームとパスワードを入力して、 ログインボタンを押下したいわけです。

そのためには、人間の操作と同じ通り、下記ステップで行います。

  1. ユーザーネームテキストボックスを選択
  2. ユーザーネームを入力
  3. パスワードテキストボックスを選択
  4. パスワードを入力
  5. ログインボタンを押下

幸いSBI証券はユーザーネーム、パスワード、ログインボタン全てにHTMLでIDを振ってくれているので、 IDをたどって選択して、入力&押下しましょう。

IDを知らない人はここらへんを確認ください。

HTMLタグ/共通属性/要素にIDを付ける - TAG index

# ユーザーネームとパスワードを設定
username = "hoge"
password = "hogepass"

# ユーザーネームテキストボックスを選択
user_id = driver.find_element_by_id("user_input")
# ユーザーネームを入力
user_id.find_element_by_name("user_id").send_keys(username)
# パスワードテキストボックスを選択
user_pass = driver.find_element_by_id("password_input")
# パスワードを入力
user_pass.find_element_by_name("user_password").send_keys(password)
# ログインを押下
login = driver.find_element_by_class_name("ov").click()

これでユーザーネームにhoge,パスワードにhogepassを入力してくれます。 ソースコードの中にユーザーネームやパスワードを直書きするのに抵抗があるかたは、 例えばこのソースコードをSBI.pyとしたときに、

python SBI.py hoge hogepass

のようにpython実行時の引数として渡すことも可能です。 そのときはこのように修正するといけます。

# コマンドライン引数を受け取る
import sys
args = sys.argv

# username直打ちをやめる
# username = "hoge"
username = args[1]
# password直打ちをやめる
# password = "hogepass"
password = args[2]

さて、これでログインできたはずです。 私は円建てとドル建ての資産があるので、 それぞれチェックの必要があります。

まずは右上にある「口座管理」のリンクに飛びましょう。

こちらはIDが無いので、xpathでアクセスしましょう xpathを知らない人はこちらを確認ください。

XPathのまとめ、要素の参照方法いろいろ │ Web備忘録

ちなみにxpathを調べるの、ブラウザの開発者ツールとかを使うのもよいのですが、 chrome拡張機能である、「xPath Finder」を使うと便利でした。

xPath Finder - Chrome Web Store

さて、「口座管理」にxpathを使って飛びます。

# 口座管理に遷移
driver.find_element_by_xpath("/html/body/div[1]/div[1]/div[2]/div/ul/li[3]/a/img").click()

これを打つことで飛ぶことができます。

さて、口座管理画面を開くと、もう円建ての資産が表示されています。 (スクショは個人情報満載なので割愛)

ここからxpathを使って、総資産額をとってきましょう。

# 円建ての資産総額を取得
yen_all_asset = float(driver.find_element_by_xpath("/html/body/div[1]/table/tbody/tr/td[1]/table/tbody/tr[2]/td/table[1]/tbody/tr/td/form/table[2]/tbody/tr[1]/td[2]/table[5]/tbody/tr/td[1]/table[3]/tbody/tr[8]/td[2]/div/b").text.replace(',',''))
# 円建ての総額を表示
print(yen_all_asset)

これで円建ての資産がコンソールに表示されます。

xpathで総額が表示されているパスまで行くことができ、 textという変数に要素の中身が格納されているので、それを取得します。

ただし、こちらは文字列形式で格納されているうえ、 カンマがあってそのままじゃ数値型にキャストできないため、 replaceメソッドでカンマを除去した上、 float型にキャストしています。

さて、同様にドル建ての資産に行きましょう。

「口座(外貨建)」と書かれたリンクに飛べばよいので、 同様にxpathで遷移し、そこに書かれた総額を取得します。

# 口座(外貨建)に遷移
driver.find_element_by_xpath("/html/body/div[1]/div[3]/div/div/ul/li[2]/div").click()

# ドル建ての資産総額を取得
doller_all_asset = float(driver.find_element_by_xpath("/html/body/div[1]/table[2]/tbody/tr/td[1]/table/tbody/tr/td[2]/table[2]/tbody/tr[1]/td[2]/table[5]/tbody/tr/td[1]/table[3]/tbody/tr[2]/td[3]/table/tbody/tr[2]/td[2]/b").text.replace(',',''))
# ドル建ての総額を表示
print(doller_all_asset)

これでドル建ての資産が表示されます。

最後にchromedriverを閉じましょう。 (閉じないとログインしっぱなしの画面が残ることに) また、合計額も併せて表示しておきましょう。

# 閉じる
driver.close()

# summary
print("円建資産: " + str(yen_all_asset) + "円")
print("ドル資産建: " + str(doller_all_asset) + "円")
print("総額:" + str(yen_all_asset + doller_all_asset)+ "円")

これで完了です。

一応最後にまとめておきます。

from selenium import webdriver
import sys

args = sys.argv

#ログインID、パスワードはコマンドライン引数から
username = args[1]
password = args[2]

# chrome driverインスタンス生成
driver = webdriver.Chrome()

# URL遷移
driver.get('https://site2.sbisec.co.jp/ETGate/')

# user_idを入力する場所探索
user_id = driver.find_element_by_id("user_input")
user_id.find_element_by_name("user_id").send_keys(username)
user_pass = driver.find_element_by_id("password_input")
user_pass.find_element_by_name("user_password").send_keys(password)
login = driver.find_element_by_class_name("ov").click()

# 口座管理に遷移
driver.find_element_by_xpath("/html/body/div[1]/div[1]/div[2]/div/ul/li[3]/a/img").click()

# 円
yen_all_asset = float(driver.find_element_by_xpath("/html/body/div[1]/table/tbody/tr/td[1]/table/tbody/tr[2]/td/table[1]/tbody/tr/td/form/table[2]/tbody/tr[1]/td[2]/table[5]/tbody/tr/td[1]/table[3]/tbody/tr[8]/td[2]/div/b").text.replace(',',''))

# 口座(外貨建)に遷移
driver.find_element_by_xpath("/html/body/div[1]/div[3]/div/div/ul/li[2]/div").click()

# ドル建ての資産総額を取得
doller_all_asset = float(driver.find_element_by_xpath("/html/body/div[1]/table[2]/tbody/tr/td[1]/table/tbody/tr/td[2]/table[2]/tbody/tr[1]/td[2]/table[5]/tbody/tr/td[1]/table[3]/tbody/tr[2]/td[3]/table/tbody/tr[2]/td[2]/b").text.replace(',',''))

driver.close()

print("円建資産: " + str(yen_all_asset) + "円")
print("ドル資産建: " + str(doller_all_asset) + "円")
print("総額:" + str(yen_all_asset + doller_all_asset)+ "円")

あとは、この結果をメールとかで飛ばしてもいいですね。 ↓のプログラムを多少改変すればできます。

kazuhitogo.hateblo.jp

はじめての株1年生 新・儲かるしくみ損する理由がわかる本 (アスカビジネス)

はじめての株1年生 新・儲かるしくみ損する理由がわかる本 (アスカビジネス)

  • 作者: 竹内弘樹
  • 出版社/メーカー: 明日香出版社
  • 発売日: 2009/12/22
  • メディア: 単行本(ソフトカバー)
  • 購入: 2人 クリック: 18回
  • この商品を含むブログを見る

ざっつおーるせんきゅー