こんにちは!ふるのーと(fullnote)です!(*^^*)
独学でPythonの勉強をしてみました!
今回はスクレイピングで証券口座の情報を抜き出すということにチャレンジしてみました。
もし、もっとこうやったほうがうまくいくよ!とかアドバイスがあればお願いします。
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日間無料キャンペーンやっているので興味があればどんな感じか登録してみるといいと思います。
全くの初めての場合は本を片手にはじめて見るのもいいかもしれませんね。
それでは今日はこのへんで!ふるのーと(@fullnote)でした!(*^^*)
コメント