スクレイピングの例として、Yahoo からトヨタの株価を取得しグラフを描いてみる。
逐次確認しながら進めるため、Jupyter-notebookを使用する。
1.Yahoo からトヨタ(7203)の株価を取得する
|
# -*- coding: utf-8 -*- import urllib.request, urllib.error from bs4 import BeautifulSoup import re # 正規表現 # アクセスするURL url = "https://info.finance.yahoo.co.jp/history/?code=7203.T" # URLにアクセスする 戻り値にはアクセスした結果やHTMLなどが入ったinstanceが帰ってきます instance = urllib.request.urlopen(url) # instanceからHTMLを取り出して、BeautifulSoupで扱えるようにパースします soup = BeautifulSoup(instance, "html.parser") print(soup.title) |
|
<title>トヨタ自動車(株)【7203】:株式/株価 - Yahoo!ファイナンス</title> |
2.株式のテーブルを取得し、その中の全行(tr)を取出す
|
stc_tbl=soup.find('table',class_='boardFin') stc_trs=stc_tbl.find_all('tr') stc_trs |
結果は、次の様なリストになる。
|
[<tr> <th width="20%">日付</th> <th width="12%">始値</th> <th width="12%">高値</th> <th width="12%">安値</th> <th width="12%">終値</th> <th width="12%">出来高</th> <th width="20%">調整後終値*</th> </tr>, <tr><td>2018年12月11日</td><td>6,800</td><td>6,812</td><td>6,738</td><td>6,745</td><td>6,559,300</td><td>6,745</td></tr>, <tr><td>2018年12月10日</td><td>6,720</td><td>6,839</td><td>6,720</td><td>6,820</td><td>5,380,200</td><td>6,820</td></tr>, : ] |
3.株価データ用の2次元リストを作成する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
# 数値内のカンマを除去する def trimcom(data): return data.replace(",","") data=[] # データ格納用のリスト for i,stc_tr in enumerate(stc_trs): if i == 0: # 先頭行は見出し stc_ths=stc_tr.find_all('th') th=[] # 列見出し用のリスト for j, stc_th in enumerate(stc_ths): # リストに見出しを格納 th.insert(j, stc_th.string) data.insert(i,th) # data[0] に見出しのリストを格納 else: # 2行目以降は株価データ stc_tds=stc_tr.find_all('td') td=[] # 株価データ用のリスト for j,stc_td in enumerate(stc_tds): # 株価からカンマを除去しリストに格納 td.insert(j, trimcom(stc_td.string)) if j > 0: # 日付以外を整数型に変換 td[j]=int(td[j]) data.insert(i,td) # data[i] に株価データのリストを格納 data |
出力結果の一部を示す
|
[['日付', '始値', '高値', '安値', '終値', '出来高', '調整後終値*'], ['2018年12月11日', 6800, 6812, 6738, 6745, 6559300, 6745], ['2018年12月10日', 6720, 6839, 6720, 6820, 5380200, 6820], ['2018年12月7日', 6927, 6939, 6814, 6858, 7562500, 6858], : ]] |
4.plotly で扱いやすくするため、2次元リストをデータフレームに変換する
|
import pandas as pd df = pd.DataFrame(data[1:20],columns=data[0]) df |
5.plotly でグラフを描く
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
import plotly.offline as offline # offline notebook 用 import plotly.graph_objs as go # offline notebook 用 offline.init_notebook_mode() trace0 = go.Scatter( x = df['日付'], y = df['高値'], mode = 'lines+markers', name = '高値' ) trace1 = go.Scatter( x = df['日付'], y = df['安値'], mode = 'lines+markers', name = '安値' ) data = [trace0,trace1] # offline notebook 用 offline.iplot(data,image='png') |
本来であれば「ローソク足」という株価特有のチャートにしたかったのだが
plotlyのものはとても馴染めないものだったので、折れ線グラフで妥協した。