2017/11/21

備忘録:Googleスプレッドシートのセルに指定した銘柄コードの株価を表示するには?

■やりたいこと
日本市場に上場している会社の銘柄コードを指定して株価を取得、取得した株価をGoogleスプレッドシート(以下SS)のセルに表示したい。

■IMPORTXML関数を使えばよい
セルA35に、銘柄コードが入力されているSSのどこか(例えばB35)に、以下のいずれかの関数をコピペします。

---現在値を表示する関数(Yahoo!のサイトを利用した例)---
=IMPORTXML("https://stocks.finance.yahoo.co.jp/stocks/detail/?code=" & A35,"//td[@class='stoksPrice']")


---前日終値現在値を表示する関数(日経のサイトを利用した例)---
=IMPORTXML("https://www.nikkei.com/nkd/company/history/dprice/?scode=" & A35,"/html/body/div[2]/div/div[7]/div/div/div/div[1]/div[5]/dl[1]/dd")
※2018/08/26修正。いつの間にかページ構成が変わっていて「終値」がなくなってしまった^^;
※以前のページ構成の時のソースは以下。
=IMPORTXML("https://www.nikkei.com/nkd/company/history/dprice/?scode=" & A35,"/html/body/div[2]/div/div[7]/div/div/div/div[1]/div[6]/div/div/div[2]/div/table/tbody/tr[1]/td[4]")


■動作概略
動作の概略は、以下を手で操作することを、関数で代替してしまおうということです。

(1)株価情報を公開しているサイトを表示する。

(2)株価を取得したい企業を検索する。

(3)現在の株価のページを表示する(前項の現在値を表示する関数)。
(3)'昨日までの株価情報ページを表示する(前日終値を表示する関数)。

(4)現在値を探してコピーする(前項の現在値を表示する関数)。
(4)'昨日の終値を探してコピーする(前日終値を表示する関数)。

(5)SSのセルに貼り付ける。

IMPORTXML関数のURLパラメータが、(1)(2)に該当します。

同関数のXPathパラメータが、(3)(4)に該当します。
上記パラメータ指定が2つとも正しければ、(5)が実行されます。

ということで、指定するパラメータは、参照する画面の仕様/設計に強く依存しています。
一方、画面の仕様/設計は公開されていませんし、変更されない保証もありません。

したがって、参照するページが何かしら変更されると、使えなくなってしまいます^^;
その場合、もう一度、そのサイトとページの構造を分析して関数を書き換えましょう♪
無料公開されている情報を、ちょっと拝借するわけですから、立場をわきまえ、間違っても株価サイト運営者に苦情など入れませぬよう(笑)

■補足-XPathパラメータの意味
XPathパラメータは何をするのかというと、表示されたページの中にある、取得したい値の場所を指定するものです。

この資料内の現在値の指定例では、

"//td[@class='stoksPrice']"

と記述しました。

Yahoo!の株価サイトでは、現在値の表示場所に'stoksPrice'という名前で定義されていることがわかったので、それを直接記述してあげれば、値の場所がわかる=現在値を取得できる、という仕組みです。

実際に、現在値付近のソースコードを見ると、
1,824
とあるので、class名stoksPriceを関数の構文規則に当てはめて指定すればよい、ということです。
ちなみに、この例では、現在値である1824が取得され、セル上に表示されます。



一方、終値の指定例では、class名を指定していません。
これは、日経のサイトの終値にclass名が割り当てられていないため、です。
なので、終値が表示されている場所まで、HTMLタグを順番にたどり、たどったタグをすべて羅列することで、場所を特定する、というやり方になります。
例えるなら、エクスプローラで深い階層にあるファイルを特定するときの、すべてのフォルダ階層=すべてのタグ、という感じです。

日経サイトの終値のXPathを最も簡単に取得する方法は...

Firefoxで同サイトを開く→終値部分を右クリックし「要素を調査」をクリック→「開発ツール」画面が表示される→ハイライトされて部分を右クリックし「コピー」-「XPath」

で、XPathを記述したいところへ貼り付けて終わり♪


■補足-GOOGLEFINANCE関数では日本国内の株式情報は取得不可
GOOGLEFINACEでは日本国内の株式市場の株価は取得できません。

「ドキュメント エディタ ヘルプ GOOGLEFINANCE」の下の方の説明の一項に記載されていました。
https://support.google.com/docs/answer/3093281?hl=ja

「GOOGLEFINANCE は英語でのみ使用でき、大半の国際取引はサポートしていません。」?
...この日本語、おかしいよなぁ^^;

でも、原文が妙な言い回しになっているから、か(+_+)
"GOOGLEFINANCE is only available in English and does not support most international exchanges."

"in English"ってかなり漠然とした特定だよなぁ...
ひょっとしてGOOGLEFINANCE「関数」のことではなく、Google Financeの「サイト」は英語でしか表示できないよ、って言っているのかなぁ?
でも、関数のヘルプに書くことじゃないし...変なの(笑)

それに、"international exchanges"ってどちらかというと国際交流って意味じゃないのかなぁ...
これで、世界中の株式取引所、とはなかなか理解できないよなぁ(@_@)
exchangesはstok exchangesのことなんだろうけど、それにinternational付けると「国際株式取引所」...そんな株式取引所、ないし(笑)

いずれにしても、"does not support most international exchanges."(ほとんどの証券取引所はサポート対象外)と書いてあるので、あきらめましょう(^^)


Googleが頑張って、日本市場の株価も戻してくれるようになるまで(笑)


ちなみに、Google Financeのサイト上では日本国内市場(上場会社)の株価情報は、ちゃんと表示されます。
もちろん、社名は英字で表記されます...でも、漢字が読めない外国人投資家は見やすいでしょうね、Google Financeのほうが(^^)


■補足-日経のサイトからは現在値が取得できず?→解決!
Yahoo!のサイトと同じやり方で、日経のサイトから現在値を取得しようとしましたが、なぜか#REF!となってしまいました。

要素の調査でインスペクション画面からコピー-XPathで取得したコードを貼り付けても、現在値のクラスIDを直接指定してみても(//dd[@class=m-stockPriceElm_value now])、結果は#REF!でした。

#N/A!ではないので、構文は間違っていない感じではあるのですが...今後の研究課題ということで♪

その後、ひょんなことから、エラーの理由がわかり、解消しました(^^)

取得しようとした「現在値」の要素ddには2つの要素が含まれていて、その要素をSSに反映するには、式を指定したセルとその右側のセルに表示しようとします。しかし、右側のセルが空白ではなく値が入力されていたため、上書きできず(=表示できない)というエラーでした。

具体的には...
該当要素ddには、現在値と文字列「円」の2つの要素が含まれている。

式の戻りは配列となる。

SS上で表示する際、配列の数だけセルが必要。
(ここでは2つの値が配列に収納されているので、2つのセルが必要、となる。)

しかし、式の右側のセルには、既に値が入力されているため、表示できない。

エラー#REFが発生する。

なので、右側に空白セルを挿入して、非表示化することで、エラーは解消しました♪

■補足-エラーで株価が取得できない現象
IMPORTXML関数を指定したセルに「Loading...」 と表示されたまま株価が表示されず、そのセルにカーソルを合わせると、
「リクエスト数が多いためデータの読み込みに時間がかかる可能性があります。スプレッドシート内で作成した IMPORTHTML、IMPORTDATA、IMPORTFEED、IMPORTXML 関数の量を減らしてみてください。」
とポップアップが表示されることがあります。

気長に待つしかないようです^^;

どうやら、SS内に多数(100とか)のIMPORTXML関数を指定すると、更新処理(通信)が保留されてしまうようです。
ただ、参照先のサイトが保留しているのか、Googleが保留しているのか、はわかりません。

■補足-サイト参照の制限確認
ここでは、「技術的」にできることと方法を書きました。
しかし、できるからと言って、継続的にやっていいことかどうか?は、別問題です。
参照先サイトにお尋ねの上、法的民事的責任が伴う可能性も含め、自己責任でご判断ください。


そもそも、こういうデータを個人向けに、無料もしくは安く取得できるようなサイトがあれば解決することなんでしょうけど...

http://k-db.com/はそういう点で貴重なサイトなのですが、今年いっぱい(2017/12末)で閉鎖するとのこと。残念です。

以上です☆

2018/08/26 参照先(日経)のページレイアウト変更に対応。
2018/08/26 参照先(日経)の現在値参照で発生する#REFの原因判明と対応を追記。
2018/11/03 Xpathを簡単にコピーする方法を追記。