10
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【はじめての】GASを使ったスクレイピング自動化

Posted at

はじめに

最近、総務系の業務にGASを使って自動化しちゃお~みたいな記事を多く見かけます。
便乗して普段はPythonしか使わない私も使ってみたらスクレイピングがとても楽にできて驚きました(GASというよりもJSがすごいような気もしますが)

ということで、今回ははじめてGAS(Google Apps Script)を使う方向けの記事を書いていきます。
内容は、Webサイトのデータをスクレイピングしてスプレッドシートに格納する処理を毎日自動化するものになります。

概要

GASとは、簡単に言えばGoogleが提供するJavaScriptベースのサーバーレスといった説明になるでしょうか。
普通のサーバーレスとは違って言語が決まっている分、実現できることは限定的ですが、限定されている分学習コストが非常に低いことが魅力的だと思います。

Googleのサービスはもちろんですが、SlackやTrelloなどのSaaSとも連携が可能です。

実施手順

GASとスプレッドシートを使ってQiitaのトップ記事のスクレイピングを自動化していきます。
スクレイピング用のJavaScriptライブラリとしてParserを使用します。

まずはじめにスプレッドシートを作成します。
今回はQiitaの記事の「タイトル名」、「記事URL」、「投稿日時」を取得していくのでそれらのインデックスを最初の行に記載します。

gas01.png

次に「ツール」>「スクリプトエディタ」を選択します。

gas02.png

するとGASのページに移動するので、Parserライブラリを左ペインのライブラリからインポートします。

gas03.png

ParserはスクリプトIDに「1Mc8BthYthXx6CoIz90-JiSzSafVnT6U3t0z_W3hLTAX5ek4w0G_EIrNw」で検索します。

gas04.png

バージョン8が検索されたので、それを追加します。
すると、ライブラリとしてParserが左ペインに表示されたと思うので右ペインのエディタから関数を記述していきます。

function getQiitaTrend() {
  // urlを変数定義
  let url = "https://qiita.com/";
  let html = UrlFetchApp.fetch(url).getContentText("UTF-8");
  // 希望するタグを抽出
  let titleList = Parser.data(html)
    .from('class="css-1j37wyh">')
    .to('</a>')
    // タグにおける複数の要素を取得
    .iterate();
  let urlList = Parser.data(html)
    .from('<h2 class="css-1fhgjcy"><a href="')
    .to('" class="css-1j37wyh">')
    .iterate();
  let dateList = Parser.data(html)
    .from('class="css-4c51rd">')
    .to('</time>')
    .iterate();
  
  // 現在のスプレッドシートのIDを取得
  let ss = SpreadsheetApp.getActiveSpreadsheet();
  Logger.log(ss.getUrl());
 // 記述するスプレッドシートを指定
  let spreadsheet = SpreadsheetApp.openById('************')
  // スプレッドシートの末尾の行を取得
  let lastrow = spreadsheet.getLastRow();
  let headerrow = lastrow + 1;
  let recordrow = lastrow + 2;
  // 新しいスクレイピング結果であることが分かる文言を記載
  spreadsheet.getRange("A" + headerrow).setValue('【newInformation】')
  // スクレイピング結果をスプレッドシートに転記
  for(let i = 0; i <= urlList.length-1; i++){
      spreadsheet.getRange("A" + recordrow).setValue(titleList[i]);
      spreadsheet.getRange("B" + recordrow).setValue(urlList[i]);
      spreadsheet.getRange("C" + recordrow).setValue(dateList[i]);
      recordrow++;
  }
}

実行した結果がこちらになります。

gas05.png

JavaScriptを触ったことない方向けに、上記のコードを簡単に解説します。

まず、function getQiitaTrend()の行で実行する関数に名前を付けます。
前半として、スクレイピングの処理を記述していきます。
let urlの行で取得するURLを記述。
let htmlの行でフェッチ(サーバからデータをプル)。getContentText()でUnicodeを指定します。

次に、let titleListの行でParserライブラリを使ってスクレイピングします。
JavaScriptのスクレイピングはとても直感的で.from()と.to()で挟まれた部分を取得してくれます。
PythonならrequestsとBeautifulSoupを使うことになると思いますが、JavaScriptはParserだけなので楽ですね。
あとは、.iterate()で複数の要素を取得していきます。
これを「タイトル名」、「記事URL」、「投稿日時」の3つに対して記述してあげます。

後半はスクレイピングした結果をスプレッドシートに転記する処理を記述していきます。
まず、let ssから2行のコードで現在のスプレッドシートのIDを調べます。

次に、let spreadsheetの行で調べたスプレッドシートのIDを指定。
************のところは個々人のIDが入ります。
let lastrowから3行のコードでスプレッドシートの末尾の行を取得、ヘッダを付ける行とスクレイピング結果を書き始める行を定義します。
最後に、spreadsheet.getRange().setValue()でスプレッドシートに記載する行数と記載する内容を指定してあげます。

これで30行程度でWebサイトからスクレイピング、スプレッドシートに転記するコードの出来上がりです。

最後に、トリガーを設定して上記の処理を自動化させていきます。

gas06.png

右下の「トリガーを追加」を選択して、各項目を設定していきます。
今回の場合は、アクセス数の少ない時間に一度だけ実行できれば良いので下図のように設定しました。

gas07.png

以上で終了です。
とても簡単でしたね。
簡単ですが使いどころは無限にありそうな気がするので皆さまも是非ご活用ください。

#参考

  1. AutoWorker〜Google Apps Script(GAS)とSikuliで始める業務改善入門

  2. Google Apps Script(GAS)を使ったwebスクレイピング

  3. Parserを使ってスクレイピングを行う際のコツ(GASライブラリ)

10
23
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?