かずきち。の日記

サーバサイドエンジニアのつぶやき

【金融】証券コードから一発で株式情報をスクレイピングするスプレッドシートを作ってみる【GoogleAppsScript22行】


株式情報をスプレッドシートに取り込みたい

証券コードでGoogle検索をすると上記のような市況や個別株式の情報が表示される。
この中の情報を一網打尽に転機するのは少し大変で、もう少し簡素化できると助かる。
というわけで今回は一連の指標を転機する作業を自動化するこころを目的とする。

完成形

まずGoogleスプレッドシート上に「追加メニュー」という新しいオリジナルメニューを追加します。

そのメニューは以下に証券コード追加メニューを新設します。

メニューを押すとこのように取得したいティッカーコード、証券コードを入力します。

今回はGOOGLEの株式情報を抽出したいので、「GOOGL」と入力します。
するとYahooファイナンス上から、Googleの市場情報を抽出して、スプレッドシートにリアルタイムに値を変更します。

GOOGLの株式情報を取得して、リアルタイムに置き換えます。
ここまでが一連の流れです。

どうやっているのか?

スプレッドシートにコードを加えて、改変しています。

function onOpen() {
  const ui = SpreadsheetApp.getUi();
  ui.createMenu("追加メニュー")
    .addItem("証券コード登録","registCode")
    .addToUi();
}

function registCode(){
  var code = Browser.inputBox("ウォッチしたい証券コードを入力してくだい");
  Browser.msgBox(code+"の銘柄をウォッチリストに追加しました")

  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const FValues = sheet.getRange('A:A').getValues();  //F列の値を全て取得
  const LastRow = FValues.filter(String).length;  //空白の要素を除いた長さを取得
  Logger.log(LastRow);

  var startRow = LastRow+1

  sheet.getRange(startRow,1).setValue(code);
  
}

このメニューを追加することで、スプレッドシートに株式情報を追加するメニューを追加します。

次は市場情報を抜く必要があります

市場情報を人間が新聞から抜き出すのであれば、見出し1、見出し2


引用:
https://senior-next.com/my-next-life/newspaper-stock-price/

目視で抽出する必要があります。
一方で機械から市場情報を抜くときはXpathを利用して、情報を抽出します。
Xpathという技術はどんな場所で使われるかというと、機会を自動化するときにパソコンに場所を教え込む技術として使います。
要はXpathはウェブサイト上の部品の場所の在り処の書き方です。

まだわからないと思いますので噛み砕くと「場所の表し方の差」です。

例えば、東京駅の場所を示すときに
「東京駅」と言ってもいいですし、
「〒100-0005 東京都千代田区丸の内1丁目」と言ってもいいし、
「緯度は35.681236、経度は139.767125」と言ってもいいわけです。

人間は東京駅集合と言われれば、おそらくなんとなく東京駅中央改札に集まるかと思います。
でも機械はアホなので、東京駅の警備員室なのか?東京駅の広場なのか?わからないのです。
なので、機械には緯度経度や電話番号、マップコードなどできちんと指定しないといけません。

インターネットでいうと見出し1、見出し2とかいうアバウトな表現はよくないのです。
料理も3分弱じゃなくて、3分10秒とか指定しないといけないのです。

Xpathというのはウェブサイト上の文字列の具体的場所、位置を指定する方法です。

ウェブサイトでは各パーツに場所やアドレスが指定されています

/html/body/div[1]/div[2]/main/div/div[2]/div[1]/div[2]/section[1]/div[2]/header/div[1]/h2

この意味不明な文字列がインターネットでいうパーツの「場所」を表すアドレスです。
ここを知ることでウェブサイトの指定の部品(=文字列)のみを抽出できます。

docs.google.com

こちらにアクセスすると証券コード登録メニューがありますので

こちらに自分の好きな証券コードを記入してください。

すると即時マーケット情報を取得してスプレッドシートに書き込んでくれますよ。


メニューを表示するのに使用したコード
function onOpen() {
  const ui = SpreadsheetApp.getUi();
  ui.createMenu("追加メニュー")
    .addItem("証券コード登録","registCode")
    .addToUi();
}

function registCode(){
  var code = Browser.inputBox("ウォッチしたい証券コードを入力してくだい");
  Browser.msgBox(code+"の銘柄をウォッチリストに追加しました")

  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const FValues = sheet.getRange('A:A').getValues();  //F列の値を全て取得
  const LastRow = FValues.filter(String).length;  //空白の要素を除いた長さを取得
  Logger.log(LastRow);

  var startRow = LastRow+1

  sheet.getRange(startRow,1).setValue(code);
  
}

この株式情報を取得するためには実は22行ほどコードをプログラミングしています。
プログラミングはちょっとハードルが高そうですが、たった書いたコードは 22行です。
これだけで誰でも使いやすいカスタマイズされたスプレッドシートが作成できてしまいます。
他にも色々応用できますので、ぜひ使ってみてください。