Search Consoleの過去データもBigQueryに蓄積する_4.Cloud Functionsで実行する

前段の記事:Search Consoleの過去データもBigQueryに蓄積する_1.全体像

最後のこの記事では、以下の点について記載していく。

Search Console API に取得上限数が設けられているため、任意の期間を指定して実行するようにしたい。Cloud Functions で毎日期間をずらして実行するにはどうしたらよいか。

Search Console API の取得上限数

Search Console API には取得上限数が設けられている。

API 使用量の割り当てに加え、検索分析のメソッドでは、検索タイプ(ウェブ、画像など)ごとに 1 日あたり最大 50,000 行がデータ別に表示されます(クリック順)。

パフォーマンス データを取得する | Search Console API

query メソッド の rowLimit プロパティで取得上限数を指定できる。デフォルトが1,000で、最大が25,000(レスポンスの最初の行のインデックスを指定する startRow プロパティと併用すると50,000行まで取得できるようだったが、今回は対応しなかった)

上記の制限があるため、今回作成したコード(https://github.com/yrarchi/search_console_to_bigquery)では、以下のパラメータを任意で指定できるようにした。

例えば、2024-02-01分から公式のエクスポート機能でBigQueryにエクスポートしており、その前の2週間分を1日あたり7日分を取得したい場合は以下のような指定になる。

{
    "target_start_date": "2024-01-18", // 開始日を指定
    "target_end_date": "2024-01-31",  // 終了日を指定
    "days": 7,  // 1日あたりに取得する日数
    "site_url": "your_site_url",
    "dataset_id": "searchconsole_hoge",
    "site_table": "past_searchdata_site_impression",  // 任意のテーブル
    "url_table": "past_searchdata_url_impression"  // 任意のテーブル
}

Cloud Functions で実行する

上記のように Search Console API の取得上限数への対応を行ったため、毎日1回コードの実行を行うようにしたい。手動で実行するのはつらいので、Cloud Functions で実行するよう設定を行った。

手元で実行する場合とコードの大半は同じだが、異なる部分を以下で記載する。

  • クライアントの作成
    今回、Cloud Functions の実行を行うサービスアカウントに BigQuery の必要な権限を付与したため、google.auth の default を利用した。
from google.auth import default
from google.cloud import bigquery

credentials, project_id = default()
client = bigquery.Client(credentials=credentials, project=project_id)

ローカルでの実行の際は、サービスアカウントのクレデンシャル情報をファイルとして置いて、それを読む形式にしていた。

from google.oauth2 import service_account
from google.cloud import bigquery

credentials = service_account.Credentials.from_service_account_file(
		"service-account.json",
		scopes=[
		    "https://www.googleapis.com/auth/bigquery.insertdata",
		    "https://www.googleapis.com/auth/bigquery"
		]
)
client = bigquery.Client(
    credentials=credentials, project=credentials.project_id
)
  • ライブラリの追加
    Cloud Functions の実行に必要なため、以下のライブラリを requirements.txt に追加している。
functions-framework==3.*

毎日対象期間をずらしながらCloud Functions の実行を行う必要があるが、変数を毎日+1していく直接的な方法でなく、BigQuery に挿入済みのデータの日付から判断していく方式を取った。

コードとしては以下のあたりが該当する。

def get_max_date(self, table_id):
    query = f"""
        SELECT MAX(data_date) AS max_date
        FROM `{self.dataset_id}.{table_id}`
    """
    try:
        query_job = self.bigquery_client.query(query)
        result = list(query_job.result())
        if result:
            return result[0]["max_date"]
        else:
            return None
    except Exception as error:
        print(f"An error occurred while getting the max date from {table_id}: {error}")
        raise
# (中略)

def get_next_day_after_max_date(client, table_id, default_start_date):
    max_date = client.get_max_date(table_id)
    if max_date:
        next_day = max_date + timedelta(days=1)
        return next_day
    else:
        return datetime.strptime(default_start_date, "%Y-%m-%d").date()

以上の対応により、任意の期間を指定した上で、Cloud Functions を毎日期間をずらして実行することができるようになった。

コードの全体は以下に置いている。
https://github.com/yrarchi/search_console_to_bigquery