株価とスクレイピング①

目的:webスクレイピングの活用とエクセルの操作

目標
1 webスクレイピングをやってみる
2 取得したデータを扱ってみる
3 エクセルへデータを出力してグラフ化

webスクレイピングについて

スクレイピング(scraping)とは「擦り取る」を元にしたネット用語
ウェブ上のデータを拾い集めること

スクレイピングの注意点

法整備がまだみたい、これといった規定がない
問題提起
(総務省 消費者物価指数へのウェブスクレイピングの活用についてより)
・サイト側の著作権について
 →収集するデータが数値の場合、著作物とは認められない
  引用にはあたる
・サイトの利用規約に違反しないか
 →オープン(誰でもアクセス可能)なサイトの場合、規約に合意する必要 はない
・業務妨害にならないか
 →大量のアクセスによって、サーバーの負荷やシステムに障害があった場合は、業務妨害となる

また、yahooファイナンスのように、スクレイピング禁止を明示しているサイトもある→データの有料化をしている
このようなデータをスクレイピングすることは法的な問題が生じるおそれがある

※なので今回は、アメリカのyahoo financeを使っているのでセーフと思われる
一応、探したが禁止する規約みたいなものは見つからなかったので

プログラム実行順

1、必要なものをインポート

手順1のコード
書式 import ライブラリ(モジュール名)
import pandas as pd 
import datetime
import openpyxl
from openpyxl.chart import Reference
from pandas_datareader import data as pdr

内容
import pandas as pd   データフレーム(2次元配列)を扱うライブラリ 
import datetime     日付を扱う 
import openpyxl     Excelを扱うライブラリ

Excelのグラフの参照範囲を指定するReference()関数
from openpyxl.chart import Reference
from 〇〇 import 〇〇は、書式をショートカットできる
openpyxl.chart.Reference()を  → Referenceのみにできる

WEBスクレイピングする専用ライブラリ(プログラム)
from pandas_datareader import data as pdr

pandas_datareaderについて
世界人口や経済指標、株価データなどを取得できる
スクレイピングのことを何も知らなくても、1行のコードでデータを取得できてしまう便利なもの(怖いっちゃ怖い?)

2、株価のスクレイピングとエクセルへの入出力

手順2のコード
code = ['^N225','9984.T']
s = datetime.datetime.now() - datetime.timedelta(days=180)
e = datetime.date.today()
df = pdr.DataReader(code,'yahoo',s,e)
print(df.head(5))
df.to_excel('入力するエクセルファイル名')
wb = openpyxl.load_workbook(上と同じエクセルのパス)
ws = wb.worksheets[0]
ws.title = '株価'
gs = wb.create_chartsheet('グラフ')

内容
取得したい株価のコードを指定、日経平均とソフトバンクGのコードを入力、Yahoo FinanceのWebサイト(アメリカ)から株価のコードを調べる
code = ['^N225','9984.T']

データの取得開始と終了を指定、終了を今日の日付とし、その180日前からのデータを取得する
s = datetime.datetime.now() - datetime.timedelta(days=180)
e = datetime.date.today()

Dateresderの書式(サイトに合わせた株価のコード、データの取得サイト、取得開始日、終了日)
取得したデータをデータフレーム(2次元配列)に入れる
データフレームは縦と横の配列なのでそのままエクセルに変換できる
df = pdr.DataReader(code,'yahoo',s,e)

確認のため、データフレームの先頭5行を出力(必要ではない)
print(df.head(5))

エクセルに出力する書式、エクセルファイルがなければ、新規作成になる
ファイルの作成はプログラムと同じディレクトリになる
df.to_excel('エクセルのパス')

Excelワークブック・シート読込
なんか、2度手間感があるが、エクセルを保存してそれをもう一度ロードする
openpyxlはエクセルデータを扱うため、ロードが必要かな?と判断
今回はエクセル上にグラフを出力することを目標にしている

エクセルファイルをロード
wb = openpyxl.load_workbook(エクセルのパス)

book作成と同時にシートが1つできるので、ワークシートをロード
今回は保存したデータをそのまま取り出す
[0]はインデックス番号で0番目、1番最初のシートのこと
ws = wb.worksheets[0]

取得したシートの名前を変更
ws.title = '株価'

グラフを書くシートを新規作成、('名前')でシートの名前を指定
gs = wb.create_chartsheet('グラフ')
※chartsheetはグラフシートのこと、普通の表のシートも作れる

3、エクセルデータからグラフ範囲を指定し、グラフを出力する

手順3のコード
ws["A3"] = "日付"
ws["B3"] = "日経平均[円]"
ws["C3"] = "ソフトバンクG[円]"
#グラフ作成、Linechartは折れ線グラフのこと
oresen_g = openpyxl.chart.LineChart()
oresen_g.title = "株価グラフ"
oresen_g.y_axis.title = "日経平均"  #Y軸ラベル
oresen_g.x_axis.title = "日付"    #X軸ラベル
y_jiku = Reference(ws, min_col=2, min_row=4, max_col=3, max_row= ws.max_row)
oresen_g.add_data(y_jiku, titles_from_data=True)
x_jiku = Reference(ws, min_col=1, min_row=4, max_col=1, max_row = ws.max_row)
oresen_g.set_categories(x_jiku)
gs.add_chart(oresen_g)
#通常シートに出力するならadd_chart(グラフデータ,'セル指定、A1など')で指定のセルにグラフを書く
wb.save(エクセルのパス)

内容
エクセルの空いてるセルにタイトルを入力
ws["A3"] = "日付"
ws["B3"] = "日経平均[円]"
ws["C3"] = "ソフトバンクG[円]"

グラフ作成
oresen_gという、空のグラフデータを作成
タイトル、軸ラベルを設定する
oresen_g = openpyxl.chart.LineChart()
oresen_g.title = "株価グラフ"
oresen_g.y_axis.title = "日経平均" #Y軸
oresen_g.x_axis.title = "日付"   #X軸

データの範囲設定
Y軸範囲 Reference(シート名、最小列、最小行、最大列、最大行を指定)
4行、2列目(B4)からデータの最終行、3列目の範囲を指定している
y_jiku = Reference(ws, min_col=2, min_row=4, max_col=3, max_row= ws.max_row)

add_data()でY軸のデータをグラフに入力
oresen_g.add_data(y_jiku)

X軸範囲
x_jiku = Reference(ws, min_col=1, min_row=4, max_col=1, max_row = ws.max_row)

set_categories()でX軸のデータをグラフに入力
oresen_g.set_categories(x_jiku)

add_chart()で、グラフを指定の場所に出力
gsは、最初に設定したグラフシート
gs.add_chart(oresen_g)
※通常シートならadd_chart(グラフデータ,'セル')で指定のセルにグラフを書く

保存
wb.save(エクセルのパス)

コード全体

import pandas as pd
import datetime
from pandas_datareader import data as pdr
import openpyxl
from openpyxl.chart import Reference

code = ['^N225','9984.T']

s  = datetime.datetime.now() - datetime.timedelta(days=180)
e = datetime.date.today()

df = pdr.DataReader(code,'yahoo',s,e)

print(df.head(5))

df.to_excel('エクセルのパス')

wb = openpyxl.load_workbook('エクセルのパス')
ws = wb.worksheets[0]
ws.title = '株価'
gs = wb.create_chartsheet('グラフ')

ws["A3"] = "日付"
ws["B3"] = "日経平均[円]"
ws["C3"] = "ソフトバンクG[円]"

#グラフ作成
oresen_g = openpyxl.chart.LineChart()  #グラフの種類 折れ線グラフ
oresen_g.title  = "株価グラフ"           #グラフのタイトル

oresen_g.y_axis.title = "日経平均"    #y軸ラベル

oresen_g.x_axis.title = "日付"

#Y軸範囲
y_jiku = Reference(ws, min_col=2, min_row=4, max_col=3, max_row= ws.max_row)
oresen_g.add_data(y_jiku)

#X軸範囲
x_jiku = Reference(ws, min_col=1, min_row=4, max_col=1, max_row = ws.max_row)
oresen_g.set_categories(x_jiku)

gs.add_chart(oresen_g)

wb.save('エクセルのパス')
スクレイピングしたデータ、Adj Closeは調整後終値、高値、低値、出来高なども取得できる
出力したグラフ


この記事が気に入ったらサポートをしてみませんか?