SBI証券口座の資産残高を自動で取得する(python & selenium)〜selenium基礎編〜
資産がいくらあるのかを毎回確認するのはめんどくさい
みなさん、自分の口座においくら入ってますか?? …と問われたときにパッと答えられる人はなかなかいませんし、私も5桁円以下は全く覚えてません。
というか外貨もあるので、レートとか考えなきゃいけません。
めんどいので自動化しましょう。 というのが、今回のエントリ。
Selenium
Webサイトの回帰テストでよく用いられる、Seleniumを使いました。
Selenium実践入門 ―― 自動化による継続的なブラウザテスト (WEB+DB PRESS plus)
- 作者: 伊藤望,戸田広,沖田邦夫,宮田淳平,長谷川淳,清水直樹,Vishal Banthia
- 出版社/メーカー: 技術評論社
- 発売日: 2016/02/02
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (4件) を見る
- 作者: Satya Avasarala,Sky株式会社玉川竜司
- 出版社/メーカー: オライリージャパン
- 発売日: 2014/09/18
- メディア: 大型本
- この商品を含むブログ (5件) を見る
Seleniumとはなんぞや?ってのはググればいくらでも出てくるので割愛ですが、 簡単に言うと人間の操作を自動でやってくれるもので、 スクショとかも勝手に撮らせることもできます。
環境構築
以前はWinマシンを使ってたのですが、 ついこないだmacbook airを買ったばっかりなので、 → kazuhitogo.hateblo.jp
環境を整えるところから…。
pythonとanacondaを使える前提から。
下記をmacのterminalから実行してseleniumのライブラリとchromedriver(chromeをseleniumで動かすためのアプリ)をインストールする。 (一応仮想環境も別途作っておく
# 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サイトが開きます。
ここから ユーザーネームとパスワードを入力して、 ログインボタンを押下したいわけです。
そのためには、人間の操作と同じ通り、下記ステップで行います。
- ユーザーネームテキストボックスを選択
- ユーザーネームを入力
- パスワードテキストボックスを選択
- パスワードを入力
- ログインボタンを押下
幸い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)+ "円")
あとは、この結果をメールとかで飛ばしてもいいですね。 ↓のプログラムを多少改変すればできます。
はじめての株1年生 新・儲かるしくみ損する理由がわかる本 (アスカビジネス)
- 作者: 竹内弘樹
- 出版社/メーカー: 明日香出版社
- 発売日: 2009/12/22
- メディア: 単行本(ソフトカバー)
- 購入: 2人 クリック: 18回
- この商品を含むブログを見る
ざっつおーるせんきゅー