SMBC日興証券の注文中リストをPythonでCSVとして取り込む

スポンサーリンク

PythonのスクレイピングでSMBC日興証券の注文中リストをCSVに出力できるようにしました。

優待クロスをしていると注文を繰り返すことになるので便利に使えています。

スポンサーリンク

取り込みイメージ

SMBC日興証券にログイン後、信用取引の注文中画面を整形してCSVに書き出しています。

取得元ページは信用取引→注文約定一覧・取消・訂正→状態:注文中、注文済…で絞り込んだページです。

「注文中」が2ページ以上に渡っている場合、2ページ以降は取得できないので注意してください!(注文数がどれだけあれば2ページ以上になるんでしょうか?検証できなかったため、致命的な仕様ですみません)

参考HP

SBIでスクレイピングされているこちらのサイトを大いに参考にさせていただきました。

SBI証券のポートフォリオ情報をPythonでスクレイピング
SBI証券のポートフォリオをPythonのseleniumを利用して、webスクレイピングで実装しました。毎回ログインして記録していくのは大変ですが、スクレイピングをすれば一気に取得できます。AWSのLambdaに乗せて、dailyでデータ

コード

ライブラリのインストール

import sys
import time
import datetime
from selenium import webdriver
from selenium.webdriver.support.ui import Select
import pandas
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
import csv

SMBC日興証券にログイン

SMBC日興証券のHPを開き支店コード、口座番号、パスワードを入力しログインします。
支店コード等は後述で入力欄を設けています。

「chromedriverのフルパス」はchromedriver.exeの保存先のフルパスを入力します。

def connect_smbc(SHITEN,KOUZA,PASSWORD,name):
    options = Options()
    # ヘッドレスモード(chromeを表示させないモード)
    options.add_argument('--headless')
    driver = webdriver.Chrome(options=options, executable_path='chromedriverのフルパス')


    # SMBC日興のトップ画面を開く
    driver.get("https://trade.smbcnikko.co.jp/Login/0/login/ipan_web/hyoji/")
    

    input_shiten = driver.find_element_by_name("koza1")
    input_kouza= driver.find_element_by_name("koza2")
    input_password = driver.find_element_by_name("passwd")
    btn_login = driver.find_element_by_name("logIn")
     
    input_shiten.send_keys(SHITEN)
    input_kouza.send_keys(KOUZA)
    input_password.send_keys(PASSWORD)
    driver.find_element_by_name("logIn").click()


    return driver

注文中ページを選択し、テーブルを整形

ログイン後、お取引→信用取引の「注文約定一覧・取消・訂正」→状態プルダウンから「注文中、注文済、訂正中、訂正済、翌発待、取消中」を選択→絞込

注文約定一覧・取消・訂正の指定

「注文約定一覧・取消・訂正」は2つあります。
今回は信用取引の「注文約定一覧…」を参考にしたいため、テキスト検索して[1]としています。

Beautifulsoupではテーブルを指定しきれなかったためdf_chumon[5]と番号で指定しています。また、一旦df_chumon.to_csv(“chumonichiran.csv”)でcsv出力して確認しています。

def get_chumon_data(driver):
    # 取引ボタン
    driver.find_element_by_xpath("/html/body/div[2]/table[1]/tbody/tr/td[3]/a/img").click()

    time.sleep(1)

    # 注文約定一覧
    driver.find_elements_by_link_text("注文約定一覧・取消・訂正")[1].click()

    time.sleep(1)
    # 「注文中、注文済、訂正中、訂正済。翌発待、取消中」状態を選択
    element = driver.find_element_by_xpath("/html/body/table[1]/tbody/tr/td[2]/div[1]/div[2]/table/tbody/tr/td/div[4]/form/div/table/tbody/tr/td/table/tbody/tr[2]/td[8]/select")
    select_element = Select(element)
    select_element.select_by_index(2)    

    time.sleep(1)
    driver.find_element_by_xpath("//*[@id=\"printzone\"]/div[2]/table/tbody/tr/td/div[4]/form/div/table/tbody/tr/td/table/tbody/tr[2]/td[10]/input").click()

    time.sleep(1)
    # 文字コードをUTF-8に変換
    html = driver.page_source.encode('utf-8')
    # BeautifulSoupでパース
    soup = BeautifulSoup(html, "html.parser")
    # テーブルを指定
    chumon = soup.findAll("table",width="650") 

    df_chumon = pandas.read_html(str(chumon))

    # df_chumonは見つかったテーブルの5番目
    df_chumon=df_chumon[5]
    df_chumon.to_csv("chumonichiran.csv")


    # テーブルの整理

    # 1列目をコードと名前に分割
    df_chumoncord=df_chumon[0].str.split('/東', expand=True)
    #銘柄名の()を削除
    df_chumonmeigara=df_chumoncord[1].str.strip("\(\)")
    df_joutai=df_chumon[6]
    # 4列目区分期限を分割
    df_kubun=df_chumon[2].str.split('  ', expand=True)
    #2列目の売買に「信用建玉」を追加
    df_chumonbaibai="信用"+df_chumon[1]+df_kubun[0]+df_joutai
    # 3列目を数量と単価に分割
    df_chumonsuryo = df_chumon[3].str.split('  ', expand=True)
    # 5列目を期間指定と執行条件に分割
    df_chumonjouken = df_chumon[5].str.split('  ', expand=True)
    # 9列目を注文日と有効期限に分割
    df_chumonbi = df_chumon[9].str.split('  ', expand=True)


    #テーブルを結合
    df_result=pandas.concat([df_chumoncord[0],df_chumonmeigara,df_chumonsuryo[0],df_chumonbaibai,df_chumonsuryo[1],df_chumon[6],df_chumonbi,df_chumonjouken],axis=1)
    # 1行めを削除
    df_result=df_result.drop(df_result.index[0])
    df_result.columns=["銘柄コード","銘柄名","数量","状態:注文中","注文単価","状態","注文日","有効期限","期間指定","執行条件"]
    

    return df_result

CSVで出力

name(呼び出し関数で指定するname)+年月日.csv形式で出力します。

def export_data(df_result, name):
    df_result.to_csv(name + '{0:%Y%m%d}.csv'.format(datetime.date.today()))

呼び出し

支店コード、口座番号、パスワードをご自身のもので入力します。

if __name__ == '__main__':
    SHITEN = "支店コード"
    KOUZA = "口座番号"
    PASSWORD = "パスワード"
    name="SMBC注文中"    


    #ログイン
    driver=connect_smbc(SHITEN,KOUZA,PASSWORD,name)
    #注文中リストの書き出し
    df_result=get_chumon_data(driver)

    export_data(df_result, name)
    
    print("終了しました")
    driver.quit()

完成

「最終的にSMBC注文中+日付.csv」ファイルが出力されます。

途中で出力したchumonichiran.csvはこんな感じです。

pandasで表をそのまま出力するとこのようにコードと銘柄名、注文数量と注文単価などが同じセルに入力されてしまい使い勝手が悪いため最終的に整形して出力しています。