Google Apps Scriptでスクレイピング入門
Google Apps Scriptでスクレイピングを試してみました。
まずはXmlService.parse()を使ってみたのですが、本来XMLをparseするための関数であるためか、HTMLをパースしようとするとエラーが頻発します。
そのため、正規表現を使ってHTMLから目的の情報を取得する方法を試しました。
目次
注意
スクレイピングをする場合は、対象となるWebサイトの負荷に十分注意する必要があります。
「負荷をかけ過ぎてWebサイトが使えない」というような事態になると、偽計業務妨害の罪で逮捕されてしまう可能性があります。
スクレイピング対象
今回は、lifehackerのトップページに表示されているランキングのタイトルを取得してみます。
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)); }
実行&結果確認
サンプルコードを実行します。
画面上部の「実行中」の表記が消えたら、結果を確認してみます。
画面上部メニューから『表示 --> ログ』をクリックすると、ログを表示できます。
タイトルが取得できました。
アクセス時の情報を確認
スクリプトが対象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()); }
先ほどまでと同様にスクリプトを実行し、ログを確認してみます。
このままでは見づらいので、ログの内容をファイルに保存し、ブラウザで表示して確認してみます。
アクセス元の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は変更されていません。
UrlFetchApp.fetch()ではリクエストヘッダを編集することができますが、User Agentは変更することができないようです。
おそらく迷惑な使われ方をしないためなのでしょう。
サイト運営者目線では、User Agentを指定することでGoogle Apps Scriptからのアクセスを拒否することができそうです。
最後に
Google Apps ScriptのUrlFetchApp.fetch()と正規表現で任意の情報を取得することができました。
Google Apps Scriptを使うことで
というようなメリットを教授することができます。
これまで気にはなりつつも使っていませんでしたが、上手く活用してQOLを上げていきたいと思います。