Help us understand the problem. What is going on with this article?

【GAS】Google Custom Search APIを使って検索順位のチェックツールを作る

普段SEOのコンサルを行う中で、「検索順位を定点観測できるツールは何を使えば良いか?」という質問をよくいただきます。

いつもは無難にGRCやSERPOSCOPEなどのツールをオススメしていますが、それらは有料であったり、順位取得のエラーが頻繁に出たりと気軽に使えるかどうかと言えば、必ずしもそうではありません。

もっと気軽に検索順位のチェックをできないかということで、「Google Apps Script(以下GAS)」と「Google Custom Search API」を使ってスプレッドシートに日次で書き込む方法をご紹介します。

※以下は完成形のイメージです。
スクリーンショット 2020-02-10 1.55.04.png

システム概要

だいぶシンプルですが、作成するシステムの全体像になります。
スクリーンショット 2020-02-10 15.58.22.png

要件

  • 検索結果50件までを取得し、その中に該当のドメインが含まれているかどうかチェックできる
  • 該当のドメインが含まれている場合はその順位の値を返し、含まれない場合は0を返す
  • 検索したいキーワードを追加できるようにし、同時に複数のキーワードの検索結果取得と順位チェックを行う
  • 1日1回、自動で実行できるように

Google Custom Search APIとは

「Google Custom Search API」はGoogleカスタム検索から実際の検索結果を取得できるAPIです。APIを叩くことでWeb検索または 画像検索の結果をJSON形式で取得できます。

検索結果を取得できるようにする

それでは実際に導入の流れを説明していきます。
まずはAPIを使える状態にして、検索結果を取得できるところまでを行いましょう。

必要なもの

Googleアカウントを持っており、かつログインしているという前提で、以下の準備をします。

  • Custom Search APIのAPIキー(認証情報)の作成
  • Custom Search APIの有効化
  • Custom Search Engine(CSE)の作成

Custom Search APIのAPIキー(認証情報)の取得

Google Developer Console」もしくは「Google Cloud Platform」にアクセスしてください。
そこからGoogle APIの管理画面に移動します。
左メニューから「認証情報」を選択します。

スクリーンショット_2020-02-10_2_22_27.jpg

続いて右上「+認証情報を作成」→「APIキー」を選択。

スクリーンショット_2020-02-10_2_46_57.jpg

そうすると「APIキー」が作成されますので、大事に保管してください。
※必要に応じてキーに制限をかけると良いでしょう。

スクリーンショット_2020-02-10_2_50_08.jpg

Custom Search APIの有効化

上記のAPIキー取得に続いて、Google API管理画面のダッシュボードに戻ります。
そして右上ボタンから「APIとサービスを有効化」を選択

スクリーンショット_2020-02-10_2_22_27.jpg

Googleが提供するAPI ライブラリの一覧に移動しますので、その中から一番下にある「Custom Search API」を選択しましょう。

スクリーンショット_2020-02-10_2_29_12.jpg

ここで、APIを有効化します。
以上で「Custom Search API」の設定は終わりです。

Custom Search Engine(CSE)の作成

次に「Custom Search Engine(CSE)」を作成して、そのIDを取得します。
Custom Search Engine」にアクセスして、「検索エンジンの編集」から「追加」を選択します。

スクリーンショット_2020-02-10_3_00_14.jpg

「検索するサイト」を任意のURLで埋め(後で削除します)、検索エンジンの名前をさらに任意の名前にします。
そして「作成」を選択。

スクリーンショット_2020-02-10_3_03_19.jpg

するとカスタム検索エンジンが作成されますので、「コントロールパネル」から細かい設定を行っていきます。

スクリーンショット_2020-02-10_3_06_01.jpg

「コントロールパネル」を開き、まず「検索エンジンID」を大事に保管してください。
そして先ほど設定した「検索するサイト」のURLは必要無いので削除します。
最後に「ウェブ全体を検索」をオンの状態にします。

スクリーンショット_2020-02-10_3_14_13.jpg

以上で「Custom Search Engine」の設定は終わりです。
ここまで終えることで、APIが使えて検索結果を取得できる状態になりました。

リクエストを投げてみる

それでは、上記で作成したAPIキーと検索エンジンIDを使ってリクエストを飛ばしてみましょう。
※「Postman」などのAPIクライアント、もしくはブラウザでURLを直叩きするかで試してみてください。

すると指定したクエリの検索結果がJSONで返ってくるかと思います。

https://www.googleapis.com/customsearch/v1?key=**APIキー**&cx=**検索エンジンID**&q=**任意の検索クエリ**

各パラメータの詳細は以下になります。

Parameter name Value Description
key String APIキー
cx String カスタム検索エンジンID
q String 検索クエリ

他のパラメータについては、公式リファレンスを参照を参照。

GASで検索結果を取得し、順位をチェックする

GASの方の実装に移ります。

新規のスプレッドシートを開く

新しいスプレッドシートを開き、シートを次のような形式に変えます。
A列に検索したいキーワードを記入し、そのキーワードに対する順位がB列以降に日次で取得されていくようにします。

スクリーンショット_2020-02-10_15_36_23.jpg

スクリプトエディタ

続いてスプレッドシートメニュー「ツール」→「スクリプトエディタ」からスクリプトエディタを開き、コードを完成させます。

プロパティ変数を設定する

先に取得したAPIキーと検索エンジンID、検索するサイトのドメインを環境変数として設定します。
スクリプトエディタ上のメニュー「ファイル」→「プロジェクトのプロパティ」→「スクリプトのプロパティ」

スクリーンショット 2020-02-10 16.58.19.png

このようにGASにはプロパティ変数の機能があって、KEY・VALUEで設定しておくと、コード内から呼び出せて使えるので便利です。

コードを書く

プログラムの基となるコードをスクリプトエディタ上に書いていきます。

スクリーンショット 2020-02-10 16.05.16.png

基本的には、以下のコードをそのままコピペでご利用いただければ問題無いです。

///検索結果を取得
function searchResult(query,domain){
  var apiKey = PropertiesService.getScriptProperties().getProperty('apiKey');
  var searchId = PropertiesService.getScriptProperties().getProperty('searchId');
  var items = [];

  for (var i = 0; i < 5; i++){
    var start =(i*10)+1;
    var apiUrl = "https://www.googleapis.com/customsearch/v1?key="+apiKey+"&cx="+searchId+"&q="+query+"&start="+start;
    var apiOptions = {
      method : 'get'
    };
    var responseApi = UrlFetchApp.fetch(apiUrl, apiOptions);
    var responseJson = JSON.parse(responseApi.getContentText());
    for (var v = 0; v < 10; v++){
      items.push(responseJson["items"][v]["link"]);
    }
  }
  return rankloop(items,domain);
}

///順位をチェック
function rankloop(items,domain){
  var rank = 0;  
  for (var i = 0; i < items.length; i++){
    if(items[i].match(domain)){
      rank = i + 1;
      break;
    }
  }
  return rank;
}

///シートに順位を書き込む
function getRank() {
  var book = SpreadsheetApp.getActiveSpreadsheet();
  var sheetData = book.getSheetByName("シート1");
  var colQuery = 1;
  var rowStartData = 2;
  var rowEndData = sheetData.getDataRange().getLastRow();
  var columnEndData = sheetData.getDataRange().getLastColumn();
  var date =  Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy/MM/dd');

  sheetData.getRange(1, (columnEndData+1)).setValue(date);

  var domain = PropertiesService.getScriptProperties().getProperty('domain');
  var start = 1;

  for (var i = rowStartData; i <= rowEndData; i += 1) { 
    var query = sheetData.getRange(i, colQuery).getValue(); 
    var rank = searchResult(query,domain);
    sheetData.getRange(i,(columnEndData+1)).setValue(rank);
  }
}

これを保存すれば、もう完成です。あとは指定した日時でgetRank()関数を定期実行するようにすれば、先ほどのスプレッドシートのB列に順位が取得されてきます。

トリガーを設定

トリガー設定画面から「日付ベースのタイマー」でgetRank()関数を実行するように設定しておきましょう。

完成形

デイリーで定期実行され、自動で日付と順位が列ごとに追加されていきます。

スクリーンショット 2020-02-10 17.12.15.png

条件付き書式などで、ビジュアルをわかりやすくするのもアリでしょう。

またグラフ化して定点観測したい場合は、データスタジオ等のBIツールと連携させると良いでしょう。
そこはスプレッドシートを利用する大きな利点かなと思います。

問題点

問題点と言うほど大げさでは無いのですが、Custom Search APIには無料枠の制限があって、1日100クエリまでという制限があります。
1回の検索で1ページ10件までしか取得できませんので、今回の実装では50件(50位)までを対象としている為、1つのキーワードにつき5クエリを費やす形になります。
ですので、無料で順位チェックできるキーワードの数としては20までということになります。

もしそれ以上のキーワードの順位をチェックしたいということであれば、課金が必要です。

具体的にはこちら
Custom Search JSON API > pricing

課金による追加のリクエストは、1000クエリあたり5ドル、1日あたり最大10,000クエリがかかります。
キーワード数で換算すると200キーワードあたり5ドルです。(安いのか、、高いのか、、)

最後に

いかがでしたでしょうか。
20キーワードまでとはいえ、インストールといった煩わしさも無く、無料で手軽に順位チェックできるのは魅力的ですよね。

何千、何万というキーワードを観測する場合には不向きかもしれませんが、重要なキーワードだけに絞って運用するのであれば、これで全然問題無いかと思います。

運営するサイト・コンテンツの検索順位を把握することは、SEOを行う上でとても重要な作業です。
もし導入する検索順位のチェックツールが定まらないというお悩みがあるのであれば、この記事のやり方を参考にして、実際に取り入れてみてはいかがでしょうか。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした