【GAS】WEBサイト上の経済指標をスクレイピングする方法

[GAS] indicator scraping お役立ち集
この記事は約8分で読めます。

こんにちは。Canaryです。久方ぶりのお役立ち情報😂

経済指標を取っているEAはちらほら見かけますが、「スクレイピングで経済指標を取得」的なキーワードも最近よく見かけるようになって気になっていました。

ということで、早速Canaryもやってみたので共有です!!

本記事では、経済指標の取得元サイトとしてみんかぶFXを例にしていますが、あくまでプログラミングのサンプルとして記載したものであり、みんかぶFXからの情報取得を推奨するものではありません。

また、本記事の内容を実行・模倣したことに伴う損失・損害の責任は一切負わず、いかなる保証もいたしません。

スポンサーリンク

【今回トライした内容は!?】

FXされている方にはおなじみの みんかぶFXの経済指標ページ を例にして、Google Apps Script (GAS) からWEBスクレイピングし、掲載されている経済指標をリスト化して返す関数を作成しました。

項目内容
実行環境Google Apps Script (GAS)
入力みんかぶFXの経済指標ページ
出力全経済指標のリストデータ
※一部プログラムから使いやすいように整形
【今回のトライの仕様】


下の画像が2022/9/16の「みんかぶFXの経済指標ページ」の表示内容です。

Canary
Canary

「前回ドル円変動幅」の情報があるのが

このページを選んだ大きな理由です!

みんかぶFX
【みんかぶFXの経済指標ページ】


この内容をGASでスクレイピングし、以下のようにArrayでリスト化します。


パラメータ内容
country経済指標の対象国
title経済指標のタイトル
time時刻 (日本時間)
unixtime時刻をUNIX時間に変換したもの
stars重要度の星の数
pips前回ドル円変動幅
points前回ドル円変動幅 (pips) を
10倍して整数化したもの
【リスト内の各パラメータの内容】

【みんかぶFXをスクレイピング→リスト化】


「前回」「予想」「結果」のデータは現状入れていませんが、下のコードに数行追加するだけで対応可能です。

スポンサーリンク

【コードはこちら!】

GASで提供する Parserライブラリ と正規表現をうまく使えば40行程度での実装で済みます。

ParserライブラリでHTMLタグを検索していって、目的の文字列を取得→データ化している感じです。

該当サイトのHTMLコードを「Parserライブラリで検索しているタグ (“<main”等)」で検索すると、理解しやすいと思います。 検索にはブラウザのデベロッパーツールが便利です。


重要事項:コピペの前に

EAその他のクライアントからリクエストされる度にスクレイピングが実行されるような構成は絶対に避けてください!!

例)「doGet() から直接本関数を毎度呼び出す」

該当ページへのアクセス数が大きく増加して、取得元サイトにご迷惑を掛ける可能性があります。

GASはスプレッドシートとの連携が容易なので、本関数で取得した内容をスプレッドシートにキャッシュするのが上策と考えます。


/* ------------------------------------------------------------------
 * [Function] getEconomicIndicators
 * ------------------------------------------------------------------ */
function getEconomicIndicators() {
  const indicators = [];
  const content = UrlFetchApp.fetch('https://fx.minkabu.jp/indicators').getContentText("UTF-8");
  const main = Parser.data(content).from('<main').to('</main>').build();

  //--- Extract <table>
  Parser.data(main).from('<table class="tbl-border ').to('</table>').iterate().forEach(tbl => {
    //--- Extract date
    const caption = Parser.data(tbl).from('<caption class="tbl__caption ').to('</caption>').build();
    const dateInUnixEpochMillis = Date.parse(caption.replace(/.*(\d{4})年(\d{2})月(\d{2})日.*/, '$1-$2-$3T00:00:00+09:00'));

    //--- Extract <tr>
    Parser.data(tbl).from('<tr').to('</tr>').iterate().forEach(tr => {
      if (tr.indexOf('href=') == -1) { return; } //--- Empty row

      //--- Extract country and title
      const indicator = {}
      indicator.country = Parser.data(tr).from('<img alt="').to('"').build();
      indicator.title = Parser.data(tr).from('<p class="flexbox__grow fbd">').to('</p>').build();

      //--- Extract <td>
      Parser.data(tr).from('<td').to('</td>').iterate().forEach(td => {
        if (td.indexOf('eilist__time') >= 0) {
          //--- Extract time
          const unixtimeInMillis = dateInUnixEpochMillis + Date.parse(td.replace(/[\s\S]*<span>(\d{2}:\d{2})[\s\S]*/, '1970-01-01T$1:00+00:00'));
          indicator.time = new Date(unixtimeInMillis).toLocaleString({ timeZone: 'Asia/Tokyo' });
          indicator.unixtime = unixtimeInMillis / 1000;
        } else if (td.indexOf('eilist__star') >= 0) {
          //--- Extract stars
          indicator.stars = (td.match(/Star fill/g) || []).length;
        } else if (td.indexOf('eilist__move') >= 0) {
          //--- Extract pips
          const existPipsData = (td.indexOf('pips</span>') >= 0);
          indicator.pips = existPipsData ? td.replace(/[\s\S]*<span>(.*)pips<\/span>[\s\S]*/, '$1') : '---';
          indicator.points = existPipsData ? parseInt(parseFloat(indicator.pips) * 10) : 0;
        }
      });
      indicators.push(indicator);
    });
  });

  return indicators;
}
スポンサーリンク

【まとめ】

GASでスクレイピングして経済指標を取得するサンプルコードをご紹介しました。

注意点としては、取得元サイト (本例ではみんかぶFX) の仕様が変われば、本コードは途端に動作しなくなる ということが挙げられます。
#スクレイピングの辛いところ…

また、そのような状態になってもCanaryがこのコードを今後更新するとは限りませんので、その点もご承知おきください。


しかし、GAS側に取得ロジックを置いて情報をキャッシュすることにより、

  • (EAを更新せずに) GAS側の更新だけで「取得元サイトの仕様変更」「取得元サイト自体の移行」に対応できる。
  • 取得元サイトにEAから直接アクセスするのに対して、アクセス数を大幅に減らすことができる。

という2つの大きなメリットが得られます。

EAで外部情報を取得されている方には、是非このような「GAS等の自己管理するサーバーでワンクッションを置く」構成とすることをお勧めしたいです。

Canary
Canary

最後に繰り返しですが、取得元サイトへのDoS攻撃

にだけはならないようにご注意を!!

■2022/9/19追記
EAに経済指標を試しに配信して表示するところまでできました!

上記のコードとは別に「指標データの定期取得~スプレッドシートへの保存」と「Web APIによる配信」をしている感じです。 この内容はまた別途記事にします。


コメント

タイトルとURLをコピーしました