
前回、「みんかぶFX 経済指標カレンダー 予想&速報」から指標データを取得するために、HTMLファイルに隠されているJSONデータについて解説しました。
今回は、Google Apps Scriptを使ってJSON形式のデータを取得する方法を解説していきます。
MetaTraderへ渡すデータ形式は?
「みんかぶFX」のWebサイトからJSON形式のデータを読み取るのですが、MetaTraderへ渡すデータの形式、つまりMQLで読み取るためのデータ形式はどのようなものがよいでしょうか?
MQLはチャート操作やFXトレードに関しては、とても便利な関数やライブラリがそろっているのですが、それ以外のことはあまり得意ではありません。
C#やJavascriptのような汎用プログラミング言語ではないので仕方ないのですが、調べてみるとMQLでJSONを比較的簡単に操作できるライブラリがあることがわかりましたので、今後のことも考えてJSONのまま取得する方法を考えてみます。
JSONの構造
「みんかぶFX 経済指標カレンダー 予想&速報」のHTMLに隠されているJSONを改めてみてみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
[ { "@context": "http://schema.org", "@type": "Event", "name": "ドイツ・小売売上高", "startDate": "2017-11-27T00:00:00+09:00", "description": "ドイツ連邦銀行が発表。個人消費を見る上で基本的な指標。翌々月の初旬発表。", "url": "https://fx.minkabu.jp/indicators/DE-RS" }, { "@context": "http://schema.org", "@type": "Event", "name": "香港・貿易収支", "startDate": "2017-11-27T17:30:00+09:00", "description": "", "url": "https://fx.minkabu.jp/indicators/HK-TB" } ] |
「重要度」「前回変動幅」が含まれていないという問題に加えて、日付データなどはMQLでは、若干扱いにくい形式です。
“2017-11-27T17:30:00″を2017、11、27、17、30、00に分解する必要があります。
こういったものは、Javascriptで分解するほうが楽なハズなので、サーバー側で分解しておくことにします。
また、”@context”や”@type”は不要なので、必要のない要素もカットしてMetaTraderには返すことにします。
さて、次はいよいよGoogle Apps Scriptをつかって「みんかぶFX」からJSONデータを取得して、あらたなJSONデータに再成形して出力するスクリプトを記述していきます。
Google Apps Scriptへライブラリの追加
今回取得するJSONデータは、HTMLの中に埋め込まれている(隠されている?)ので、まずはHTMLをパースして該当箇所の要素を取得する必要があります。
Google Apps Scriptには、標準でHTMLをパースするライブラリが無いのでライブラリを追加します。
GoogleドライブにGoogle Apps Scriptを新規作成した後、メニューから「リソース」ー「ライブラリ」を選択します。
「Parser」というHTMLをパースするライブラリを追加します。
「ライブラリを検索」に M1lugvAXKKtUxn_vdAG9JZleS6DrsjUUV を入力して選択を押してください。
「Parser」が追加されると以下のような画面になります。バージョンは7にしてください。
これで追加は完了です。
JSONをパース
元のJSONから必要な要素だけ抜き取って、シンプルな構造のJSONとして再形成して出力します。
以下のような、シンプルな形のJSONにしてみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[ { "Date": "2017-11-27T00:00:00+09:00", "Name": "ドイツ・小売売上高", "Year": 2017, "Month": 11, "Day": 27, "Hour": 0, "Min": 0, "Description": "ドイツ連邦銀行が発表。個人消費を見る上で基本的な指標。翌々月の初旬発表。", "Star": 1, "Pips": -4 } ] |
先にも述べたように”Date”を扱いやすいように、”Year”,”Month”,”Day”,”Hour”,”Min”に分解します。
また、重要度は”Star”、前回変動幅は”Pips”という値で格納します(スクレイピングで取得するので、次回解説します)。
ライブラリから追加した「Parser」でHTMLのJSON部分を読み込み、元のJSONのパラメータを取得して、新たなJSONとして文字列に出力します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
// リソース - ライブラリ から Parserを追加してください // Parser : M1lugvAXKKtUxn_vdAG9JZleS6DrsjUUV function GetEconomicIndicator() { var output = []; // みんかぶFX1の経済指標カレンダーを読み込む(JSON/スクレイピング) var html = UrlFetchApp .fetch('https://fx.minkabu.jp/indicators') .getContentText("UTF-8"); // -------- JSON形式で取得 ------------ var jsonData = Parser.data(html) .from('<script type="application/ld+json">') .to('</script>') .build(); var json = JSON.parse(jsonData); for (i = 0; i < json.length; i++) { var js = json[i]; var ds = new Date(js.startDate); var element = {}; element["Date"] = js.startDate; element["Name"] = js.name; element["Year"] = Number( Utilities.formatDate(ds, "GMT+9", "yyyy") ); element["Month"] = Number( Utilities.formatDate(ds, "GMT+9", "MM") ); element["Day"] = Number( Utilities.formatDate(ds, "GMT+9", "dd") ); element["Hour"] = Number( Utilities.formatDate(ds, "GMT+9", "HH") ); element["Min"] = Number( Utilities.formatDate(ds, "GMT+9", "mm") ); element["Name"] = js.name; element["Description"] = js.description; output.push(element); } return ContentService.createTextOutput( JSON.stringify(output) ); } |
9〜11行目:HTML取得
みんかぶFXからHTMLをテキストで取得します。
Google Apps Scriptには、URLを指定するとHTTP(S)のリクエストを取得できるURLFetchAppクラスが提供されていますので、それを利用しています。
14〜17行目:JSON部分を抽出
取得したHTMLから、JSON部分を抜き出します。
追加したライブラリParseを使います。fromで指定した文字列から、toで指定した文字列を取得します。
18〜20行目:DOM
取得した文字列はJSON形式のデータなので、JSONクラスに渡してパースします。
JSONクラスでパースした結果は、発表予定の指標の個数分配列で返却されますので、個数分の内容を解析していきます。
22〜35行目:DOMで要素を抽出
js.startDateのようにDOMの要素から値を取得し、新たにJSON形式でテキスト出力します。
js.startDateで取得される日付の形式が、ISO8601と呼ばれる形式になっていますので
西暦、月、日、時、分は整数値として分解しておきます(27〜31行目)。
JavaScriptでJSON形式を生成するのは、本当に簡単ですね。
JSON.stringify()で、JSONの出力イメージ通りにコーディングすれば勝手にテキスト化されています。(C/C++とかから、入った私としては驚異です 笑)
まとめ
今回は、「みんかぶFX」のHTMLからJSON形式でデータ抽出して、あらたなJSON形式のデータとして出力する部分を解説しました。
次回は、「重要度」「前回変動幅」をスクレイピングする部分を解説します。