Search Console APIで検索クエリ別・日別の検索順位・クリック数を取得

GoogleのSearch Console APIを使うと、検索クエリ別や日別の検索順位やクリック数、表示回数などが取得できます。 Web上のサーチコンソールでは最大1000件の検索クエリしか取得できないが、APIを使うと最大5000件の検索クエリが取得できます。 ここではPythonを使った例を紹介します。

公式のドキュメント・チュートリアル プロジェクト・アカウントなどの設定 Pythonのクライアントライブラリのインストール サンプルコードの実行 Search Console APIの基本的な使い方 基本的な流れ dimensions ページネーション データの不一致 データをCSVで保存するサンプルコード

Google Analytics APIについては

公式のドキュメント・チュートリアル

公式のドキュメントは以下。

Overview and prerequisites | Search Console API | Google Developers

公式のクイックスタートガイドには書かれていないが、Google Analytics APIと同様にサービスアカウントを使った認証もできます。 ここではサービスアカウントを使うプロセスについて説明します。

プロジェクト・アカウントなどの設定

プロジェクトやアカウントなどの設定は以下のような流れになります。基本的にはGoogle Analytics APIと同じ。

Google API Consoleでプロジェクトを作成 既存のプロジェクトを使うことも可能 セットアップツールでSearch ConIole をプロジェクトに登録 そのままウィザードに従って認証情報を作成することもできるが、一旦キャンセルしてからサービスアカウントを作成したほうが分かりやすい サービスアカウントを作成 サービスアカウントのページからサービスアカウントを作成 認証情報を含むJSONファイルがダウンロードされる サーチコンソールアカウントにサービス アカウントを追加 Search Consoleのホームから対象のプロパティのプロパティの管理、ユーザーを追加/削除、新しいユーザーを追加 サービスアカウントのメールアドレスを追加する データを取得するだけであれば権限は制限付きでOKPythonのクライアントライブラリのインストール Google謹製のクライアントライブラリをインストールします。インストールされている場合も--upgradeで最新版にアップデートしておく。 $ pip install --upgrade google-api-python-client

サンプルコードの実行

以下のコードのスクリプトを作成します。

from apiclient.discovery import build
from oauth2client.service_account import ServiceAccountCredentials

SCOPES = ['https://www.googleapis.com/auth/webmasters.readonly']
KEY_FILE_LOCATION = '<REPLACE_WITH_JSON_FILE>'

credentials = ServiceAccountCredentials.from_json_keyfile_name(KEY_FILE_LOCATION, SCOPES)
webmasters = build('webmasters', 'v3', credentials=credentials)

print(webmasters.sites().list().execute())

以下の修正が必要。

をJSONファイルへのパスに変更

サービスアカウント作成時にダウンロードされたJSONファイルへのパスを指定する JSONファイルをスクリプトファイルと同じディレクトリに置いておく場合は<REPLACE_WITH_JSON_FILE>をファイル名(xxxxx.json)に置き換えればOKエラーなく実行できれば諸々の設定は問題ありません。以下のような出力がされます。

{'siteEntry': [{'siteUrl': 'https://xxxxx/', 'permissionLevel': 'siteRestrictedUser'}]}

Search Console APIの基本的な使い方

基本的な流れ

Googleのクライアントライブラリを使う場合、

ServiceAccountCredentials.from_json_keyfile_name()でJSONファイルからCredentials(資格情報)を抽出 Credentialsをもとにapiclient.discovery.build()でサービスオブジェクトを作成 サービスオブジェクトから処理を呼び出し実行

という非常にシンプルな流れになります。 上のサンプルではサービスオブジェクトのsites().list().execute()でURLを確認したが、データを取得する場合はsearchanalytics().query().execute()を使います。 query()の引数siteUrlに対象のプロパティのURL、同じくquery()の引数bodyにリクエストの設定を辞書(dict型オブジェクト)で指定します。 dimensionsについては後述します。

{
  "startDate": string,
  "endDate": string,
  "dimensions": [
    string
  ],
  ...
  "rowLimit": integer,
  "startRow": integer
}

レスポンスとして、クリック数(clicks)、表示回数(impressions)、CTR(ctr)、掲載順位(position)が返ってきます。

{
  "rows": [
    {
      "keys": [
        string
      ],
      "clicks": double,
      "impressions": double,
      "ctr": double,
      "position": double
    }
  ],
  "responseAggregationType": string
}

リクエストおよびレスポンスの詳細は以下の公式ドキュメントを参照。

Search Analytics: query | Search Console API | Google Developers

query()を使ったサンプルコードについては後述します。

dimensions

リクエストの設定でdimensionsを指定します。 dimensionsはWeb上のサーチコンソールの検索パフォーマンス(旧バージョンでは検索アナリティクス)で選択できる分類に対応し、それぞれ以下の文字列で指定します。

クエリ: query ページ: page 国: country デバイス: device 検索での見え方: searchAppearance 日付: date

複数のdimensionsを指定する場合はリストを使います。

'dimensions': ['query', 'page']

ページネーション

一度のリクエストで取得できるのは最大25000行(デフォルト1000行)。 Max行数は'rowLimit'で指定し、オフセットは'startRow'で指定します。 例えば、最初の25000件を取得する場合は以下の設定(startRowはデフォルトが0なのでこの場合は省略可能)。

'rowLimit': 25000,
'startRow': 0

続く25000件を取得する場合は以下の設定。

'rowLimit': 25000,
'startRow': 25000

詳細は以下の公式ドキュメントを参照

Query your Google Search analytics data | Search Console API | Google Developers

なお、dimensionsをqueryとしたときに取得できる最大行数は5000行。公式のドキュメントやリファレンスのどこに書いてあるか分からなかったが、rowLimitを25000に設定しても5000行分しか返ってこない(2018/08/19時点)。

データの不一致

dimensionsをdateやpageとするかqueryとするかで、同じ期間でもクリック数や表示回数の合計が異なります。 これは、queryではすべての検索クエリが抽出されるわけではないのが原因。

グループ化の対象となるのは、検索結果にサイトが返された検索のみです。非常に珍しいクエリは、ユーザーのプライバシー保護のため表示されません。 検索アナリティクス レポート - Search Console ヘルプ

Googleアナリティクスの集客→ Search Console → 検索クエリでは、抽出されなかった検索クエリがまとめてotherとして表示されているが、Search Consle上では非表示。Search Console APIでもotherという項目は取得できません。

データをCSVで保存するサンプルコード

pandasを使ってデータをCSVファイルで保存するサンプルコードを示す。

import pandas as pd

from apiclient.discovery import build
from oauth2client.service_account import ServiceAccountCredentials

SCOPES = ['https://www.googleapis.com/auth/webmasters.readonly']
KEY_FILE_LOCATION = '<REPLACE_WITH_JSON_FILE>'

credentials = ServiceAccountCredentials.from_json_keyfile_name(KEY_FILE_LOCATION, SCOPES)
webmasters = build('webmasters', 'v3', credentials=credentials)

url = '<REPLACE_WITH_SITE_URL>'
d_list = ['query', 'page']
start_date = '2018-07-01'
end_date = '2018-07-01'
row_limit = 25000

body = {
    'startDate': start_date,
    'endDate': end_date,
    'dimensions': d_list,
    'rowLimit': row_limit
}

response = webmasters.searchanalytics().query(siteUrl=url, body=body).execute()

df = pd.io.json.json_normalize(response['rows'])

for i, d in enumerate(d_list):
    df[d] = df['keys'].apply(lambda x: x[i])

df.drop(columns='keys', inplace=True)

df.to_csv('{}.csv'.format(start_date), index=False)

出力行が格納されているresponse['rows']をpd.io.json.json_normalize()でpandas.DataFrameに変換しています。

rowsの中のkeysにdimensionsごとの値がリストで格納されているので、apply()メソッドでそれぞれの値を新たな列として取り出し、そのあとでkeys列を削除しています。

最後にto_csv()でCSVファイルとして保存。

複数ディメンションを指定した場合はgroupby()を使うと各ディメンションごとに集約して合計や平均が算出できて便利です。

Last Updated: 6/26/2019, 10:34:03 PM