
Googleが提供するプログラミング言語にGASがあります。スクリプト系のプログラミング言語であり、簡単に実装したり実行したりできることが特徴です。スクレイピングにも活かせるプログラミング言語で、注目している人も多いでしょう。
ただ、Webサイトの情報を収集したいと考えても、思うように実装できない人は多いと思われます。今回はGASの基本から、スクレイピングに向けた実装方法について解説します。
目次
GASとは
最初にGASとは、どのようなプログラミング言語であるのか理解を深めておきましょう。
GASの概要
GASは正式名称を「Google Apps Script」と呼び、Googleのクラウド上で動作するスクリプト言語プラットフォームです。JavaScriptベースに開発されていて、Google Workspaceのサービスである「Google Sheets」「Google Docs」などの操作や、Google Workspaceそのものの自動化を実現できます。
また、オンライン上のエディタで開発できるようになっているため、開発環境や実行環境を個別に用意する必要がありません。接続するためのWebブラウザさえあれば、簡単にGASの開発や実行に着手できます。
GASの活用例
GASはいくつもの用途に利用が可能であり、例えば以下が挙げられます。
- スプレッドシートのデータ操作や処理の自動化
- フォームの作成や回答を得た際の自動返信
- カレンダーやメールの自動操作
- 各種Webアプリケーションの作成
GASを使ったスクレイピングの基本手順
GASを使ったスクレイピングは、概ね以下の手順で進められます。
- スクレイピング対象の決定
- ライブラリの導入
- GASでのプログラミング
- スクレイピングの実行
1.スクレイピング対象の決定
スクレイピングを実施するにあたっては、その対象を決定しておく必要があります。どのようなWebサイトから何の情報を集めるか検討しましょう。例えば、以下のような選択肢があります。
- 事前に自社でリストアップした競合他社リストに沿って全件取得する
- Googleで検索した結果から上位50社を取得する
- 官公庁のWebサイトへアクセスし届け出リストに掲載されている会社について順に取得する
スクレイピングの目的を踏まえて、対象を明確にしておくと良いでしょう。
2.ライブラリの導入
GASでスクレイピングするにあたって、ライブラリが必要です。Parserと呼ばれるライブラリがあり、これを導入することで、スクレイピングに必要な処理を簡単に実装できるようになります。ライブラリなしで実装すると、ソースコードが膨大になってしまう可能性があるため、ライブラリを軸とした実装をおすすめします。
Parserライブラリを利用するためには、開発エディタ左側の「ライブラリ」にある「+」をクリックし、以下のとおりライブラリIDを入力する必要があります。
検索でヒットすれば「追加」ボタンをクリックすることで、ライブラリを利用できるようになります。
3.GASでのプログラミング
GASでスクレイピングのプログラミングを実施するにあっては、いくつかポイントがあります。それぞれに追加解説します。
HTTPリクエストの発行
まず、Webページの情報を取得するために、HTTPリクエストを発行する必要があります。GASには、リクエストを発行するためのクラスが用意されているため、以下のとおり記述することでリクエストの生成が可能です。
let getResponse = UrlFetchApp.fetch("https://google.com/"); let getText = getResponse.getContentText("utf-8");
これだけで、GASからWebページの情報を取得することが可能です。今回は「google.com」の情報を取得していますが、この部分を変化させることで幅広いWebページの情報を取得できます。
文字列の抽出
HTTPリクエストを発行しただけではWebページの情報がすべて含まれていて、情報をスムーズに活用することができません。そのため、Parserライブラリを利用して、必要な部分だけを抽出します。以下のような記述で、文字列の抽出ができます。
let getExtraction = Parser.data(getText).from(開始キーワード).to(終了キーワード).build();
Parserには、開始キーワードと終了キーワードを指定することで、その間の文字列を取得する機能が備わっています。キーワードは「HTMLタグ」「classやid」「特定の文言(住所・電話番号など)」と自由に設定が可能です。例えば、Googleの検索結果には「class=”LC20lb MBeuO DKV0Md”」が付与されているため、これをキーワードとすることで、検索結果として表示されたWebサイトの名称を取得できます。
let getExtraction = Parser.data(getText).from(‘class="LC20lb MBeuO DKV0Md"’).to(‘</h3>’).build();
なお、文末の「build()」は「最初にヒットした部分だけを取得する」という意味です。しかし、Googleの検索結果は複数行の表示があるため、すべて取得したいケースが大半でしょう。その場合は、以下のように記述します。
let getExtraction = Parser.data(getText).from(‘class="LC20lb MBeuO DKV0Md"’).to(‘</h3>’).iterate();
文末の「iterate()」は「繰り返し条件に満たすものを取得する」という意味です。検索結果のように何十件もデータがあれば、それらをすべて取得して配列に格納してくれます。なお、上記h3タグに囲まれた部分はリンクを示す「a」タグに囲まれています。そのため、さらにこのタグも取り除く場合には以下のとおりです。
let getTitle = Parser.data(getExtraction).from(‘<a’).to(‘</a>’).build();
このように、文字列を所定のルールで取得することで、基本的なスクレイピングを実装できます。取得する対象によって、タグやclass・idの指定を適切に設定しなければなりません。「どのようなルールで取得すれば必要な情報をピンポイントに取得できるか」を検討することが、最も重要で大きな負担になるでしょう。
スプレッドシートへの出力
スクレイピングで得た結果はスプレッドシートに出力することが可能です。例えば、以下のように実装できます。
var ss = SpreadsheetApp.openById(スプレッドシートのID); var sheet = ss.getSheetByName("シート名"); for(var i=0; i < getTitle.length; i++){ sheet.getRange(i,1).setValue(getTitle[i]); }
リストの内容をスプレッドシートへと出力できます。また、スクレイピングの内容を複数の要素に分解して二次元配列にしておけば、これらをまとめてスプレッドシートへと転記することも可能です。
4.スクレイピングの実行
スクレイピングを手動で実行するならば、スクリプトの開発画面から「実行」をクリックするだけです。処理が開始されるため、終了するまで待機しておきましょう。途中でブラウザを閉じるなどすると、処理が止まってしまう可能性があります。
また、定期的に実行したいのであれば「トリガー実行」を設定しておくと良いでしょう。決まった時間、例えば1時間に1回などの設定をすればそれに応じて、スクレイピングを実行してくれます。
最適化するテクニック
GASでスクレイピングするにあたっては、実装を最適化することが重要です。以下のテクニックを活かしてみましょう。
APIの呼び出し回数を減らす
GASはスプレッドシートやドキュメントを操作するために、APIの呼び出しができるようになっています。ただ、これらのAPIを頻繁に呼び出すと、実行速度に大きな影響を与えてしまうため注意が必要です。「Google内部のAPIは高速ではないか」と思われがちですが、意外にも時間を要してしまいます。
そのため、スクレイピングを最適化するために、APIの呼び出し回数を減らすことが重要です。例えば、スプレッドシートへのアクセス回数を最小限に抑え、少ない回数でデータを書き込むようにします。まとめられる処理をまとめることで、最適化できるはずです。
大量のデータを一気に処理しない
プログラミング言語の特性上、大量のデータを一気に処理することは得意ではありません。そのため、処理するデータ量が多くなると、パフォーマンスが低下する可能性があります。これを避けるために、余裕を持った処理を心がけましょう。
また、大量のデータを処理して時間を要すると、以下で解説する実行時間の制限に抵触する可能性があります。処理が強制終了されてしまうため、この点でも余裕を持ったデータ量を設定すべきです。
GASを活用したスクレイピングのメリット
GASでスクレイピングするメリットはいくつもあるため、どのようなメリットがあるか紹介します。
気軽に導入できる
一般的なプログラミング言語と比較すると、気軽に導入できることがメリットです。Googleのアカウントさえあれば、すぐに開発へと着手できます。開発環境などを用意する必要はなく、Webブラウザで開発画面を開き、コーディングしたり実行したりできるのです。
大半のプログラミング言語は、最初に開発環境や実行環境を整えることから始まります。GASはこの部分が必要ないため、気軽に導入したり開発へと着手したりできることがメリットです。
Googleスプレッドシートへ出力できる
Googleが提供しているプログラミング言語・実行環境であるため、Googleの各種サービスと連携できます。特にスクレイピングにおいては、スプレッドシートと簡単に連携できることがメリットです。大量のデータを扱う際は、スプレッドシートに出力しておいて、加工したり分析したりします。
また、実際にはスプレッドシート以外のサービスとも連携可能であり、例えばGmailと連携することも可能です。スクレイピングが完了した後はメールで通知するなど、Googleのサービスを総合的に利用した実装ができます。
他の言語より実装しやすい
シンプルな文法のプログラミング言語であるため、理解しやすく実装もしやすい点がメリットです。プログラミング言語によっては、オブジェクト指向など複雑な概念を理解しておかなければなりません。しかし、GASならばそのような知識がなくとも、直感的な文法で実装ができます。
ただ、このようなメリットがある反面で、後ほど解説する通り複雑な処理が実装できないデメリットがあります。スクレイピングをどのように実施したいかによって、GASでの実装がメリットになったりデメリットになったりすると考えましょう。
トリガー実行に対応している
決まった時間に実行させる「トリガー実行」に対応しています。スクレイピングでは「1時間ごとに起動する」など、条件を満たすタイミングで起動したいことがあるため、これに対応していることはメリットです。
このようなトリガー実行機能がないと、スクレイピングのプログラムとは別に、実行するための仕組みを用意しなければなりません。複数のものを実装したり管理したりしなければならないため、GASのように一元管理できることは意外とメリットなのです。
GASを活用したスクレイピングのデメリット
GASを用いたスクレイピングには、メリットだけではなく以下の通りデメリットもあります。
他の言語より処理速度が遅い
スクレイピングで利用される他のプログラミング言語と比較すると、GASは処理速度や実行速度が遅い点がデメリットです。例えば、代表的なプログラミング言語であるPHPと比較すると、数倍から10倍以上の時間を要することがあります。
原因はいくつも考え、まずGASがそもそも高速化されたプログラミング言語ではない点です。他のプログラミング言語は、速度を重視していますが、GASは利便性が重視されていると考えられます。また、データベースのように速度に最適化されたものではなく、スプレッドシートという利便性を重視したものに書き出すため、この点でもボトルネックが発生しそれに時間を要してしまうのです。
大量のデータ収集には向かない
スクレイピングに利用されるMySQLなど各種データベースと比較すると、管理できるデータに限界があります。そのため、大量のデータ収集には向いていない点がデメリットといえます。一般的なデータベースは、膨大なレコードを管理したり処理したりできますが、GASではスプレッドシートを操作する際は6,000レコード程度です。
実行制限がある
後ほど詳しく解説しますが、GASは実行時間や回数に制限が設定されています。項目によっては、上限が低く設定されていて、スクレイピングでは不便を被ることになりかねません。これらの制限によって、思うようにスクレイピングが実行できない可能性がある点はデメリットです。
ただ、どの程度の不便を被るかは状況によって変化します。意外と大きなダメージを受けないこともあるため、事前に制限の内容を確認し、問題が生じるかどうか評価してみた方が良いでしょう。
複雑なWebページの情報を取得しづらい
非常に高機能なプログラミング言語ではないため、複雑なWebサイトの解析には適していません。GASでは、スクレイピングできないWebサイトがある点がデメリットです。
例えば、近年はJavaScriptを利用して、様々な動きを表現するWebサイトが構築されるケースがあります。これを分析するためには、適切なアルゴリズムが必要となりますが、GASでの実装は難しい状況です。つまり、このようなWebサイトは、GASでスクレイピングできないと考えて良いでしょう。同様に、複雑なWebサイトはGASではスクレイピングできません。
公式サポートがない
エラーが発生した際は、自力で解決することが求められます。有償・無償を問わず、公式のサポートは提供されていません。エラーの原因を突き止めて、解決に向けたプログラミングに着手しなければならないのです。
ただ、自力での解決という点においては、大半のプログラミング言語が当てはまります。公式のサポートが存在しているプログラミング言語も存在しますが、基本的には有償のサポートに加入しておく必要があります。自力で解決する必要がある点はデメリットですが、プログラミング言語の大半が同様のデメリットを抱えているのです。
GASを活用したスクレイピングの注意点とトラブル対処法
GASを使ったスクレイピングには注意点があります。データを収集したいと考えるならば、以下を気をつけるようにしましょう。
各種法律に抵触しないように意識
GASに限らず、スクレイピングの実施にあたっては、各種法律に抵触しないよう注意しなければなりません。法律でスクレイピング自体が禁止されているわけではありませんが、スクレイピングの進め方によっては、法律面で違法行為だと判断されるかもしれません。
例えば、Webサイトによっては、スクレイピングのようにツールでのデータ収集を禁止している場合があります。そのようなWebサイトから情報を収集すると、著作権の問題になったり、不正アクセスとして扱われたりするのです。管理者から訴えられてしまい、大きなトラブルに発展することもあるでしょう。
また、スクレイピングによる大量アクセスで、サーバーが重くなると「偽計業務妨害罪」などに問われる可能性があります。相手に迷惑をかけ法律を犯すことがないように、可能な限り意識しなければなりません。
取得の制限
GASでは、スクリプトの実行回数やセルの操作、実行時間などに制限が設けられています。そのため、GASでスクレイピングを実装すると、実質的には取得回数の制限を受けてしまう点に注意しなければなりません。
例えば、GASで実装したスクリプトは、1スクリプトあたり6分以内に完了することが求められています。6分以上になるとタイムアウトエラーが発生し、強制終了になってしまうのです。大量のデータを取得しようとしても、途中で打ち切られてしまうかもしれません。ただ、実装アルゴリズムを見直すことで、対策することは可能です。
また、基本的に1日で実行できる回数は、20回に制限されています。そのため、繰り返しスクレイピングすることには限界があります。小さな処理を何度も繰り返す設計にすると、回数制限にぶつかるかもしれません。ただ、有料プランに切り替えるなどで、内容によっては対処が可能です。
デプロイの停止
GASでプログラミングを実行するためには「デプロイ」と呼ばれる作業が必要です。これは、ソースコードを実行できる状態にする作業だとイメージしてください。プログラムを保存したり実行したりする段階で、自動的にGASが処理してくれます。
ただ、スクレイピングに限らずGASではデプロイが正しく動作しないことがあります。これについては原因が不明であるため、トラブルが発生した際は、ソースコードをコピーして新しいスクリプトに貼り付けるしかありません。待機しても解決することは少なく、新規に作り直すようにしましょう。
まとめ
Googleが提供するGASを活用すれば、容易にスクレイピングを実装できることを解説しました。ライブラリを活用することで、少ないソースコードでの実装が可能です。ただ、GASではスクレイピングできないWebサイトなどもあり、基本的な実装にとどまってしまいます。また、スクレイピングの実装や実施にあたっては、法律面などの知識が必要です。単純にスクレイピングを実装するスキルが有れば良い、というわけではない点にも注意しましょう。
GASではできないスクレイピングや、法律面においても安全で確実にスクレイピングを実施したいならば、スクレイピングのプロであるPigDataへぜひご依頼ください。