logo-sm

お問い合わせは Webフォームから

ブログ

GoogleスプレッドシートでGAS(Google Apps Script)を使ってスクレイピングする方法

2021.09.08

「他社のサイトの値を取得して分析して事業に役立てたい。」

そんな事をお考えの方、多いのではないでしょうか?

ただ、毎日見に行くのは大変です。

今回は、そんな方のためにスプレッドシートでGAS(Google Apps Script)を使ったスクレイピングの方法について記述します。

GAS(Google Apps Script)って何?

Googleのサービス(Google スプレッドシート、Google カレンダー、Google ドキュメントなど)内で動くプログラムです。

今回はGoogle スプレッドシートでプラグラムを動かしてみたいと思います。

エクセルでいうVBAみたいなものです。

 

スクレイピングって何?

「スクレイピング」とは、ウェブサイトからHTMLの情報を取得して、取得した情報の中から使いたい情報を抽出する事を言います。

スクレイピングは取得先のHTML構造が変わる可能性があり、取得できなくなる場合があるため監視が必要。

スクレイピングはルールを守って行いましょう。

スクレイピングでリクエストを送り続けるなど過度にサーバーにアクセスを送ってしまって逮捕された事例があるそうです。

こちらスクレイピングのルールに関してわかりやすい記事があったのでURLを添付しておきます。

スクレイピングは違法?3つの法律問題と対応策を弁護士が5分で解説

スクレイピングするための準備

スプレッドシートを開き、「ツール」内「スクリプトエディタ」をクリック。スクリプトエディタを開きます。

ライブラリの隣+ボタンクリック

ライブラリの追加で、スクリプトID入力欄に「1Mc8BthYthXx6CoIz90-JiSzSafVnT6U3t0z_W3hLTAX5ek4w0G_EIrNw」を入力し、検索をクリックし、検索結果が出たら追加を押します。

「Parser」というライブラリを使用します。

こちらで準備は整いました。

実際に値を取得してみる

今回は、こちらの「https://owlcamp.jp/」トップページの郵便番号を引っ張ってみたいと思います。

デベロッパーツールを使って取得したい箇所のHTMLを確認します。

今回はスプレッドシートの1行目、1列目に値を出力していきます。

参考のGASのコードです。

function myFunction() {

  // 取得したいURLを変数 getUrlに格納
  var getUrl = "https://owlcamp.jp/";
  var html = UrlFetchApp.fetch(getUrl).getContentText('UTF-8');

  //fromの括弧内に、取得したい箇所の前の記述を、HTMLを含み入れ込む。
  //toの部分に取得したい箇所の前の記述を、HTMLを含み入れ込む。
  result = Parser.data(html)
  .from('<span class="text">〒')
  .to(' 東京都文京区')
  .build();
  //スプレッドシート に入れ込む
   var sheet=SpreadsheetApp.getActiveSheet();
   sheet.getRange(1,1).setValue(result);

}


※重要箇所を色つきで記述してあります。値を変更すると取得できる値が変わります。
from('').to('')という記述はHTMLの行に対して対応させることができ、改行などには対応できないようです。

 

実行をクリックします。

はじめは、権限の確認を行わなければならない。「権限を確認」を押下

続いて出てきた確認で許可をクリック。

実行が完了

値が挿入される

取得できない値がある

調査していくうちに、先ほど記述した記述方法では取得できないケースがありました。

https://owlcamp.jp/company/

のページの「資本金」の箇所を取得する際、取得できませんでした。

 

理由は、このライブラリの「Parser.data(html) .from(‘<span class=”text”>〒‘) .to(‘ 東京都文京区‘) .build();」

という記述はHTMLの行に対して対応させることがしかできないため、

「<p>」という記述は他にもたくさんあり取得箇所を一意に特定できないためでした。

setDirection()を使って、読み込みを逆からに変更できる

setDirection()という記述を追加することにより.to()の中身が一意に特定できれば取得できる。

今回「1000万」を取得したかったので

「.to(‘円</p>’)」の箇所か一意に特定できたためsetDirection()という記述を入れ込むことにより、取得できた。

function myFunction() {

  // 取得したいURL
  var getUrl = "https://owlcamp.jp/company/";
  var html = UrlFetchApp.fetch(getUrl).getContentText('UTF-8');

  //fromの括弧内に、取得したい箇所の前の記述を、HTMLを含み入れ込む。
  //toの部分に取得したい箇所の前の記述を、HTMLを含み入れ込む。
  result = Parser.data(html)
  .setDirection()
  .from('<p>')
  .to('円</p>')
  .build();

  //スプレッドシート に入れ込む
   var sheet=SpreadsheetApp.getActiveSheet();
   sheet.getRange(1,1).setValue(result);
}

 

こちらで取得できました。

まとめ

  • あまりプログラミングが好きではない私でも使えたのでそんなに難しくない。
  • .to(”)の値でも一意に特定できない場合さらなる調査が必要。
  • 「Parser」というライブラリでうまく取得できない値がある場合、別の方法の検討も視野に入れる必要あり。少し調べましたが他にもスクレイピングできるライブラリはありそうです。

 

お時間ありましたら、GAS(Google Apps Script)の「Parser」というライブラリを使って、スプレッドシートでスクレイピングを試してみてください。

関連記事

  • 自宅に構築!仮想環境 ~BIG-IP VE導入編~
    【導入】 前回は、自宅サーバにProxmoxを導入しました。 今回はその上に仮想マシンとしてBIG-IP VE […]

    2024.09.30

  • 自宅に構築!仮想環境 ~Proxmox導入編~
    【導入】 以前から学習用に自宅仮想環境をつくりたく思っていたところ、BIG-IP(の仮想版)に触れる必要が出て […]

    2024.09.30

  • WindowsのWSL2上のDockerでup時に’ContainerConfig’のエラーが出た。
    当社の開発環境はMacとWindowsが混在したDocker上での開発を行っています。なのでMacでOKだけど […]

    2024.04.08

  • パートナー

  • 人材育成・採用情報