Yahooファイナンスからドル円や日経の価格を取得にあたって、スクレイピングではなく、APIを使って取得する方法をまとめます。色々探したけど、ちゃんとしたヘルプも見つからないし、スマートな方法なかったので自分でまとめました。
finance.yahoo.comのAPI仕様
全然情報がなくて、調べるのに苦労しました。ヤフーファイナンスのAPIは、日本のYahooではなくて、アメリカなんですよね。
ブラウザから直接叩いてみる
直接ブラウザから、クエリーを送ってみる
https://query1.finance.yahoo.com/v8/finance/chart/USDJPY=X
結果
為替のコード
ドル円はUSDJPY=Xです。USDJPYだけではエラーになるのでご注意ください。日本のYahooに全てではないけど、少しだけ情報が出てます。
パラメータを加えてみる
以下のパラメーターを加えてみます。interval加えないと、Open、Close、Volumeが出てきません。rangeは時間軸。その期間を、ガバっとまとめて取得するようです。
- range(取得期間)
- interval
https://query1.finance.yahoo.com/v8/finance/chart/USDJPY=X?range=1m&interval=1d
結果
OpenとCloseが1つだけになって、結果がシンプルになりました。
サンプルコード
postして、返ってきた結果をJSON形式でみてprintしてみました。
import requests
import json
#URL
url = "https://query1.finance.yahoo.com/v8/finance/chart/USDJPY=X?range=1M&interval=1d"
#ヘッダは必須
header = {'Connection': 'keep-alive',
'Expires': '-1',
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) \
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36'
}
#POST送信
#requests.session()
response = requests.get(url,headers=header)
print(response.status_code)
#JSON変換
res_data = response.json()
print(res_data)
結果
結構、入れ子が複雑ですね。Closeまで辿り着くのが超むずい。
closeへのアクセス
以下を追記すれば、参照可能です。どんだけ、遠いねん!!
usdjpy_close = res_data['chart']['result'][0]['indicators']['quote'][0]['close']
print(usdjpy_close)
まとめ
JSON形式での取得まではすんなり行くと思います。
そこからが、大変。入れ子が複雑すぎて、getだけではなかなか参照が難しかったので、力技でダイレクトに参照しました。ご参考ください。
コメント