kapieciiのブログ

日々学んだことを残しておくためのブログです。このブログはGoogle Analyticsを利用しています。

Google Apps Scriptでスクレイピング入門

Google Apps Scriptでスクレイピングを試してみました。

まずはXmlService.parse()を使ってみたのですが、本来XMLをparseするための関数であるためか、HTMLをパースしようとするとエラーが頻発します。
そのため、正規表現を使ってHTMLから目的の情報を取得する方法を試しました。

目次

注意

スクレイピングをする場合は、対象となるWebサイトの負荷に十分注意する必要があります。
「負荷をかけ過ぎてWebサイトが使えない」というような事態になると、偽計業務妨害の罪で逮捕されてしまう可能性があります。

ja.wikipedia.org

スクレイピング対象

今回は、lifehackerのトップページに表示されているランキングのタイトルを取得してみます。

www.lifehacker.jp

f:id:kapiecii:20190510223518p:plain

Google Apps Scriptプロジェクト作成

Google Driveの任意のディレクトリで『新規 --> その他 --> Google Apps Script』を選択し、プロジェクトに任意の名前をつけます。

スクリプトを作成

スクリプトエディタに下記のようなコードを作成し、保存します。
関数名は今回は初期表示のままにしています。

function myFunction() {
  var options = {
    "method" : "get",
  };
  
  var response = UrlFetchApp.fetch("https://www.lifehacker.jp", options);
  var reg = /<h3 class="lh-summary-title">.*?<\/h3>/;
  Logger.log(response.getContentText().match(reg));
}

実行&結果確認

サンプルコードを実行します。

f:id:kapiecii:20190510223732p:plain

画面上部の「実行中」の表記が消えたら、結果を確認してみます。
画面上部メニューから『表示 --> ログ』をクリックすると、ログを表示できます。

f:id:kapiecii:20190510223909p:plain

タイトルが取得できました。

アクセス時の情報を確認

スクリプトが対象Webサイトにアクセスする際に、どのようなUser Agentを使っているのか?アクセス元はどこになっているのか?を確認してみます。
アクセス時の情報を確認できる「確認君+」にアクセスしてみます。

確認君+ (https://env.b4iine.net/)

function myFunction() {

  var options = {
    "method" : "get",
  };
  
  var response = UrlFetchApp.fetch("https://env.b4iine.net/", options);
  Logger.log(response.getContentText());
}

先ほどまでと同様にスクリプトを実行し、ログを確認してみます。

f:id:kapiecii:20190510224152p:plain

このままでは見づらいので、ログの内容をファイルに保存し、ブラウザで表示して確認してみます。

f:id:kapiecii:20190510224300p:plain

アクセス元のIPアドレスやUser Agentの情報が確認できました。

User Agentを変更する

User Agentを変更してみます。
サンプルコードを下記のように修正しました。

function myFunction() {

  var headers = {
    "user-agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.125",
  };
  var options = {
    "method" : "get",
    "headers" : headers,
  };
  
  var response = UrlFetchApp.fetch("https://env.b4iine.net/", options);
  Logger.log(response.getContentText());
}

ログを確認してみましたが、User Agentは変更されていません。

f:id:kapiecii:20190510224423p:plain

UrlFetchApp.fetch()ではリクエストヘッダを編集することができますが、User Agentは変更することができないようです。
おそらく迷惑な使われ方をしないためなのでしょう。
サイト運営者目線では、User Agentを指定することでGoogle Apps Scriptからのアクセスを拒否することができそうです。

qiita.com

最後に

Google Apps ScriptのUrlFetchApp.fetch()と正規表現で任意の情報を取得することができました。

Google Apps Scriptを使うことで

  • 実行環境を自前で準備しなくても良い
  • SpreadSheetやGmailなど、Googleのサービスとの連携が簡単にできる
  • 定期実行の設定が簡単にできる

というようなメリットを教授することができます。
これまで気にはなりつつも使っていませんでしたが、上手く活用してQOLを上げていきたいと思います。

参照

developers.google.com

kapieciiのブログについてお問い合わせがある場合、下記のフォームからご連絡をお願い致します。
お問い合わせはこちら