楽天証券からお気に入り登録している銘柄の情報をスクレイピングする


はじめまして。この度、初投稿になります。
最近、データ分析や機械学習を学んでいるため、自分で何か課題を設定してデータ収集や分析のスキルを磨こうと思ったので投稿のきっかけです。

普段は放送関係のエンジニアをしているのですが、投資が好きなので株価取得からまずははじめてみました。

前提条件

取得したいデータは日本の個別株ですが、無料でデータを提供しているサイトが非常に限られていることと、以下の問題があることから証券会社から取得する方針にしました。

  • サービス終了の恐れがある(過去にも普通にありました)
  • 欲しい情報を取得出来ない(出来高がないとか)

また、証券会社はログインしないとサービスが利用出来ず、スクレイピング対策も厳しいため、Seleniumでデータを取得する方針にしました。

Seleniumの実装

(1)Chromeドライバを使ってサイトにアクセス

webドライバの使い方は他にもたくさん記事があるのでここでは省略します。

import time
from selenium import webdriver
import csv
import datetime

# 仮想ブラウザ起動、URL先のサイトにアクセス
driver = webdriver.Chrome()
driver.get('https://www.rakuten-sec.co.jp/')
time.sleep(1)

(2)楽天証券にログイン

ログインIDとパスワードのフォームにname属性が付与されているので、それを利用してID・パスワードを入力します。ログインはJavaScriptの実行ではなくフォームのsubmitでOKでした。

# ログイン
el = driver.find_element_by_name("loginid")
el.clear()
el.send_keys('****')
el = driver.find_element_by_name("passwd")
el.send_keys('****')
el = driver.find_element_by_name("loginform")
el.submit()
time.sleep(1)

(3)お気に入りページから銘柄情報を取得する

まずはお気に入り銘柄のページまで遷移します。

# お気に入り銘柄ページに遷移
el = driver.find_element_by_id("gmenu_domestic_stock")
el.click()
el = driver.find_element_by_id("jp-stk-top-btn-info-prc-reg-lst")
el.click()

お気に入り銘柄ページで初期表示されている1ページ目の株価情報を取得してから、10ページ目までページ遷移しながら各ページの株価情報を取得します。
(データの登録有無に関わらずページ数は10固定です)

# 銘柄情報を取得
dataList = []

pageCount = driver.find_elements_by_class_name("number")
for pn in range(0,len(pageCount)):
    pageElem = driver.find_elements_by_class_name("number")
    pageElem[pn].click()
    # テーブル内容取得
    try:
        tableElem = driver.find_element_by_class_name("tbl-data-01")
        trs = tableElem.find_elements_by_tag_name("tr")

        # ヘッダ行は除いて取得
        for i in range(1,len(trs)):
            tds = trs[i].find_elements_by_tag_name("td")
            line = []
            for j in range(0,len(tds)):
                line.append(tds[j].text)
            dataList.append(line)
    # お気に入り登録がないページはスキップ
    except Exception:
        print("要素が見つかりませんでした")

(4)取得したデータをファイル(tsv)に出力

最後に取得したデータをファイルに出力します。Pythonでコードを組むのがはじめてなので、コードで拙い部分があってもご容赦ください。

# ファイル名で使用する日付情報を取得
now = datetime.datetime.now()
YYYY = str(now.year)
MM = str(now.month)
DD = str(now.day)

# 追加モードでファイルをオープンし、1行ずつ書き込み(下記はタブ区切り)
with open('{}'+YYYY+MM+DD+'-BrandList.csv', 'a') as f:
    writer = csv.writer(f, delimiter='\t')
    writer.writerows(dataList)

# ファイルクローズ
f.close()

最後に

データを取得する実装は以上で終了です。
取得したデータを溜めて出来高分析(3σを超えた銘柄を検知)したいと思って本処理を用意したのですが、一旦保留して次はIRやtwitterの自然言語処理に挑戦してみようと考えています。