

# Bingの固定キーワードパネルで競合の出現状況を比較する方法

確認済みの競合ドメインを、1つの固定Bingクエリパネルで比較します。指定する市場、言語、取得件数の上限をそろえます。比較に使えるクエリごとに、各ドメインの出現を1回だけ数えます。観測した最上位の順位は別の列に記録します。得られるのは、サンプル内での検索結果への出現状況です。市場シェアではありません。各地域のユーザーそれぞれに表示される検索結果でもありません。

Actorは、ホスティング環境で動作するデータ収集プログラムです。Taskは、保存済みの入力設定です。Actorが収集元のデータ行を収集します。この記事の手順に沿って、比較は自分で行います。

## 比較する対象

ここでいうドメインは、集計対象として選んだウェブサイトのホストです。クエリパネルは、完全に一致する検索語句を集めた短いリストです。固定とは、結果を見る前にリストを作成し、その後は変更しないことを指します。取得件数の上限は、完全に一致する1つのクエリについて、保存するよう指定する結果の最大件数です。

オーガニック検索結果とは、有料広告ではない結果のことです。オーガニック検索結果の行では、isSponsoredがfalseになります。出現とは、そのクエリで保存したサンプル内にドメインが現れたことを指します。

not_seen_within_capは、クエリが成功し、取得件数の上限内にそのドメインがなかったことを意味します。source_failedは、そのクエリでの出現状況が不明であることを意味します。失敗したクエリを0として保存しないでください。unresolved_identityは、ホストと企業の対応をまだ確認できていないことを意味します。そのホストは、出現しなかったと確認できたものではありません。

順位は、そのときに収集したサンプル内での順番です。すべての人に共通する順位ではありません。

## Bing用の入力を設定する

現在公開されているGoogle Search Scraperのビルドは1.0.15です。このビルドはGoogle、Bing、Brave、DuckDuckGoに対応しています。この手順で使用するのはBingだけです。保存済みのTaskは、入力の出発点です。この比較を代わりに行うものではありません。

現在の保存済み入力を以下に示します。クエリのリスト全体と検索エンジンのリスト全体を置き換えます。

```json
{
  "queries": ["competitor brand", "product category", "best product alternatives"],
  "engines": ["google", "bing", "brave", "duckduckgo"],
  "maxResultsPerExecutedQuery": 20,
  "country": "US",
  "language": "en",
  "safeSearch": true,
  "includeSponsoredResults": false
}
```

Bing用の入力を設定する

最初の確認では、使用予定の検索語句を1つ指定し、Bingだけを使います。取得件数の上限は2に設定します。実施済みの限定的な受け入れ確認では、countryにUS、languageにenを使用しました。safeSearchをtrueにすると、セーフサーチのフィルターが有効になります。includeSponsoredResultsをfalseにすると、有料広告を除外するよう指定できます。拡張の設定はありません。ページ数の上限を指定するフィールドは追加しないでください。確認した2行の試行では、読み取ったページはちょうど1ページでした。

この入力を実行する前に、one intended phraseという文字列を実際の検索語句に置き換えてください。

```json
{
  "queries": ["one intended phrase"],
  "engines": ["bing"],
  "maxResultsPerExecutedQuery": 2,
  "country": "US",
  "language": "en",
  "safeSearch": true,
  "includeSponsoredResults": false
}
```

Bing用の入力を設定する

後でパネル全体を実行するときは、完全に一致するすべてのクエリに同じ取得件数の上限を設定します。国、言語、セーフサーチ、広告を含めるかどうかの設定もそろえます。その際の取得件数の上限は自分で選びます。非表示のフィールドではありません。国と言語は、リクエストで指定する設定です。閲覧者の居住地を証明するものではありません。地図やローカルパックの検索結果が得られることも保証しません。

## 結果の1行を読み取る

1行は、1つの検索エンジン、1つのクエリ、1つのページ、1つの表示位置に対応する1件の結果です。Actorは、1回の実行で多くのクエリを扱えます。世界中のウェブサイトごとに1行を作るわけではありません。

行の各フィールドを、収集元の根拠として使います。

- runIdは、その収集実行のIDです。
- countryは、リクエストで指定した国です。
- languageは、リクエストで指定した言語です。
- safeSearchは、セーフサーチのフィルターが有効だったか無効だったかを記録します。
- engineは、その行の検索エンジンです。
- executedQueryは、実行した正確な検索語句です。
- pageは、検索結果のページ番号です。
- rankOnPageは、そのページ内の表示順位です。
- rankは、収集したサンプル内の順位です。
- titleは、検索結果のタイトルです。
- canonicalUrlは、Actorが整形したURLです。この文字列は変更せずに保存してください。ページのHTMLから読み取ったcanonicalタグではありません。元のリンクをそのまま完全に複製したものでもありません。
- resultDomainは、そのURLのホストです。
- snippetは、検索結果に表示される短いテキストです。ページから取得したテキストではありません。主張を証明するものでもありません。
- isSponsoredは、その行が有料広告の場合にtrueになります。
- advertiserDomainは、その行が広告の場合の広告主のホストです。
- observedAtは、収集時刻です。
- schemaVersionは、行の形式の名称です。

isSponsoredがtrueの行は、オーガニック検索結果の順位から除外してください。Actorは、リンク先のページを開きません。ページ内の余分なテキストをすべて除去する処理もしません。引用元の確認もしません。事業の成功度を評価することもありません。再実行のスケジュールも設定しません。判断に重要なページは自分で開いてください。

## 実行サマリーを読む

OUTPUTは、実行サマリーです。個々の検索結果の行とは異なります。クエリを比較に使えると判断する前に、OUTPUTを読んでください。

- queriesRequestedは、送信した検索語句の数です。
- searchesCompiledは、準備された検索の数です。
- executionsPlannedは、検索エンジンで予定した実行の回数です。
- enginesSuccessfulは、成功した検索エンジンの数です。
- enginesFailedは、失敗した検索エンジンの数です。
- pagesAttemptedは、取得を試みたページ数です。
- pagesParsedは、読み取ったページ数です。
- resultsSavedは、保存した検索結果の行数です。
- engineStatusCountsは、検索エンジンごとにステータスを集計します。
- engineResultCountsは、検索エンジンごとに保存した行数を集計します。
- queryResultCountsは、クエリごとに保存した行数を集計します。
- stopReasonは、実行が停止した理由を示します。

今回のBingの動作確認では、検索語句にPython asyncio documentationを使い、USとenを指定しました。docs.python.orgへの直接URLが2件返されました。検索エンジンはbingでした。実行されたクエリは、指定した検索語句と同じでした。どちらの行もpageは1でした。順位は1と2でした。各行にobservedAtがありました。OUTPUTには、成功した検索エンジンが1つ、読み取ったページが1ページ、stopReasonがresult_caps_reachedと記録されていました。

この動作確認で示されたのは、BingでURL、順位、収集時刻を扱えることを限られた範囲で確認できたということです。競合パネルのテストではありません。Google、Brave、DuckDuckGoを検証したものでもありません。すべての検索演算子、すべての国、繰り返し実行した場合の順位も検証していません。失敗したGoogle経由の取得では、最終的なリンク先ページが明確でないリダイレクトリンクがありました。それらのリンクを、採用できるページURLとして扱わないでください。

成功して取得件数の上限に達したクエリなら、not_seen_within_capと判断する根拠になります。失敗したクエリでは、その判断はできません。上限に達した場合も、結果が空だった場合も、インデックス全体を確認したことにはなりません。

## 比較を行う

1. 最初に、対象市場を1つ、言語を1つ選びます。ウェブサイトについて、どのような判断をする必要があるかを決めます。クエリのリストと競合のリストを作成します。どの競合が出現するかを見る前に行ってください。結果を見てからクエリを追加したり削除したりしないでください。結果を見てから企業を追加したり削除したりしないでください。
2. 各企業の現在の公開サイトを開きます。実行前に、対象とするホストの厳密なルールを書きます。サブドメインを集計に含めるかどうかも明記します。名前が似ているブログ、ディレクトリサイト、アフィリエイトサイトを、その企業のサイトと自動的にみなしてはいけません。ホストと企業の対応は自分で確認します。Actorは企業を確認しません。ホストが不明なままなら、unresolved_identityと記録します。そのセルを、出現しなかったと確認できたものとして扱わないでください。
3. まず、上記のBing用入力で検索語句を1つ実行します。maxResultsPerExecutedQueryは2にします。希望する国と言語を指定します。実施済みの限定的な受け入れ確認で使用したのは、USとenだけです。safeSearchをtrueに設定します。includeSponsoredResultsをfalseに設定します。ページ数の上限を指定するフィールドも、拡張用のフィールドもありません。この確認が成功したら、固定したリスト全体を実行します。完全に一致するすべてのクエリに同じ取得件数の上限を適用します。市場の設定もそろえます。
4. 比較に使える行はすべて保存します。URL、検索エンジン、順位、observedAtを保存します。予定した各クエリについてOUTPUTを読みます。クエリが失敗した場合、出現状況は不明です。クエリが成功し、確認済みのドメインが取得件数の上限内になければ、not_seen_within_capと記録します。失敗したクエリを0で埋めないでください。
5. 競合別・クエリ別の表を作成します。使用する値は、present、not_seen_within_cap、source_failed、unresolved_identityだけです。1つのクエリで同じドメインから採用したページが複数あっても、出現は1回と数えます。各ページの行は保存しておきます。それらの行から、どのURLと順位がセルの根拠になっているかを確認できます。タイトルで行を統合しないでください。異なるクエリ文字列を削除しないでください。
6. 確認済みの各ドメインについて、出現したクエリ数を、比較に使えるクエリ数で割ります。比較に使えるクエリとは、同じ取得件数の上限と設定で成功したクエリです。予定したクエリ数も報告します。この割合は、検索全体に占めるシェアではありません。検索ボリュームでもありません。広告需要でも、顧客需要でもありません。予定したクエリの多くが失敗した場合は、パネルの比較結果を提示しないか、一部のみの結果であると明記します。失敗したクエリを隠さないでください。
7. 各ドメインが出現したクエリごとに、そのドメインのオーガニック検索結果の最上位順位を保存します。条件付き平均は、それらの最上位順位だけを平均した値です。ドメインが観測されなかったクエリは除外します。欠損した順位を0として入力しないでください。取得件数の上限に1を足した値として入力することも避けてください。観測したかのように欠損順位を平均に含めないでください。出現したクエリ数がドメインごとに異なると、それだけで優位にも劣位にも見えることがあります。この記事では、クエリ間で出現状況を比較します。[1つの順位を日ごとに追跡する](/ja/articles/bing-%E3%82%AD%E3%83%BC%E3%83%AF%E3%83%BC%E3%83%89%E9%A0%86%E4%BD%8D-%E6%AF%94%E8%BC%83%E7%94%A8%E3%82%B9%E3%83%8A%E3%83%83%E3%83%97%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88/)方法は扱いません。
8. 出現しなかった箇所を確認します。そのうえで、読むページを選びます。このサンプルにないドメインも、後で出現する可能性があります。別のクエリで出現することもあります。別の人の検索結果に出現することもあります。この表から、ページが出現した理由はわかりません。アクセス数や売上を予測するものでもありません。このBingを使う方法から、Googleの検索結果や別の国の検索結果について主張することはできません。

## 架空のデータを使った具体例

この節の値はすべて架空のものです。製品を実行して得た結果ではありません。パネルはBing、countryはUS、languageはenに固定し、オーガニック検索結果だけを対象に、上位5件を取得上限とします。企業のドメインはA、B、Cです。ホストのルールでは、企業の正確なホストを集計対象とします。サブドメインは、その同じ企業のホストに属する場合に限り集計します。同名のブログは集計しません。この架空の例には、unresolved_identityのホストはありません。

予定したクエリはQ1、Q2、Q3、Q4です。Q1、Q2、Q3は成功しました。Q4は収集元で失敗しました。以下は、ページの観測結果です。

| クエリ | ドメイン | ページ | オーガニック検索結果の最上位順位 | その他のオーガニック検索結果の順位 | 状態 |
| --- | --- | --- | --- | --- | --- |
| Q1 | A | 1 | 2 | 4 | present |
| Q1 | B | 1 | 1 | なし | present |
| Q1 | C | 1 | なし | なし | not_seen_within_cap |
| Q2 | A | 1 | なし | なし | not_seen_within_cap |
| Q2 | B | 1 | 2 | なし | present |
| Q2 | C | 1 | 3 | なし | present |
| Q3 | A | 1 | 3 | なし | present |
| Q3 | B | 1 | 1 | なし | present |
| Q3 | C | 1 | なし | なし | not_seen_within_cap |
| Q4 | A | なし | なし | なし | source_failed |
| Q4 | B | なし | なし | なし | source_failed |
| Q4 | C | なし | なし | なし | source_failed |

Aは、Q1で2位と4位に2つのページが出現しています。この2つのページも、Q1での出現は1回と数えます。これによってAの割合が2/3から3/3に変わることはありません。

比較に使えるクエリは3件でした。予定したクエリは4件でした。出現状況の表を以下に示します。

| ドメイン | Q1 | Q2 | Q3 | Q4 | 比較に使えるクエリでの出現割合 |
| --- | --- | --- | --- | --- | --- |
| A | present | not_seen_within_cap | present | source_failed | 2/3 |
| B | present | present | present | source_failed | 3/3 |
| C | not_seen_within_cap | present | not_seen_within_cap | source_failed | 1/3 |

オーガニック検索結果の最上位順位には、出現したクエリの値だけを使います。

| ドメイン | 最上位順位 | 条件付き平均 | 平均の計算に含めたクエリ数 |
| --- | --- | --- | --- |
| A | 2と3 | 2.5 | 2 |
| B | 1、2、1 | 4/3、約1.33 | 3 |
| C | 3 | 3 | 1 |

Aの条件付き平均は、(2 + 3) / 2 = 2.5です。Bの条件付き平均は、(1 + 2 + 1) / 3 = 4/3、約1.33です。Cの条件付き平均は、3 / 1 = 3です。これらの平均に使ったクエリ数は同じではありません。出現状況の表の代わりにはなりません。1つのドメインがすべての検索で優位であることを示すものでもありません。

not_seen_within_capと記録した各セルの確認範囲は、オーガニック検索結果の上位5行までです。インデックス全体に存在しないという意味ではありません。

Q4は、A、B、Cのすべてでsource_failedです。このセルの出現状況は不明です。出現しなかったと確認できたものではありません。Bが4件中3件のクエリに出現したとは言わないでください。3/3を、予定した4件すべてのクエリに対する出現割合と呼ばないでください。予定した4件と、比較に使える3件の両方を残します。ここでパネルについて主張できるのは、成功した3件のクエリの範囲だけです。予定したクエリの失敗が多すぎる場合は、比較結果を提示しないか、一部のみの結果であると明記します。

## 次に行うこと

指定する市場で、1つのクエリについて1つの競合ドメインを確認し、収集元のリンクと、確認範囲を限定した出現状態を記録します。[Google Search Scraper](https://apify.com/chronometrica/google-search-scraper) Actorと、保存済みの[Competitor SERP Research](https://apify.com/chronometrica/google-search-scraper/examples/competitor-serp-research) Taskから始めます。大きなパネルを使う前に、そのTaskをBingのみ、実際の検索語句1つ、少ない取得件数の上限に変更してください。

## 出典と参考資料

- [Google Search Scraper](https://apify.com/chronometrica/google-search-scraper)
- [Competitor SERP ResearchのTask](https://apify.com/chronometrica/google-search-scraper/examples/competitor-serp-research)
- [あるキーワードで検索順位が付いているかを確認する方法](https://www.reddit.com/r/SEO/comments/1d5kve4/how_to_check_if_you_ranked_on_a_keyword/)
- [特定のキーワードの検索順位を監視するツール](https://www.reddit.com/r/SEO/comments/1dybuk8/any_tools_to_just_monitor_specific_keyword_ranking/)