ネオモバ証券をスクレイピングしてポートフォリオを解析

Selenium

2022.06.25

SBIネオモバイル証券のスクレイピングをしてみた

はじめに

SBIネオモバイル証券は1株から株を購入できるため、少額での分散投資をする上で重宝しています。ですが分散投資ではポートフォリオを分析するのが少し面倒です。これまではyahoo financeのポートフォリオに登録してそれをスプレッドシートに貼り付けて...としていましたがおおよそ40種類の株価をスプレッドシートにコピペするのは大変なのでSBIネオモバイル証券のサイトをスクレイピングして業種ごとの評価額を円グラフで表示するプログラムneomoba-graph-generatorを作成しました。


業種別の評価額の割合

ネオモバ円グラフ


pipenvについて

pipenvはPythonのパッケージ管理と仮想環境の構築をするためのツールです。
以下のことができます。

  • .envの読み込み
  • Pipfileに指定されたpackageをまとめてinstall
  • scriptsの実行.
  • 仮想環境の構築

pipenvの基本的な使い方

pipenvで開発をする一連の流れを記します。

プロジェクトの作成

これでPipfileが作成されます。Pipfileはnpmのpackage.jsonに相当するものです。pipenvのあとにpythonのバージョンを指定します。

undefined
$ pipenv --python3.7

パッケージの追加

pandasをinstallした例です。Pipfileにpandasが追加され、依存関係を記録するPipfile.lockが更新されます。

undefined
$ pipenv install pandas

Pipfileのパッケージをまとめてインストール

Pipfileに記載のあるパッケージをまとめて仮想環境にインストールします。インストールされたライブラリはnpmのnode_modulesのようにプロジェクト配下ではなく別の場所に保存されます。

undefined
$ pipenv install

インストールされたライブラリの場所を確認

ライブラリがどこに保存されたかわからないと不安なので以下のようにして確認します。$pipenv --python3.7で作られた仮想環境が作られたことがこれでわかります。

undefined
$ pipenv --venv

仮想環境の実行

$ pipenv runの後に実行コマンドを書くと仮想環境で実行ができます。
毎回python3 ...と書くのが面倒な場合はPipfileのscriptsを設定しましょう。 runの後に設定したコマンドを書くと実行できるので便利です。

undefined
$ pipenv run python3 main.py

コード解説

今回作成したコードはneomoba-graph-generatorにありますが少しだけ解説しておきます。

ネオモバサイトにログイン

Python3
  def login():
    options = ChromeOptions()
    options.add_argument("--window-size=720,1080")
    options.add_argument("--disable-popup-blocking")
    options.add_argument("--headless")

    driver = Chrome(ChromeDriverManager().install(), options=options)

    LOGIN_URL = "https://trade.sbineomobile.co.jp/login"
    driver.get(LOGIN_URL)
    time.sleep(0.5)

    input_name = driver.find_element(By.NAME, "username")
    input_name.send_keys(os.environ['USER_ID'])
    input_pass = driver.find_element(By.NAME, "password")
    input_pass.send_keys(os.environ['PASSWORD'])
    login_btn = driver.find_element(By.ID, "neo-login-btn")
    login_btn.click()

    return driver

上がログインのコードです。.envファイルに書かれたidとpasswordをもとにログインします。前半のoptions.add_argument("--headless")でChromeを裏で立ち上げてwindowを表示しない設定をしています。これをコメントアウトするとchromeが立ち上がってどんな処理をしているのか分かりやすいと思います。
今回はwebdriver_managerというライブラリを使っています。これによってchromeがバージョンアップしてもわざわざそれに対応したwebdriverを手動でinstallする必要がありません。


画面をスクロール

Python3
html = driver.page_source.encode('utf-8')
soup = BeautifulSoup(html, "html.parser")
tables = soup.select('#portfolio-layout > section')
table_length = len(tables)
while True:
    driver.execute_script(
        "document.getElementById('portfolio-foot').scrollIntoView({behavior: 'smooth',block: 'start'});")
    time.sleep(1)
    html = driver.page_source.encode('utf-8')
    soup = BeautifulSoup(html, "html.parser")
    tables = soup.select('#portfolio-layout > section')
    if(table_length == len(tables)):
        break
    table_length = len(tables)

上が画面をスクロールする部分です。
なぜスクロールが必要かというと、ネオモバイル証券のサイトではページ遷移時にはユーザーが持っている株を10種類しかfetchしていないからです。domから取得できる株価の情報が更新されないようになるまでスクロールをし続ける必要があります。



最後に

これで自分のポートフォリオがどの業種に偏っているのかが瞬時に分かるようになりました。 高配当株を中心に買っているため、配当金のグラフなども作りたいのですが配当利回りをどっかのapiから取ってくる必要があるため、配当利回りapiがあれば教えて下さい。


参考サイト

SBIネオモバイル証券のポートフォリオをCSVファイルで取得しよう
Pipenv: 人間のためのPython開発ワークフロー
scrollToが効かない時、代わりに使えるscrollIntoView