ここでは、「BeautifulSoup」を用いた株価のスクレイピング方法について解説しています。
行ったこと
「株式投資メモ」さんの株価情報をスクレイピングして、excelファイルに保存するまでを行いました。
行う前に確認すること
スクレイピングを行う前に該当サイトがスクレイピングを許可しているのか「robots.txt」を覗いて、「Allow」となっていることを確認します。
プログラム
#プログラム
from bs4 import BeautifulSoup
import requests
import openpyxl
from openpyxl.chart import (
BarChart,
StockChart,
Reference,
Series,
)
from openpyxl.chart.axis import DateAxis, ChartLines
from openpyxl.chart.updown_bars import UpDownBars
#1---調べたいデータを指定
code = 9024
year = 2020
#2---URL指定
url = "https://kabuoji3.com/stock/"+str(code)+"/"+str(year)+"/"
#3---headers指定
headers = {"User-Agent": "*****"}
soup = BeautifulSoup(requests.get(url, headers = headers).content,'html.parser')
title = soup.select_one("span.jp").text
#4---Excelファイルの作成
wb = openpyxl.Workbook()
ws = wb.active
ws.title = str(title)
ws['A1'].value = 'day'
ws['B1'].value = 'open'
ws['C1'].value = 'high'
ws['D1'].value = 'low'
ws['E1'].value = 'close'
ws['F1'].value = 'volume'
ws['G1'].value = 'adjustment'
#5---株価抽出
all_tr = soup.find_all('tr')
for i in range(1,len(all_tr)):
tr = all_tr[i].find_all('td')
for n,td in enumerate(tr,1):
new_cell = ws.cell(row=(i+1),column=n)
cell_text = str(td.text)
new_cell.value = int(cell_text.replace("-","",2))
#6---High-low-closeのグラフ範囲指定
c1 = StockChart()
labels = Reference(ws, min_col=1, min_row=2, max_row=240)
data = Reference(ws, min_col=3, max_col=5, min_row=1, max_row=240)
c1.add_data(data, titles_from_data=True)
c1.set_categories(labels)
for s in c1.series:
s.graphicalProperties.line.noFill = True
#7---マーカの指定
s.marker.symbol = "dot"
s.marker.size = 5
c1.title = "High-low-close"
c1.hiLowLines = ChartLines()
# 8---値のキャッシュ
from openpyxl.chart.data_source import NumData, NumVal
pts = [NumVal(idx=i) for i in range(len(data) - 1)]
cache = NumData(pt=pts)
c1.series[-1].val.numRef.numCache = cache
#9---チャート書き込みセルの指定
ws.add_chart(c1, "H5")
#10---ワークブックをExcelファイルとして保存
wb.save(str(code)+'-'+str(year)+'.xlsx')
1の部分では証券コードとスクレイピングしたい年を指定しています。ここでは西武ホールディングスの2020年の1年間を指定しています。
2の部分では指定した文字列をURLに入力しています。
3の部分では「どのようなプログラムや環境でアクセスしているかという情報」としてheadersを指定します。確認くんなどを利用して「現在のブラウザ」環境を記載します。
4の部分では各列の1行目を記述しています。
5の部分では指定したURLの「tr」「td」タブを抽出しています。ただ抽出しただけでは文字のままなので、抽出した文字をintで数値変換してデータを書き込んでいます。その際、日付の「-」を削除しています。
cell_text = str(td.text)
new_cell.value = int(cell_text.replace("-","",2))
6の部分では抽出した数値を基にグラフ化の範囲を指定しています。範囲を指定する前にグラフの種類を呼び出します。今回は以下のようなグラフにしたいので「StockChart()」としています。
#6---High-low-closeのグラフ範囲指定
c1 = StockChart()
次に範囲を指定します。labelsを横軸要素、dataを縦軸要素としています。rowが行、colが列を意味しています。
labels = Reference(ws, min_col=1, min_row=2, max_row=240)
data = Reference(ws, min_col=3, max_col=5, min_row=1, max_row=240)
c1.add_data(data, titles_from_data=True)
c1.set_categories(labels)
add_data()メソッドに指定したデータを放り込みます。また、引数をTrueにすることで指定したデータ領域の先頭行を、グラフのラベルとして使用可能とします。
s.graphicalProperties.line.noFill = True
線を消す指定をします。
#7---マーカの指定
s.marker.symbol = "dot"
s.marker.size = 5
c1.title = "High-low-close"
c1.hiLowLines = ChartLines()
7の部分ではマーカの指定をしています。同時にグラフのタイトルを指定しています。
# 8---値のキャッシュ
from openpyxl.chart.data_source import NumData, NumVal
pts = [NumVal(idx=i) for i in range(len(data) - 1)]
cache = NumData(pt=pts)
c1.series[-1].val.numRef.numCache = cache
8の部分では値のキャッシュを行っています。詳しい内容はこちらを参照してください。
#9---チャート書き込みセルの指定
ws.add_chart(c1, "H5")
9の部分ではグラフの位置を指定しています。
#10---ワークブックをExcelファイルとして保存
wb.save(str(code)+'-'+str(year)+'.xlsx')
最後に保存して終了です。
結果
スクレイピングからグラフ化まで自動化できました。
次は統計解析まで自動化できればと思います。
出来高ありのグラフ
応用として、出来高ありのグラフも作成してみます。
#11---保存する前に追記
bar = BarChart()
data = Reference(ws, min_col=6, min_row=1, max_row=240)
bar.add_data(data, titles_from_data=True)
bar.set_categories(labels)
from copy import deepcopy
#12---Volume-high-low-close
b1 = deepcopy(bar)
c3 = deepcopy(c1)
c3.y_axis.majorGridlines = None
c3.y_axis.title = "Price"
b1.y_axis.axId = 20
b1.z_axis = c3.y_axis
b1.y_axis.crosses = "max"
b1 += c3
c3.title = "High low close volume"
ws.add_chart(b1, "H22")
#13---ワークブックをExcelファイルとして保存
wb.save(str(code)+'-'+str(year)+'.xlsx')
1番上のプログラムにおける10の保存する前に上記のプログラムを追記することで、チャートを作成できます。
結果
出来高が追加さえたチャートを作成できました。
関連記事
項目 | 内容 |
「BeautifulSoup」を用いた株価のスクレイピング-終値の偏差算出- | 「「BeautifulSoup」を用いた株価のスクレイピング」の発展として終値に着目して偏差算出を行ってみました。 |