はじめに
今回はGAS(Google Apps Script)でスクレイピングをする際に、Parserライブラリを使ってhtmlを解析する方法について書いていきます。
GAS上でParserを使用できる状態に設定する方法や、実際のスクレイピングで取得したhtmlの解析方法についても触れています。
Parserライブラリの追加
Parserを使用すると、スクレイピングを実行した際、取得したhtmlから特定の部分を抽出したりすることができます。
このライブラリを使用するためには、あらかじめ追加して使用できる状態にしておくことが必要なので、スクレイピング用のコードを書いていく前にやっておきましょう。
まずはスクリプトエディタの画面を開いた状態で、ライブラリの「+」を押します。
するとスクリプトIDを入力する画面が出てきますので、以下のParserのIDを入力して検索します。
スクリプトID:1Mc8BthYthXx6CoIz90-JiSzSafVnT6U3t0z_W3hLTAX5ek4w0G_EIrNw
検索結果として「Parser」のライブラリが出てきますので、バージョンを選んで、「追加」を押します。
バージョンは記事執筆時点で最新の「8」を選択しました。
スクリプトエディタを見ると、Parserのライブラリが追加されました。これでOKです。
Parserを用いたスクレイピングコードの例
ここでは例として下のサイトから、東京の花粉の飛散状況を取得してみます。
tenki.jp
東京の花粉飛散状況については、赤枠の部分のhtmlで表されています。
<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>';
で指定した文字列で囲んだ部分が抽出されます。
つまり、以下の赤枠を指定すると、緑枠が取得されることになります。
上記で抜き出した
<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 = '">';
で囲まれた部分を抽出しています。
すると最終的に「東京都:非常に多い」という結果が出力されます。
このように、Parserを使用してスクレイピング対象のページから指定した部分の情報を取得することができます。