Google スプレッドシートとGASでWebサイトのスクレイピング

Webサイト内の情報を自動的に取得する技術をスクレイピングといいます。

とある所用でVBAを使ってつくってほしいと依頼されたものの、対象のサイトではIEが未対応(VBAではIEを使ってスクレイピングをかけます)でうまく取得できませんでした。

Webサイトの運営者ならご存じだと思いますが、今やIEは機能的に乏しくコーディングする時も「ブラウザがIEなら……」と例外処理をするほど。

つまりVBAでスクレイピングのマクロをつくっても将来的に使えなくなる可能性が高そうです。まぁEdgeに移行するでしょうけども。

そこで前々から気になっていたGAS(Google Apps Script)を使ってスクレイピングをしてみることにしました。ついにGASデビューです。

スポンサーリンク

ドキュメントで取得したHTMLを確認する

対象となるHTMLを確認するには、ブラウザのデベロッパーツールを使用すれば可能ですが、スクリプトで取得した内容も含むためGASで取得できる内容と同じとは限りません。

GAS上で確認するにはログを表示させればいいのですが、こちらは字数制限があるためHTMLの場合ほとんど非表示になります。

そういうわけで、Google ドキュメント上に取得したソースを吐き出させます。

アクティブなドキュメントに出力します。

ただし、あまりにサイズが大きいと一度に保存ができずエラーが返ってきます。その場合は素直にソースを見た方がいいかも。

Yahoo! Japanのニュースヘッドラインを取得

例として、Yahoo! Japanのトップページにあるニュースのヘッドラインのタイトルを取得しましょう。

8つ分ニュースがあるので、繰り返し処理を行います。

さらに各リンク先にアクセスして、そのページ内の見出しを取得します。

  • UrlFetchApp.fetch(ソースを取得するURL):引数で指定されたページにアクセスしてソースを取得
  • SpreadsheetApp.getActiveSheet():アクティブなGoogle スプレッドシートを取得
  • new RegExp(/●●●.*?▲▲▲/g):正規表現。●●●と▲▲▲に囲まれた範囲を取得
    • .*?は不特定数の文字列、gフラグはマッチしたすべてを返す
    • /で囲む。/を含む文字列の場合は/の前に\(バックスラッシュ)を付ける
  • .match(指定文字列)[i]:指定した文字列にマッチした範囲を取得。iは何番目かを表す(0スタート)
    • replace(置換する文字列, 置換後の文字列)

結果はこうなりました。

豆知識ですが、Yahoo! Japanのトップページのヘッドラインは、13文字以内に収めて意味が伝わるように工夫されています。

パッと見て認識できるのがだいたいこの文字数だからとか、あるいはただ単にレイアウトの都合上この文字数に収めるようにしているとかなんとか。

Phantom JSを使ってスクリプト込みのページを取得

ソースのほとんどがスクリプトによって生成される場合、Phantom JSというヘッドレスブラウザを使用します。

このPhantom JSはサポートが終了しているため、将来性を考えないといけませんが、とりあえずプログラムを動かすということで。

https://phantomjscloud.com/へアクセスし、右上のLog InからログインしてApi Keyを取得します。

無料だと1日あたり500回まで読み込みが可能です。大量のページを取得するのであれば回数を気にした方がいいですね。こちらは実際のサイトではなくサンプル化させたコードです。

とある所用でつくっていたコードをサンプル化しました。

流れとしてはトップページのリンク先の一覧からタイトルとURLを取得し、そのURLを使って再度取得しページ内の情報をスクレイピングするというものです。

RegExpは配列としてデータを格納するので、lengthで最大数を取得できます。これを使ってループをかけています。Yahoo!の方でもこれ使えばよかったですね。

とりあえずこんなところで。他に良いやり方があればここに追記します。

ぶっちゃけスクレイピングはPythonのオハコらしいので、Pythonを勉強した方がよかったのかもですが。

コメント

タイトルとURLをコピーしました