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


## はじめに

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

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

## 概要

[GAS](https://developers.google.com/apps-script)とは、簡単に言えばGoogleが提供する**JavaScriptベースのサーバーレス**といった説明になるでしょうか。
普通の[サーバーレス](https://aws.amazon.com/jp/builders-flash/202003/awsgeek-serverless/)とは違って言語が決まっている分、実現できることは限定的ですが、限定されている分学習コストが非常に低いことが魅力的だと思います。

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

## 実施手順

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

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

![gas01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217166/817c3020-7109-e0cc-f400-83ed80f08dde.png)


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

![gas02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217166/91786f83-4b24-9ac1-cbb0-8882c12987e1.png)

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

![gas03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217166/88e63713-1d39-e275-b9c3-ebd48eae28cd.png)

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

![gas04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217166/b6d924c3-a952-716c-44d3-f1ed1e972eb7.png)

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


```javascript
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217166/7b4497dd-accd-0641-48a0-cb9304be8bc0.png)

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

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

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

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

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

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

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

![gas06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217166/6326124f-770f-081d-799c-18b0fa3ca599.png)

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

![gas07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217166/745379d4-fdbb-61d0-58ad-2da9341adb16.png)

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


#参考

1. [AutoWorker〜Google Apps Script(GAS)とSikuliで始める業務改善入門](https://auto-worker.com/blog/?p=2460)

2. [Google Apps Script(GAS)を使ったwebスクレイピング](https://qiita.com/takaito0423/items/259097b55b026800c875)

3. [Parserを使ってスクレイピングを行う際のコツ（GASライブラリ）](https://rabbitfoot.xyz/gas-scraiping-with-parser/)