WEBスクレイピング-2
銘柄コードで株価データを取得するマクロ
スクリプトページを表示
スプレッドシートのメニューで「拡張機能」→「Apps Script」をクリックすると図の右側のようなスクリプトページが表示されます。すべてのスクリプトはこのページに記述します。
Parserライブラリの追加(本ソフトではあらかじめ設定済です)
WEBスクレイピングを行うためにGASには便利な[Parser]というライブラリがあるのでそれを利用します。
設定方法は下記のサイトを参考にしてください。
GASでスクレイピングする方法!Parserライブラリを利用した手順を解説 (https://auto-worker.com/blog/?p=2460)
ライブラリ欄の右の「+」をクリックするとParserライブラリの設定画面が出るので、下記のライブラリ・スクリプトIDをコピペして検索します。
Parserライブラリ・スクリプトID:1Mc8BthYthXx6CoIz90-JiSzSafVnT6U3t0z_W3hLTAX5ek4w0G_EIrNw
「Parser]をクリックして下図のように表示されれば正常です。
Parserライブラリの確認
「ライブラリ」ファイルの中に[Parser]があれば正常です。
スクレイピングの例
GASを使ったWEBスクレイピングではHTML情報から必要なデータをParserライブラリで抽出できます。下図は「銘柄名」と「日付」を抽出するParser構文の例で、from句とto句の間の部分が抽出されます。銘柄名と日付はfrom句/to句が簡単なので抽出も楽です。抽出する対象が1つの場合は構文の最後に build()を付けます。
(注意)サイトのHTML情報の構成が変わるとこの方法も変更が必要となるかもしれません)
②銘柄コード(code)を引数として与えて「銘柄名」と「日付」を抽出するマクロ : [Nikkei_StockDataScraping]
「銘柄名」と「日付」を抽出するスクリプトの説明
変数[stockInfo]は銘柄名や日付データを格納する配列(*1)で、配列の中では代入した順番に{ meigara : '花王' , date : '2022/10/7' }のように項目名とデータが対で格納されます。配列へはプロパティ(項目:key/値:value)の順番に代入されますが、呼び出し時はプロパティを指定すると任意に呼び出せる便利な変数です。
日経新聞の株価ページと銘柄コードを組み合わせて目的の銘柄のURLを指定し、URLフェッチ関数(UrlFetcApp)でHTML情報を変数htmlに格納します。
銘柄名の抽出:Parserライブラリはfrom()からto()までの間の文字列情報を抜き取る便利な関数です。
銘柄名は <h1 class="m-headlineLarge_text">花王</h1> のようになっているので htmlMei = Parser.data(html).from('<hi class="m-headlineLarge_text">').to('</hi>').build()で抽出できます。stockInfo['meigara'] = htmlMeiで配列に銘柄名を代入します。このプロパティはkey=meigaramei/value=htmlMeiとなります。
日付も同様に抽出してstockInfo['date'] = htmlDate で配列に代入します。銘柄名や日付のように抽出する内容が1つのみの場合、Parser構文の最後は build() とします。
(*1)stockInfo { } の変数を参考書などではオブジェクトと言われています(JSON形式と同じと思います)。オブジェクトという用語はあちこちで使われるので、紛らわしいですが、ここでは配列変数の一種として扱っています。この配列では、オブジェクト={ プロパティ1(キー): 値1 , プロパティ2(キー): 値2 , ・・・} のような集合体になっています。詳細は参考書などをご覧ください。
続いて「始値」「高値」「安値」を抽出する部分です。この3つは先のページの図1で左側の領域にあるデータです。
①変数定義:
items : Parserライブラリで抽出したリストデータを格納する配列。
itemColmun , itemValue : items配列の詳細
②左側部分をParserライブラリで抽出。この中の<li></li>の部分が3つあり、それをitems配列変数に代入。抽出するリストデータが複数あるのでParser構文の最後は iterate() とします。build()にすると1つしか得られません。
3つの部分をfor構文で順次読み取ります。items配列の初期値はitems[0]。この場合、始値などの項目名は不要で値のみがほしいので、項目名の部分はitmeColumnに代入し、値部分をitemValueに代入します。itemColumnに含まれる項目名に対応したデータ( includes('項目名')で判断)をstockInfo配列に代入します。stockInfoの項目 = 始値:open、高値:high、安値:low。
続いて「売買高(出来高)」「予想PER」「予想配当利回り」部分を抽出します。これは前ページの図1の右側の領域の部分です。若干HTML文は複雑ですが、基本的には先の左側の抽出方法と同じです。
stockInfoの項目名は、売買高(出来高): volume、予想PER: PER、予想配当利回り: yield
変数部分は変更なし。追加後のマクロは下記のようになります。
残る部分は株価画面の最初の現在値・前日比・前日比率の部分ですが、これは案外に抽出が面倒です。理由は前日比がプラス・マイナス・変わらずの変化があるので、それぞれに対応したParser構文にする必要があるためです。
変数の変更点は、7~8行目のstrValue: items配列の補足。zenjituhi(前日比)、hiritu(前日比率) 見かけは数字ですが、データは文字列です。
現在値・前日比・前日比率の抽出部分を追加したマクロは下記の通りです。これで一応完成です。
stockInfo配列の項目は、現在値: price、前日比: before_day、前日比率: before_day_ratio。前日比率は全角の[%]記号付きなので外して値を100分の1にします。これはシートに表示した後で半角[%]書式化するため。
現在値は、確定後のデータなので実質は当日の終値です。
最後は取得したデータを戻す部分です。
stockInfoに銘柄コードの情報がすべて含まれていますので抽出した株価情報を戻します。console.logの前の//を取ると実際の銘柄ごとのデータがデバッグ画面にプリントされます。
Parserライブラリの使い方まとめ
①HTML情報は似た部分があるので、目的の部分を探してその付近で切り出せるタグを目安に構文を書きます。銘柄名や日付のような簡単な部分は通常1つの項目なのでfrom/to/build()で抽出できます。
②始値・高値・安値のような類似項目は繰り返し形式(リスト)でHTMLが記述されていることが多いので、<li></li>などで構文を記述します。繰り返しの場合はfrom/to/iterate()で抽出します。