google apps script知識０からのスクレイピング【初心者向け】

google apps script知識0から、スクレイピングをやってみました。

本記事のざっくりとした流れとしては下記の通りです。

1.google apps scriptの記述先
2.いったん動かしてみる（ログ出力）
3.いったん動かしてみる（スプレッドシートに値を書き込み）
4.標準機能だけでスクレイピング
5.ライブラリを使ったスクレイピング

<h1>必要なもの</h1>
・googleアカウント

以上！開発ツールもウェブ上なのでサクサク作れちゃいますね！

<h1>スクリプトの記述場所</h1>
スプレッドシートのスクリプトエディタから記述可能
エクセルのvbsみたいな感じなんですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294965/b17040a9-3b57-f78c-a961-c50ccfb935c7.png)

<h1>とにかくまずはログ出力</h1>
とりあえずjavascriptと同じような言語ということでconsole.logでログ出力してみました。


```javascript
function myFunction() {
  console.log('test');
}
```

ログの確認はメニューの表示→ログで確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294965/c847a2d4-e4be-892e-bd41-da070b02d5a3.png)


<h1>スプレッドシートに文字を書く</h1>
スクレイピングした結果をスプレッドシートに記載したいのでスプレッドシートに文字列を記述してみました。
※スプレッドシートへのアクセス権付与が必要でした。ノリと勢いでやっているのでノリと勢いでOKしました。


1.sheetオブジェクトを取得
2.rangeオブジェクトを取得してそこにtesttestという値をセット

```javascript
function myFunction() {
  var sheet = SpreadsheetApp.getActiveSheet();
  sheet.getRange('A1').setValue('testtest');
}
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294965/65b55588-6259-ee75-643f-1eba1b03b892.png)

<h1>スクレイピングの実装</h1>
ヤフートップページからタイトルタグを取得するコードを書いてみました。

```javascript
function myFunction() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var url = 'https://www.yahoo.co.jp/';
  //トップページ情報をすべて取得
  var content = UrlFetchApp.fetch(url).getContentText('UTF-8');
  //タイトルタグに一致する部分を正規表現で取得  
  var titleRegexp = new RegExp(/<title>.*?<\/title>/);
  var item = content.match(titleRegexp);
  sheet.getRange('A1').setValue((item[0]));
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294965/5134a21d-8d4a-d2c3-19ef-24d0da90b147.png)

取得できました！



<h1>ライブラリを使うための準備</h1>
正規表現ではちょっとしんどいなーと思ったので、ライブラリをインポートしていろいろやってみました。
今回はライブラリの使い方、今私が知っているライブラリについて紹介します。
<h2>ライブラリ一覧</h2>
私が調べたスクレイピングをより使いやすくするためのライブラリです。

<table>
<tr>
<td>ライブラリ名</td>
<td>key</td>
<td>機能紹介</td>
</tr>
<tr>
<td><a href="https://www.kutil.org/2016/01/easy-data-scrapping-with-google-apps.html">Parser</a></td>
<td>M1lugvAXKKtUxn_vdAG9JZleS6DrsjUUV</td>
<td>文字列のfrom,toを指定し、その間の文字を取得します。
</td>
</tr>
<tr>
<td><a href="https://github.com/tadaken3/html-parser-gas">html-parser-gas</a></td>
<td>1Jrnqmfa6dNvBTzIgTeilzdo6zk0aUUhcXwLlQEbtkhaRR-fi5eAf4tBJ</td>
<td>getElementbyIdなどが使えます。
読込先ウェブサイトが必ず正しいフォーマットである必要があります。
amazonのウェブサイトの解析がうまく行えませんでした。
</td>
</tr>
</table>
今回はParserライブラリを使ってスクレイピングしていこうと思います。

<h2>ライブラリのインポート方法</h2>
リソース→ライブラリからkeyを指定、インポートします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294965/9c028b2f-736c-54c4-374f-b99678791c47.png)


<h1>Parserライブラリを使ってamazonの商品名を取得</h1>
html-parser-gasではamazonで
Parserライブラリを使ってamazonの商品名を取得しようと思います。
画像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294965/aeb2091e-9322-f276-dd90-b25ac8e8875f.png)

ソース
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294965/cfb630bb-e57f-0a74-7375-1cf9f13f4bad.png)

```javascript
function myFunction() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var url = 'https://www.amazon.co.jp/gp/product/B00D1B8R9G?pf_rd_r=8QJ2ZY7TYN1EPACKS1V0&pf_rd_p=3d322af3-60ce-4778-b834-9b7ade73f617';
  var content = UrlFetchApp.fetch(url).getContentText();
  
  var scraped = Parser
                    .data(content)
                    .from('<span id="productTitle" class="a-size-large">')
                    .to('<span class')
                    .build();
  sheet.getRange('A1').setValue(scraped);
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294965/72942b58-2c22-700d-9df0-46834ea04de8.png)

こうすることで無事値が取得できました！

<h1>定期実行させる</h1>
スクレイピングの値は定期実行して自動で値を取得したいですよね。
ということで定期実行のさせ方を調べてみました。

1.スクリプトの[編集]から[現在のプロジェクトのトリガー]を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294965/6e4c7356-873d-21c3-2ee9-09fc87e66e34.png)

2.トリガーの追加をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294965/f4c1f691-e964-1069-af5b-f00a15af28de.png)

3.イベントのソースを時間手動型に変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294965/a71bed47-a24d-8c75-d1fa-eebdd554e3fa.png)

以上！

<h1>番外編 IMPORTXML関数で情報取得</h1>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294965/6362617a-ed56-bf87-c44a-97db3b5acd62.png)

=IMPORTXML("https://google.com/", "//title")
これでヤフーのタイトルが取得できます。
めっちゃ便利,ただ数が多いと重くなりそうです。

参考：https://developers.google.com/apps-script/reference/spreadsheet/