2023年2月19日日曜日

【Python】スクレイピングでGoogleファイナンスの日本の個別株情報を取得する

 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)の株価を取得したいと思います。

1日のページから日付・始値・終値・安値・高値を取得

5日のページから出来高を取得


プログラム

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セレクタを取得しています。
検証でhtml内を解析し必要なキーを取得

グラフ内のデータを取得する

ページを取得しただけではグラフ内に入っている始値や出来高のデータが取得できないので、以下のページを参考にグラフ内にマウスカーソルを合わせ値を取得しました。
Seleniumでマウスを自動操縦して、Googleから株価データを取得する - Qiita
thumbnail
https://qiita.com/i_shot1997/items/f2d1e6a0e9f665412faa

出力結果

こんな感じで出力されます。
2023-02-17 00:00:00 始値:3857.0 終値:3888.0 安値:3853.0 高値:3894.0 出来高:890000.0



↓よろしければクリックをお願いします!




■関連情報