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
↓よろしければクリックをお願いします!