77Lifeworkベータ版

77Lifeworkベータ版

IT関係の話(ツール開発・インフラ構築)をメインとして、その他私の趣味や雑記用のブログです。ここに書いた内容が少しでも参考になれば嬉しいです。

GASでParserライブラリを使ってスクレイピングする方法

はじめに

今回はGAS(Google Apps Script)でスクレイピングをする際に、Parserライブラリを使ってhtmlを解析する方法について書いていきます。
GAS上でParserを使用できる状態に設定する方法や、実際のスクレイピングで取得したhtmlの解析方法についても触れています。

Parserライブラリの追加

Parserを使用すると、スクレイピングを実行した際、取得したhtmlから特定の部分を抽出したりすることができます。
このライブラリを使用するためには、あらかじめ追加して使用できる状態にしておくことが必要なので、スクレイピング用のコードを書いていく前にやっておきましょう。

まずはスクリプトエディタの画面を開いた状態で、ライブラリの「+」を押します。
f:id:J-back:20210302002700p:plain:w600



するとスクリプトIDを入力する画面が出てきますので、以下のParserのIDを入力して検索します。
スクリプトID:1Mc8BthYthXx6CoIz90-JiSzSafVnT6U3t0z_W3hLTAX5ek4w0G_EIrNw
f:id:J-back:20210302002908p:plain:w600



検索結果として「Parser」のライブラリが出てきますので、バージョンを選んで、「追加」を押します。
バージョンは記事執筆時点で最新の「8」を選択しました。
f:id:J-back:20210302003311p:plain:w600



スクリプトエディタを見ると、Parserのライブラリが追加されました。これでOKです。
f:id:J-back:20210302003533p:plain:w600

Parserを用いたスクレイピングコードの例

ここでは例として下のサイトから、東京の花粉の飛散状況を取得してみます。
tenki.jp


東京の花粉飛散状況については、赤枠の部分のhtmlで表されています。
f:id:J-back:20210304004009p:plain:w600

<a href="/pollen/3/">
  <span>東京都</span><br>
  <img src="https://static.tenki.jp/images/icon/pollen/default/icon-large-4.png" width="40" height="40" alt="東京都:非常に多い">
</a>


ここではスクレイピングによって取得したページ全体のhtmlから、上記の「東京都:非常に多い」の部分を抜き出すようにします。
コードは以下の通りです。

function pollen() {
  let URL = "https://tenki.jp/pollen/";
  
  let fromText1 = '<a href="/pollen/3/">';
  let toText1 = '</a>';
  
  let html = UrlFetchApp.fetch(URL).getContentText("UTF-8");
  
  let result1 = Parser.data(html)
  .from(fromText1)
  .to(toText1)
  .build();
  
  Logger.log(result1);
  
  
  let fromText2 = 'alt="';
  let toText2 = '">';
  
  let result2 = Parser.data(result1)
  .from(fromText2)
  .to(toText2)
  .build();
  
  Logger.log(result2);
  
}


コードの動作に関してですが、

let URL = "https://tenki.jp/pollen/";

スクレイピングしたいサイトのURLを指定し、

let html = UrlFetchApp.fetch(URL).getContentText("UTF-8");

によって、取得したhtmlを変数に格納しています。

また、

let result1 = Parser.data(html)
  .from(fromText1)
  .to(toText1)
  .build();

によってhtmlの中から指定した部分のみを抽出しています。

抽出する部分の指定方法ですが、

let fromText1 = '<a href="/pollen/3/">';

let toText1 = '</a>';

で指定した文字列で囲んだ部分が抽出されます。

つまり、以下の赤枠を指定すると、緑枠が取得されることになります。
f:id:J-back:20210304005341p:plain:w600


上記で抜き出した

<span>東京都</span><br><img src="https://static.tenki.jp/images/icon/pollen/default/icon-large-4.png" width="40" height="40" alt="東京都:非常に多い">

から、さらに

let fromText2 = 'alt="';

let toText2 = '">';

で囲まれた部分を抽出しています。

すると最終的に「東京都:非常に多い」という結果が出力されます。
f:id:J-back:20210304004458p:plain:w600



このように、Parserを使用してスクレイピング対象のページから指定した部分の情報を取得することができます。

おわりに

以上で今回の記事は終わりです。

GASは無料な上に、Googleのプラットフォーム上で動作させるので自分のPCに動作環境を準備する必要がなく、手軽に使用できますね。
Parserライブラリを使用することで、結構シンプルにスクレイピングプログラムを組むことができます。
興味があればぜひ使ってみてください。

最後まで読んでいただきありがとうございました。