GASでやってみたかったことの、ほんのひとつ。
競馬データの収集。
手始めに、出走表を引っ張ってみた。
試してみたのは、GASのUrl Fetchサービスの利用。
これで指定したURLからHTMLを取ってきます。
そして、そのHTMLの変換には「Parser」という
ライブラリが便利と聞き、それも利用。
コードを書いてみては動かしてログを覗き、
実際の動作を体験してみる、を繰り返して、
ひとまずはやりたいことを達成。
const horseList = [];function getHorseList() {let html = UrlFetchApp.fetch(url).getContentText('shift-jis');let tbody = Parser.data(html).from('<tbody>').to('</tbody>').build(); //馬柱にあたるtbodyを抽出let trs = Parser.data(tbody).from('<tr>').to('</tr>').iterate(); //馬番毎のデータをtrsに格納
for(const tr of trs) {let num = Parser.data(tr).from('<td class="num">').to('</td>').build(); //馬番を取得
let name_line = Parser.data(tr).from('<div class="name_line">').to('</div>').build();let nameClass = name_line.replace('<div class="name">',''); //divのまとまりがズレるlet aTag = nameClass.slice(0, 61); //DBの値が異なるので、一旦桁数で文字列を抽出let name = Parser.data(nameClass).from(aTag).to('</a>').build();
horseList.push(num + ':' + name); //馬番と馬名を配列に格納}Logger.log(horseList);}
このあたりはおいおい別の形で柔軟に指定したいところ。
当たり前ながら、普段は「予想」の観点でしか馬柱を見ていないが、
HTMLソースを覗いてびっくり!
なかなかに複雑な構成になっていました。(当たり前か)
現状の所感として・・・
- letとconstの使い分けがまだ怪しい
- 文字抽出にParserだけでは不足がありそう
- たのしい
特にGASでのスクレイピングではセットで紹介されているParserが、
divなど同じタグがネストされている時に、呼応する閉じタグを見れていない様子。
このあたりは理解が追い付いていない可能性もあり、引き続き調べてみよう。
やりたいことをやってみる、がこの手の学習には不可欠ですね。