【SEO担当者必読】GASを使ったSearch Console APIの使い方とカニバリゼーション対策!
株式会社エイチームライフデザインで、人材領域のコンテンツマーケティングを担当している大島です。
オウンドメディアやキュレーションメディア、ポータルサイトなど、SEOに取り組んでいる中で必ず出てくる問題がURL同士のキーワードカニバリゼーション、通称「カニバリ」ではないでしょうか。
カニバリの解消のためにはランクインキーワードの詳細なデータが必要です。小規模なメディアであればGoogle Search Consoleからエクスポートすれば事足りますが、大規模なメディアであればデータ量が多くなり、エクスポートに骨が折れますよね。
より効率よくカニバリKWを見つけるためにも、この記事では、GAS(Google App Script)を用い、Google Search Console API経由でSearch Consoleのデータを取得する方法をご紹介します。
本記事に掲載しているのは2023年8月時点の情報です。
各ツールおよびAPIの仕様は変更される場合があるため、予めご留意ください。
1.Search Console API(サーチコンソールAPI)とは?
SEO担当者であれば、一度は使用したことのあるGoogle Search Console。
通常であれば、公式サイトの管理画面から操作して情報を取得しますが、Google Search Console APIを使用して情報を取得することも可能です。
2.Search Console APIがカニバリ対策に活用できる3つのポイント
上述のように管理画面からでもデータを取得し、カニバリが起こっているKWを見つけることができますが、Google Search Console APIでデータ取得することで、より効率よくカニバリを探せます。
具体的には次の3つの長所があります。それぞれ解説していきます。
ポイント1:最大50,000行までKWを出力できる
ポイント2:特定のページパスで絞り込んでパフォーマンスが見られる
ポイント3:GASを実行すれば毎日データ計測できる
ポイント1:最大50,000行までKWを出力できる
Google Search Consoleの管理画面からもデータのエクスポートができますが、最大でも1,000行までしかエクスポートできません。
Google Search Console APIを使用すれば、最大50,000行までエクスポートできるので、効率よくカニバリKWを探すことができます。
データ規模の大きなサイトのSEO担当者には非常に便利な機能です。
ポイント2:特定のページパスで絞り込んでパフォーマンスが見られる
ECサイトの商品ページ(例:/product/xxxx/)など、特定のページパスで絞ったパフォーマンスが見たい場合にもGoogle Search Console APIは便利です。
また正規表現も使用できるため、特定のグループやディレクトリごとにパフォーマンスを出力することができます。
ポイント3:GASで実行すれば毎日データ計測できる
Google Search Console APIをGASで実行すれば、トリガーが使えるため、毎日自動でデータ収集ができます。
スプレッドシートなどと連携して、毎日のパフォーマンスを追いたい時にも活用できます。
3.Search Console APIの使い方
STEP1:Search Console APIを有効化する
サーチコンソールAPIを使用するためにGCP(Google Cloud Platform)へログインします。(※取得したいサーチコンソールの権限を持ったアカウントでログインしてください)
次にプロジェクトの選択をクリックし、プロジェクトを作成します。
ここでは「search-console-api」と名付けています。
自分のプロジェクトに移動し、「Google Search Console API」と検索し、APIを有効化します。
STEP2:Google Search Console APIの認証情報を作成する
有効化したら、認証情報を作成します。Google Search Console APIの管理画面左の「OAuth同意画面」をクリックします。
User Typeは自分のみ使用する場合特に選択する必要はありませんので、「作成」をクリックします。
アプリ情報の必須項目を入力し、保存して次へをクリックします。
OAuth同意画面に関しては、自分のみ使用する形なので、今回は必要ありません。保存して次へを選択します。
最後、テストユーザーの設定画面では、使用するユーザー分だけメールアドレスを追加してください。(※自分だけ使用するのであれば、1つのメールアドレスで問題ありません)
STEP3:スプレッドシートを作成して、GASを編集する
最初にスプレッドシートを新規作成します。
次にメニューバーの「Apps Script」を選択し、スクリプトエディタを表示させてください。
GASを書く前に初期設定を行います。
STEP4:「appsscript.json」マニフェストファイルを修正する
左メニューから「プロジェクトの設定」を選択。
プロジェクトの設定上部にある「”appsscript.json”マニフェスト ファイルをエディタで表示する」にチェックを入れます。
チェックを入れた後、エディタページに戻ると左メニューに「appsscript.json」が表示されていることが確認できます。
「appsscript.json」を選択し、下記コードを追加してください。
"oauthScopes": ["https://www.googleapis.com/auth/spreadsheets", "https://www.googleapis.com/auth/webmasters","https://www.googleapis.com/auth/script.external_request"]
上記のコードはスプレッドシートのアクセス権限やGoogle Search Console APIのリクエスト権限のスコープを設定するコードです。
STEP5:プロジェクト番号を設定する
再度、プロジェクトの設定に戻り、プロジェクト番号を設定します。
GCP管理画面に戻り、プロジェクト番号をコピーし、貼り付けます。
ここまでで事前準備は完了です。
STEP6:コードを記載して実行する
スクリプトエディタに戻り、下記のコードを記載し、実行ボタンを押します。
function getIndexStatus() {
//GASスクリプトに紐づくスプレッドシートのアクティブなシート読み込み
// シートのIDを指定
const spreadsheet = SpreadsheetApp.openById("シートのIDを記載する");
// シートの名前を記載する
let mySheet = spreadsheet.getSheetByName("シート名を記載する");
//サーチコンソールの取得する開始日・終了日を定義※取得したい期間を設定
let startDate = "開始日";
let endDate = "終了日";
let seachUrl= "search consoleで登録しているURL";
let requestUrl = "https://www.googleapis.com/webmasters/v3/sites/https%3A%2F%2F" + seachUrl + "/searchAnalytics/query";
let maxQuery = 20000;
let requestPayload = {
'startDate' : startDate,
'endDate': endDate,
"dimensions" : ["page","query"],
"rowLimit" : maxQuery,
// ディレクトリ絞らないならコメントアウト
"dimensionFilterGroups": [
{
"groupType": "AND",
"filters": [
{
dimension: "page",
operator: "contains",
expression: "ディレクトリ等で絞り込み"
}
]
}
],
}
let requestOptions = {
// 'payload' : requestPayload,
'payload' : JSON.stringify(requestPayload),
'myamethod' : 'POST',
'muteHttpExceptions' : true,
'headers' : {"Authorization" : "Bearer " + ScriptApp.getOAuthToken()},
'contentType' : 'application/json'
}
let response = UrlFetchApp.fetch(requestUrl, requestOptions);
let json = JSON.parse(response);
//JSONデータを処理してqueryを配列に保存する処理をforループで行う
let queryData = [];
for(i=0;i<maxQuery;i++){
//queryDataを2次元配列に拡張する
queryData[i] = [];
Logger.log("json data for row " + i + ": " + JSON.stringify(json["rows"][i]));
// json["rows"][i] がundefinedの場合にエラーメッセージを表示し、処理を中断する
if (!json["rows"][i]) {
Logger.log("Data is undefined for row " + i);
// ここでエラー処理を行うか、スクリプトを中断するかを検討する
// 例えば、エラーが発生した場合に適切なメッセージを表示するか、処理を中断するかなど
} else {
// json["rows"][i] がundefinedでない場合は、データを正常に処理
queryData[i][0] = json["rows"][i]["keys"][1];
queryData[i][1] = json["rows"][i]["keys"][0];
queryData[i][2] = json["rows"][i]["clicks"];
queryData[i][3] = json["rows"][i]["impressions"];
queryData[i][4] = json["rows"][i]["position"];
queryData[i][5] = json["rows"][i]["ctr"];
}
}
//スプレッドシートにqueryデータを書き込み
mySheet.getRange(2, 1, queryData.length, queryData[0].length).setValues(queryData);
//スプレッドシートのデータの順番を表示回数で降順で並び替え
mySheet.getRange(2, 1, queryData.length, queryData[0].length).sort({column: 4, ascending: false});
//クリック率のCTRの数値フォーマットを%に設定
mySheet.getRange(2, 6, queryData.length).setNumberFormat('0.00%');
}
※次の6項目はご自身の環境に合わせて修正してください。(シートのID、シート名、開始日、終了日、search consoleで登録しているURL)
問題なくプログラムが走り、下記ようなデータが出力されていることを確認してください。
4.カニバリ記事の見つけ方
上記、Google Search Console APIで出力した情報からカニバリの記事を見つけます。
並び替えフィルタや関数などを使用して、わかりやく整形してください。
同じKWで複数のURLがヒットしている記事をチェックする
例の出力データを見ると、赤背景色のデータがカニバリが発生している可能性のある記事です。
同じキーワードに対して、複数のURLがヒットしている例になります。
キーワード1:URL1(メイン記事)
キーワード1:URL15
5.カニバリ記事の対策・解消方法
前章でカニバリ記事を発見したら、次は対策・解消方法です。それぞれよくあるケースを抜粋して解説していきます。
※あくまで「想定ケース」ですので、メディアごとに必要な対策は異なります。注意してください。
ケース1.「SEO的価値があるURL」と「SEO的価値がないURL」
上記のようにURL15がSEO的価値がなく、ページとしても必要なければ、301リダイレクトかページを非公開にします。
ケース2.「LPとして使用するページ」と「SEO的価値があるページ」
上記のケースでは、URL15はLPとして使用する目的なので、noindexまたはcanonicalなどで正規化しましょう。
ケース3.「どちらもSEO的価値があるURL」
上記のケースでは、どちらもSEO的価値があるので、noindexやページを非公開するなどの対策はできません。
そのため、コンテンツの中身をチューニングすることで解消させていきます。
この場合、対策して解消される可能性が高い施策は次の4つです。
6.SEO担当者は効率よく業務を行うためにもツールを最大限活用しよう
今回は、Search Console APIを使ったカニバリ対策について解説しました。
大規模メディアになればなるほど、SEO担当者が見るデータ量は多くなるので、こういったツールを最大限活用することで効率よく分析できます。
最初は難しく感じるかもしれませんが、挑戦していくことはより自分を成長に繋げることができるのでおすすめです。
社内のエンジニアに相談したり、組織をうまく使って、事業やスキルを向上させていきましょう。