プログラミング学習

GASでWebスクレイピングした結果をGoogleスプレットシートに反映させてみる

世間の声1
世間の声1
プログラミングで何かツールを作りたい!
世間の声2
世間の声2
文字列出力だけじゃつまらん!
KEN
KEN
それなら簡単なスクレイピングツール作ってみましょう!

 

どうも、医療系エンジニアKENです。

今回はGoogle Apps Script(GAS)で簡単なWebスクレイピングツールを作ってみようと思います。

GASってなんなの?どうやって使うの?という人は以下の記事をご参考ください

プログラミングを始めてみたい人にはGoogle Apps Script(GAS)がおすすめプログラミングを学んで作業効率化ツールのようなものを自分で作ってみたいという人には、Googleが提供しているプログラミング言語であるGoogle Apps Scriptがおすすめです。 Google Apps Scriptの概要と始め方についてまとめました。...

 

前提知識としてある程度の
プログラミング基礎知識
(HTMLタグ、変数、関数、引数)が必要な内容となりますことをご了承ください。

progeteでHTMLとJaveScriptを
一通り学習したレベルであれば理解できる内容です。

前提知識に不安があるという人は、
以下の記事を参考に学習を進めるのがおすすめです。

プログラミング初心者に向けたおすすめの学習法についてプログラミング初心者向けにおすすめの学習法を未経験で転職した現役エンジニアがまとめました。...

 

GASでWebスクレイピングツールを作る

今回の記事は以下の内容となります。

  1. そもそもスクレイピングとは何なのか
  2. GASでスクレイピングプログラムを作るための準備
  3. スクレイピング ソースコード解説
  4. スクレイピングをするときの注意点

詳細は以下にまとめました。

スクレイピングとは?

スクレイピングとは、データを収集し、
扱いやすく加工することです。

例えば、あるWebサイトの中から特定のキーワードが使われている部分を取得したり、
見出し部分を一括取得して一覧表示するなどの操作です。

マーケティング、サービス開発、機械学習などに使われます。

GASの準備

スプレットシートでスクリプトエディタを開く

今回はGoogleスプレットシートを使います。

Googleスプレットシートで新規ファイルを作成し、
「ツール」メニューから
「スクリプトエディタ」を開きます。

以下の記事で画像付きでより詳しくスプレットシートでのGASの使い方を解説してますので、こちらもご参考ください。

プログラミングを始めてみたい人にはGoogle Apps Script(GAS)がおすすめプログラミングを学んで作業効率化ツールのようなものを自分で作ってみたいという人には、Googleが提供しているプログラミング言語であるGoogle Apps Scriptがおすすめです。 Google Apps Scriptの概要と始め方についてまとめました。...

 

ライブラリをインポートする

今回のプログラムでは、Parserというライブラリを使います。

ライブラリとは、簡単にいうと便利な機能を持つ関数などがあらかじめ用意されているプログラムのことです。

スクレイピングをするのに使える便利な関数はParserにいろいろあるので、
今回はこのParserをインポート(GASで使えるように取り込むこと)することで、
簡単にスクレイピングプログラムを作ることができます。

Parserをインポートする方法

まずは開いたスクリプトエディタを確認してください。

以下の画像のようなエディタは最新のGASのエディタです。

枠内の「以前のエディタをを使用」ボタンを押して、旧エディタに切り替えてください。
(理由は後ほど)

 

エディタが旧エディタに切り替わったら、「リソース」ボタンを押して、
「ライブラリ」ボタンを押してください。

 

ライブラリの管理画面が開きます。
画面下部に以下の画像のようなテキストボックスがあります。

 

そこに以下のParserプロダクトキーを入力して「追加」ボタンを押してください。

M1lugvAXKKtUxn_vdAG9JZleS6DrsjUUV

 

Parserが表示されます。

あとは、バージョンを「7」に指定して保存ボタンを押せばParserが使えるようになります。

 

旧エディタでインポートする理由

新しいエディタから、今回紹介したプロダクトキーを使ってParserを検索しても見つけられません。

ですので、上記のプロダクトキーを使う際は必ず旧エディタに切り替えてからParserを検索して追加してください。

使用に関しては、新しいエディタでも使えますので、インポート後に新しいエディタに切り替えればOKです。

スクレイピング ソースコード

以下がソースコードになります。

function myFunction() {
  // スクレイピングの結果を書き込むスプレットシートを取得する
  // 取得したいスプレットシートのURL
  // https://docs.google.com/spreadsheets/d/*********************************************/edit#gid=0
  // *の部分、d/と/editの間の文字列をopenByIdの引数として渡す
  var spreadsheet = SpreadsheetApp.openById('');

  // 取得したスプレットシートから、現在使用しているアクティブなシートを取得する
  var sheet = spreadsheet.getActiveSheet();

  // 入力された調べたいサイトのURLを取得する
  var getUrl = sheet.getRange("C2").getValue();

  // 調べたいサイトのURLにアクセスし、その応答を文字コードUTF-8の文字列として取得する
  var html = UrlFetchApp.fetch(getUrl).getContentText('UTF-8');

  // h3タグに囲まれた文字列を配列として取得する
  var title_list = Parser.data(html).from('<h3>').to('</h3>').iterate();

  // 最終行を取得
  var lastrow = sheet.getLastRow();
  // 書き込む行は最終行の次の行から
  var recordrow = lastrow + 1;

  for(var i = 0; i <= title_list.length-1; i++){
      sheet.getRange("A" + recordrow).setValue(title_list[i].replace(/<("[^"]*"|'[^']*'|[^'">])*>|\r\n|\n|\r/g,''));
      recordrow++;
  }
}

 

大まかな流れとしては

  1. 操作対象になるスプレットシートを取得する
  2. スクレイピングしたいサイトのURL情報を取得する
  3. スクレイピングしたいサイトから今回はh3タグを全て取得する
  4. 取得した結果を全てスプレットシートに書き込む

以下それぞれの工程でポイントとなるところを解説します。

操作対象のスプレットシートを取得する

  // スクレイピングの結果を書き込むスプレットシートを取得する
  // 取得したいスプレットシートのURL   //https://docs.google.com/spreadsheets/d/*********************************************/edit#gid=0
  // *の部分、d/と/editの間の文字列をopenByIdの引数として渡す
  var spreadsheet = SpreadsheetApp.openById('');

  // 取得したスプレットシートから、現在使用しているアクティブなシートを取得する
  var sheet = spreadsheet.getActiveSheet();

上記の部分がスプレットシートの取得です。

openByIdの引数に操作するスプレットシートのURLのd/と/editの間にある部分を入力してください。

スクレイピングしたいサイトのURL情報を取得する

  // 入力された調べたいサイトのURLを取得する
  var getUrl = sheet.getRange("C2").getValue();

スプレットシートからスクレイピングするサイトのURLを取得します。

今回はスプレットシートの2行目C列にスクレイピングするサイトのURLを入力するとします。

getRange関数の引数に”C2″と指定し、getValue関数でC2セルの値を取得して変数getUrlに代入します。

スクレイピングしたいサイトから指定したHTMLタグを全て取得する

  // 調べたいサイトのURLにアクセスし、その応答を文字コードUTF-8の文字列として取得する
  var html = UrlFetchApp.fetch(getUrl).getContentText('UTF-8');

  // h3タグに囲まれた文字列を配列として取得する
  var title_list = Parser.data(html).from('<h3>').to('</h3>').iterate();

サイトにアクセスして、その応答をHTMLとして取得します。

そのHTMLの中から今回は全てのh3タグのデータを配列として取得して変数title_listに代入します。

取得した結果の出力

  // 最終行を取得
  var lastrow = sheet.getLastRow();
  // 書き込む行は最終行の次の行から
  var recordrow = lastrow + 1;

  for(var i = 0; i <= title_list.length-1; i++){
      sheet.getRange("A" + recordrow).setValue(title_list[i].replace(/<("[^"]*"|'[^']*'|[^'">])*>|\r\n|\n|\r/g,''));
      recordrow++;
  }

取得したデータが入っている配列title_listから一つずつ要素を取り出し、シートの一番最後の行のA列に出力します。

title_listが全て出力されるまで繰り返します。

 

結果として、以下のようになります。

エディタの「実行」ボタンを押すことでプログラムの処理が開始します。

なお今回僕はシート上に作った
「見出しを調べる」ボタンをクリックしたときにこのプログラムが開始するようにしています。

 

スクレイピングをするときの注意点

スクレイピングをするときの注意点ですが、以下のルールを守る必要があります。

  1. 取得したデータをデータ解析以外に使わない
  2. サイトに負荷を与えない配慮をする
  3. 利用規約でスクレイピングが禁止されているサイトでスクレイピングをしない

要するに、
変な処理をするプログラムにならないようにすること。
プログラムを実行する前に対象のサイトの利用規約を要確認すること。
取得したデータで商売をしたりしないこと。

 

KEN
KEN
ちなみに今回僕は自分のブログ記事のスクレイピングをしました。

趣味の筋トレブログですので、よろしければこちらもよろしくお願いします!

https://ce-fitness-note.com/

 

まとめ

今回はGASで簡単なスクレイピングツールを作成しました。

GASの準備とParserをインポートし、
紹介したソースコードをコピペ後、
スプレットシートの指定をすればどなたでもスクレイピングができます。

物足りないと感じた人は取得するHTMLタグを変えてみたり、URL入力チェック(未入力や不正なデータのときにエラーメッセージを表示する)のような機能を追加するなどしてみてください。

また、スクレイピングをする際は、
スクレイピングをしても大丈夫なサイトなのかどうか、ちゃんと確認してから行いましょう!

 

今回の記事が為になった、もっと詳しく知りたい、こうした方が良いのではなどのご意見お待ちしております。

よければツイッターのフォローもよろしくお願いします。