APIは有料だったり、スクレイピングやAPIが禁止なところが多かったり、Googleファイナンス関数は日本株非対応だったり、GASで日本株を無理やり取ろうとしても始値が取れなかったり。
そこでスクレイピングが許されているGoogleファイナンスのページから情報を取得できるPythonプログラムを考えてみました。
目的
Googleファイナンスのページから、日本個別銘柄の
・始値
・終値
・安値
・高値
・出来高(ざっくり)
を取得する
前準備
Seleniumのインストール
Selenium は Web ブラウザの操作を自動化するためのフレームワークで、タスクの自動化や Web サイトのスクレイピングでも利用されています。
pip install selenium
でインストールしましょう。
ChromeDriverのインストール
Seleniumでは、WebDriverを使用してブラウザを操作します。
ブラウザをChomeで行うので、ChromeDriverをインストールします。
https://chromedriver.chromium.org/downloads
こちらで自分が使用しているChromeのVer.に近いドライバーをダウンロードします。
ZIPファイルを解凍し、chromedriver.exeを適当なフォルダに置きます。
※私はScrapingするフォルダに入れています。
取得する情報
市場が閉まった後を前提に考えていますが、以下の情報を取得します。
例で日本電信電話(9432)の株価を取得したいと思います。
プログラム
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
import time
import datetime
#GoogleChromeを起動
browser = webdriver.Chrome(executable_path = 'C:\\Users\\****\\Documents\\Scraping\\chromedriver.exe')
browser.implicitly_wait(3)
cd='9432'
url = 'https://www.google.com/finance/quote/' + cd + ':TYO'
browser.get(url)
time.sleep(3)
#終値を取得
strClose=browser.find_element(By.CLASS_NAME,"kf1m0").text
strClose=strClose.replace("¥","")
floatClose=float(strClose.replace(",",""))
#日付を取得
strDay=browser.find_element(By.CLASS_NAME,"ygUjEc").text
strDay2=strDay.split(',')
strDay2[0]=strDay2[0].replace("月","-")
strDay2[0]=strDay2[0].replace("日","")
dateNow=datetime.datetime.now()
strDay3=str(dateNow.year)+"-"+strDay2[0]
dateDay=datetime.datetime.strptime(strDay3, '%Y-%m-%d')
#安値-高値を取得
#CLASS_NAMEだと取得できないので、CSS_SELECTORで取得
strLowHigh=browser.find_element(By.CSS_SELECTOR,"#yDmH0d > c-wiz > div > div.e1AOyf > div > main > div.Gfxi4 > div.HKO5Mb > div > div.eYanAe > div:nth-child(3) > div").text
strLowHigh=strLowHigh.replace("¥","")
strLowHigh=strLowHigh.replace(",","")
strLowHigh2=strLowHigh.split(" - ")
floatLow=float(strLowHigh2[0])
floatHigh=float(strLowHigh2[1])
#取得するグラフの取得
graph = browser.find_element(By.CLASS_NAME,"ushogf")
#マウスの動きを記述
actions = ActionChains(browser)
#チャートの中心にマウスを移動
actions.move_to_element(graph)
#チャートの左端にマウスを持ってくる
#なぜか.rect['width']/2だと左端に行ってくれないので、ベタ打ち
actions.move_by_offset(-385,0).perform()
#始値を取得
strOpen=browser.find_element(By.CLASS_NAME,"hSGhwc-SeJRAd").text
strOpen=strOpen.replace("JPY ¥","")
floatOpen=float(strOpen.replace(",",""))
#出来高を取得
#5日のページに移って取得
url = url+'?window=5D'
browser.get(url)
time.sleep(3)
#取得するグラフの取得
graph = browser.find_element(By.CLASS_NAME,"ushogf")
#マウスの動きを記述
actions = ActionChains(browser)
#チャートの中心にマウスを移動
actions.move_to_element(graph)
#チャートの→端にマウスを持ってくる
#なぜか.rect['width']/2で右端に行っても値が取得できないので-1して補正
actions.move_by_offset((graph.rect['width']/2)-1,0).perform()
#出来高を取得
#ざっくりしか出てこないけど。
strVolume=browser.find_element(By.CLASS_NAME,"hSGhwc-IOpRCf").text
strVolume=strVolume.replace("出来高: ","")
if '万' in strVolume:
strVolume=strVolume.replace("万","")
floatVolume=float(strVolume)*10000
else:
floatVolume=float(strVolume)
print(str(dateDay)+' 始値:'+str(floatOpen)+' 終値:'+str(floatClose)+' 安値:'+str(floatLow)+' 高値:'+str(floatHigh)+' 出来高:'+str(floatVolume))
browser.close()
browser.quit()
解説
CLASS名、CSSセレクタ値の取得
本スクレイピングはhtmlに記載されているクラス名やCSSセレクター等の情報をキーにそのテキストを取得していっています。
ページ上で右クリック→[検証]をクリックすると以下のような情報が出てきますので、ほしい情報のところのCLASS名やCSSセレクタを取得しています。
グラフ内のデータを取得する
ページを取得しただけではグラフ内に入っている始値や出来高のデータが取得できないので、以下のページを参考にグラフ内にマウスカーソルを合わせ値を取得しました。
Seleniumでマウスを自動操縦して、Googleから株価データを取得する - Qiita
出力結果
こんな感じで出力されます。
2023-02-17 00:00:00 始値:3857.0 終値:3888.0 安値:3853.0 高値:3894.0 出来高:890000.0
↓よろしければクリックをお願いします!



