
前回、「みんかぶFX 経済指標カレンダー 予想&速報」からGoogle Apps Scriptを使ってJSON形式で経済指標データを取得して、JSON形式で出力する方法をご紹介しました。
今回は、HTMLをスクレイピングして「重要度」「前回変動幅」を取得します。
[2017/11/21追記]
2017年11月21日に「みんかぶFX 経済指標カレンダー」のJSON部分が変更されました。
当初、11月20日に記事を執筆・アップしていたのですが、全面的に書き換えました。
やはりAPIとして公開されていないものを使う(スクレイピングする)のは、こういうことを覚悟しないといけないですね。
Webページの構造を把握する
まず、「みんかぶFX 経済指標カレンダー 予想&速報」がどのような構造のページになっているかを調べます。
取得したい(スクレイピングしたい)値が、どのようなタグで囲まれているのか?を見ていきます。
経済指標を表示している箇所は、おおむね以下のような構造になっています。
「重要度」はHTML上では数値で示されているところはなく、「★」画像の数(Star fillの数)をカウントする他なさそうです。(5)。
「前回変動幅」は、<td>タグで囲まれた”-1.6″という数値をすればよさそうです(6)。
スクレイピングのソースコード
このWebページの構造を踏まえた上で、スクレイピングするソースコードです。
ほとんどはJSONで取得して、足りない重要度、前回変動幅の部分だけは、HTMLの表から取得するようにしているためプログラムすこし複雑になっています。
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 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
// リソース - ライブラリ から Parserを追加してください // Parser : M1lugvAXKKtUxn_vdAG9JZleS6DrsjUUV function GetEconomicIndicator() { var output = []; // みんかぶFX1の経済指標カレンダーを読み込む(JSON/スクレイピング) var html = UrlFetchApp.fetch('https://fx.minkabu.jp/indicators') .getContentText("UTF-8"); // -------- スクレイピングで取得 -------- // (1)指標の表(スクレイピング用) var shihyo = Parser .data(html) .from('<div class="l-section_interval">') .to('</div>').build(); // (2)6日分の表(スクレイピング用) var shi6Days = Parser .data(shihyo) .from('<table class="ei-list tbl_s mb20em">') .to('</table>').iterate(); // インデックス(スクレイピング用) var index1 = 0; var index2 = 0; // -------- 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; // (3)1日分の表(スクレイピング用) var shihyoOneDay = Parser .data(shi6Days[index1]) .from('<tr class="ei-list-item') .to('</tr>').iterate(); var shihyoEach = shihyoOneDay[index2]; index2 ++; if (shihyoOneDay.length == index2) { index1 ++; index2 = 0; } // (5)重要度 var starList = Parser.data(shihyoEach) .from('class="star">') .to('</td>') .build(); var starArray = Parser.data(starList) .from('alt="Star fill') .to('>') .iterate(); element["Star"] = starArray.length; // (6)前回変動幅(スクレイピング用) var pips1 = Parser.data(shihyoEach) .from('<td class="hl ') .to('</td>') .build(); var pips2 = Parser.data(pips1) .from('<span class="fz_s">') .to('</span>') .build(); var num = 0; if (pips2 == "pips") { num = Parser.data(pips1) .from('>') .to('<') .build(); } element["Pips"] = Number(num); output.push(element); } return ContentService.createTextOutput( JSON.stringify(output) ); } |
ポイントは、スクレイピングする箇所を泥臭く切り出す作業をいかにマメにやっていくか・・・です。
たとえば、13〜17行目、
13 14 15 16 17 |
// (1)指標の表(スクレイピング用) var shihyo = Parser .data(html) .from('<div class="l-section_interval">') .to('</div>').build(); |
<div class=”l-section_interval> から </div>までのテキストを切り出す・・・という作業をしています。
そして、19~23行目でさらに、
19 20 21 22 23 |
// (2)6日分の表(スクレイピング用) var shi6Days = Parser .data(shihyo) .from('<table class="ei-list tbl_s mb20em">') .to('</table>').iterate(); |
<table class=”ei-list tbl_s mb20em”> から </table> までの文字列を切り出す・・・という作業を行い、目的の文字列が取得できるまで繰り返していきます。
コメント(//)で(1)〜(6)としているのが該当箇所になりますので、どのようなことをやっているかを確認してみてください。
さいごに
これでGoogle Apps Scriptを使って、みんかぶFXの経済指標から必要なデータを取得して、MetaTraderで使いやすいようにJSONに成形するところまでできました。
次回は、これをMQLから呼び出すところを解説していきたいと思います。