PythonでGoogle financeから株価を取得するコード【スクレイピング】
現在の株価を取得をしたかったのでPythonでスクレイピングすることにした。
主に米国株の情報が欲しかったのでリアルタイムで更新されているGoogleファイナンスにすることにした。
そのサイトがスクレイピングが許可されているかどうかはrobots.txtを見ればわかる。
https://www.google.com/robots.txt
投稿時点でAllow: /financeと記載されているので多分大丈夫だと思う。
株価を取得するPythonコード
必要なパッケージはBeautifulSoup4とrequestsなので環境になければインストールする。
pip install BeautifulSoup4 requests
完成コードはこんな感じ。
from bs4 import BeautifulSoup
import requests
def data_get(symbol, lang="ja"):
url = f"https://www.google.com/finance/quote/{symbol}?hl={lang}"
res = requests.get(url)
soup = BeautifulSoup(res.text, "html.parser")
name = soup.find(class_="zzDege").text # 会社名
prices = soup.find_all(class_="YMlKec fxKbKc") # 株価
p_lis = []
for i in prices:
p_lis.append(i.get_text())
try:
after = p_lis[1]
except IndexError:
after = None
others = soup.find_all(class_="P6K39c") #その他データ
o_lis = []
for i in others:
o_lis.append(i.get_text())
return {
"会社名": name,
"価格": p_lis[0],
"時間外取引": after,
"前日終値": o_lis[0],
"日次変動幅": o_lis[1],
"年間変動幅": o_lis[2],
"時価総額": o_lis[3],
"平均取引高": o_lis[4],
"株価収益率": o_lis[5],
"配当利回り": o_lis[6],
"優先市場": o_lis[7],
}
print(data_get("NVDA:NASDAQ"))
# 実行結果
{
'会社名': 'NVIDIA',
'価格': '$135.91',
'時間外取引': '$135.61',
'前日終値': '$140.11',
'日次変動幅': '$134.22 - $139.92',
'年間変動幅': '$53.49 - $153.13',
'時価総額': '3.33兆 USD',
'平均取引高': '2.09億',
'株価収益率': '53.55',
'配当利回り': '0.03%',
'優先市場': 'NASDAQ'
}
コード解説
Googleファイナンスは"銘柄コード(シンボル):取引市場"で株情報を管理しているので、そこのURLを変数にして使いやすくした。言語についてはヘッダーやURLになにもつけずにリクエストすると英語で返ってくるので?hl={lang}で言語を指定する。日本語ならja。
URLからhtmlを取得してBeautifulSoupを使ってクラス名でその要素を取得する。クラス名が変わってしまうと使えなくなるので、もし変更があればその都度変更しなければならない。
class_="YMlKec fxKbKc"で株価を取得していて時間外取引の値も取得できるけど、日本株は時間外取引の記載がないのでIndexErrorで処理している。
コードを書いてみての所感
前日比のデータも取りたかったけどその部分はJavascriptで表示させてるっぽいのでレンダリングさせなきゃならない。seleniumを使えばいけるだろうけど、そこまでするのだったら素直にGoogleスプレッドシート使う方が簡単だと思う。
あと日本株は20分ぐらい遅延があるそうなのでPythonならyfinance使った方がいい。米国株ならリアルタイムで取得できるので便利。