お得なAmazonタイムセールはこちらをクリック!!
本ページはプロモーションが含まれています

楽天証券の保有銘柄をスクレイピングで取得するPythonコードを書いてみた

この記事は約8分で読めます。

こんにちは!ふるのーと(fullnote)です!(*^^*)

独学でPythonの勉強をしてみました!

今回はスクレイピングで証券口座の情報を抜き出すということにチャレンジしてみました。

もし、もっとこうやったほうがうまくいくよ!とかアドバイスがあればお願いします。

楽天証券のサイトへのスクレイピングはあまりやってはいけないというのを聞きましたのであくまでコードの内容を参考にする程度にとどめてくださいませ。⇒https://www.rakuten-sec.co.jp/robots.txt

楽天RSS(API)を利用する方法もあるそうです。次回はそちらも使ってみたいと思います。

スポンサーリンク

WEBスクレイピングとは?

WEBスクレイピングとは、プログラミングを利用して自動でWEB上の情報を取得する方法です。

やり方は色々ありますが、今回はPythonを利用して取得してみました。

人間が行う作業はコンピュータでも行うことができます。

繰り返しの単純作業であればプログラミングで自動化してしまうと作業が楽になります。

動的サイトのPythonスクレイピングにはSelenium、BeautifulSoup

PythonのスクレイピングにはRequestsでURLを指定してデータを取得するという方法が簡単で人気ですが、ユーザに合わせて表示される動的なWEBサイトでは利用できないため、SeleniumやBeautifulSoupを利用します。

Pandasでの表の取得と整形が大変

ウェブページに表示されている通りの表が作れば話は早いのですが、表を読み取ろうとすると表が崩れたり、うまく情報が取得できないことが結構あります。

ここで挫折することが多いですが、難しければ諦めてそのまま出力するというのも一つかと思います。

スクレイピングコード解説

Seleniumで使用するchromeドライバのバージョンアップを自動化

Seleniumを使用する場合、使用するブラウザに対応するドライバを設定する必要があります。

Pythonスクレイピングで検索するとchromeドライバーを自分の利用ドライバに合わせて毎回ダウンロードして利用するという方法がたくさん出てきます。

しかし、chromeは頻繁にバージョンアップされるのでこの作業が地味に面倒だったりします。

自動的にchromeのバージョンに合わせたドライバが利用できる方法がありましたので今回はこちらを利用します。

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
 
driver = webdriver.Chrome(ChromeDriverManager().install())

seleniumでブラウザ操作(ログイン)find_element_by

楽天証券のウェブサイトに行ってユーザIDとパスワードを入力してログインするにはseleniumの

  • get()
  • find_element_by_name()
  • send_keys()

を利用します。

driver.get('https://www.rakuten-sec.co.jp/ITS/V_ACT_Login.html')

element = driver.find_element_by_name('userid')
element.clear()
element.send_keys('XXXX') #ご自身のユーザIDを入力

element = driver.find_element_by_name('passwd')
element.clear()
element.send_keys('XXXX') #ご自身のパスワードを入力

element = driver.find_element_by_name('submit%template')
element.click()

element = driver.find_element_by_xpath('//*[@id="str-container"]/div[2]/main/form[2]/div[2]/div[1]/div[1]/div[2]/div[1]/a[1]/span')#保有商品一覧のページへ
element.click()

ValueErrorが出るのでsleepで待機

ページの読み込みに少し時間がかかるのでsleepを使って少し待機時間を作ります。

from time import sleep 
sleep(5)

BeautifulSoupでhtmlから情報を抽出

続いてBeautifulSoupライブラリを利用してhtmlの情報を吸い上げます。

URLを指定してrequestsやpandasで抽出できると楽なのですが、うまくいかないのでBeautifulSoupを利用します。

from bs4 import BeautifulSoup

page_source = driver.page_source
soup = BeautifulSoup(page_source, 'html.parser')

上記は定番の書き方です。

BeautifulSoupを利用するときは大体こういう書き方をするみたいです。

保有商品の表があるので、セレクターを指定して、tableという名前の変数に入れます。

table = soup.select_one("#table_possess_data > span > table")

続いてpd.read_html()を利用して表をデータフレーム形式で取得します。

import pandas as pd
df = pd.read_html(str(table))[0]

これだと余計なものも入っているので使えそうなところのみ取得するようにします。

pandasで表を整形

pandasで表の要らない分をdropやdropnaで削除していきます。

不要な列を列番号を指定して削除します。

df = df.drop(df.columns[[0,1,6,7]], axis=1)

.iloc[0]で1行目の値を取得し、columnsでカラム名に指定します。

df.columns = df.iloc[0]

次にdrop(0)で不要な1行目を削除します。

df = df.drop(0)

最後に.dropna(how=’any’)でNaNのセルがある行を全て削除します。

df = df.dropna(how='any')

これで次のような整形された表が手に入ります。

銘柄口座保有数量平均取得価額
3    
5    
7    
8    

コードまとめ

今までのコードをまとめると次のようになります。

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager

from time import sleep 
from bs4 import BeautifulSoup
import pandas as pd

driver = webdriver.Chrome(ChromeDriverManager().install())

driver.get('https://www.rakuten-sec.co.jp/ITS/V_ACT_Login.html')

element = driver.find_element_by_name('loginid')
element.clear()
element.send_keys('XXX') #←ご自身のユーザIDを入力

element = driver.find_element_by_name('passwd')
element.clear()
element.send_keys('XXX') #←自身のパスワードを入力

element = driver.find_element_by_name('submit%template')
element.click()

element = driver.find_element_by_xpath('//*[@id="str-container"]/div[2]/main/form[2]/div[2]/div[1]/div[1]/div[2]/div[1]/a[1]/span')
element.click()
sleep(5)

page_source = driver.page_source
soup = BeautifulSoup(page_source, 'html.parser')

table = soup.select_one("#table_possess_data > span > table")

df = pd.read_html(str(table))[0]
df = df.drop(df.columns[[0,1,6,7]], axis=1)
df.columns = df.iloc[0]
df = df.drop(0)
df = df.dropna(how='any')
df

ちなみに私は複数証券会社だったり、家族の分のアカウントだったり、複数の情報をがっちゃんこして資産管理に活用しています!

プログラミングを勉強すると仕事でもプライベートでも便利になります。

Pythonの勉強は書籍から入ってもいいですし、オンラインスクールに入ってもいいと思います。

PyQは月額3040円または8130円で初められて人気がありますね。⇒オンラインPython学習サービス「PyQ™(パイキュー)」

今なら7日間無料キャンペーンやっているので興味があればどんな感じか登録してみるといいと思います。

\\7日間無料でお試し!//

全くの初めての場合は本を片手にはじめて見るのもいいかもしれませんね。

それでは今日はこのへんで!ふるのーと(@fullnote)でした!(*^^*)

美味しい食事と音楽に囲まれて毎日笑顔を大切に過ごしています。
ブログもYoutubeものんびりとやっています。(*^^*)

fullnoteをフォローする
この記事が気に入ったら
フォローしよう
最新情報をお届けします。
プログラミング投資
スポンサーリンク

コメント

タイトルとURLをコピーしました