

# Bingの検索結果からクロールキューを作成する方法

Bingの検索結果を少数収集し、各アドレスとページの関連性を確認します。その後、採用、除外、判断保留のいずれかに分類してから、クロールキューに追加します。Actorは、ホスティング環境で動作するデータ収集プログラムです。Taskは、保存済みの入力プリセットです。Actorが元データの行を収集し、読者が分析を行います。

## 初回確認の設定と、情報源が提供するデータの範囲

公開版Google Search Scraperのビルド1.0.15は、Google、Bing、Brave、DuckDuckGoに対応しています。ただし、ここで紹介する方法で適合を確認できているのはBingだけです。現在の公開Taskの入力は、`queries ["AI agents", "small business automation"]`、`engines ["bing"]`、`maxResultsPerExecutedQuery 20`、`country "US"`、`language "en"`、`safeSearch true`、`includeSponsoredResults false`です。この試行では、queriesとenginesのリスト全体を、目的の検索クエリ1件と`engines ["bing"]`に置き換えてください。`maxResultsPerExecutedQuery 2`を設定し、対象の国と言語を指定してください。真偽値の設定は同じにします。検索の拡張設定や、公開されたページ数上限の入力項目はありません。

### 標準の検索結果フィールドと出力サマリー

データセットの各検索結果行には、次の正確なフィールド名が含まれます。`runId`、`country`、`language`、`safeSearch`、`engine`、`executedQuery`、`page`、`rankOnPage`、`rank`、`title`、`canonicalUrl`、`resultDomain`、`snippet`、`isSponsored`、`advertiserDomain`、`observedAt`、`schemaVersion`です。1行は、ある検索エンジン、クエリ、ページ、掲載位置での1回の観測を表します。`canonicalUrl`フィールドが提供するのは正規化された候補アドレスであり、確認済みのHTML canonicalタグや元のリンクではありません。スニペットは検索結果のテキストであり、取得したページの内容ではありません。

出力される実行サマリーには、`queriesRequested`、`searchesCompiled`、`executionsPlanned`、`enginesSuccessful`、`enginesFailed`、`pagesAttempted`、`pagesParsed`、`resultsSaved`、`engineStatusCounts`、`engineResultCounts`、`queryResultCounts`、`stopReason`が記載されます。

### 参考：Bingの対照実行

`Python asyncio documentation`を使った対照実行の正確な結果は、次のとおりです。

- `queriesRequested`: 1
- `searchesCompiled`: 1
- `executionsPlanned`: 1
- `enginesSuccessful`: 1
- `enginesFailed`: 0
- `pagesAttempted`: 1
- `pagesParsed`: 1
- `resultsSaved`: 2
- `engineStatusCounts`: `{"bing": {"ok": 1}}`
- `engineResultCounts`: `{"bing": 2}`
- `queryResultCounts`: `{"Python asyncio documentation": 2}`
- `stopReason`: `result_caps_reached`
- 返された結果：順位1と2に、`docs.python.org`へ直接つながるURLが2件。

ここで確認できたのは、範囲を限定したBingのメタデータサンプルだけです。すべての地域、検索演算子、順位の重複、リンク先の取得は検証していません。一次情報には、[Google Search Scraper Actor](https://apify.com/chronometrica/google-search-scraper)と[Bing Search Results Task](https://apify.com/chronometrica/google-search-scraper/examples/bing-search-results-scraper)があります。

1. 検索する前に、必要なページと採用基準を決めてください。この方法では、ページ候補の発見にBingを利用できます。中立的なトピックを使い、取得行数に上限を設けてください。数百件の有効なサイトが得られると約束しないでください。検索で見つかるのは候補であり、各ページを収集できる保証はありません。
2. queriesには目的の語句を1つ指定し、enginesにはbingを設定し、取得行数の上限を小さくしてください。実行されたクエリ、検索エンジン、タイムスタンプ、出力を確認してください。クエリの表現によって、得られる情報源のサンプルは変わります。検索エンジンでの解釈を自分で検証しない限り、通常の語句を使ってください。
3. 収集対象を選ぶ前に、返された検索結果の行を保存してください。タイトル、候補アドレス、情報源のホスト、順位、クエリ、時刻、検索処理の停止理由を残してください。壊れたアドレスやウェブ以外のアドレスは、自分の基準に従って除外してください。転送先が分からないリダイレクトや、不明確なリンク先は判断保留にしてください。「canonical address」のような正規化フィールドの名前だけでは、元のページの実際の同一性は証明できません。返された文字列は、情報源の証拠として変更せずに保存してください。
4. 各候補のホストとパスが、収集目的に合うか確認してください。検索結果のタイトルやスニペットは、古い場合や誤っている場合があります。必要に応じて、読者自身の収集手順で公開されたリンク先を確認してください。最終URL、コンテンツタイプ、ページ上の証拠を記録してください。タイトルだけで商品内容を推測しないでください。ログインページや非公開ページは、引き続き利用できません。
5. 各対象を、明確な理由とともに採用、除外、要確認に分類してください。採用は、その時点で確認基準を満たしたことを意味します。クロールの成功、必要な権利がすべてそろっていること、商品データの正確性を保証するものではありません。リンク先の確認に失敗した対象や、情報源のデータが不足している対象は、採用済みのキューに入れないでください。
6. 安全な基準に従い、[確認済みの重複対象アドレス](/ja/articles/bing%E6%A4%9C%E7%B4%A2%E7%B5%90%E6%9E%9C%E3%81%AE%E9%87%8D%E8%A4%87%E6%95%B4%E7%90%86/)だけを統合し、検索結果への参照はすべて保持してください。観測レコードと対象レコードは分けて管理してください。異なるページを識別するパスやクエリパラメーターを削除しないでください。同じホストでも、同じページとは限りません。同じタイトルでも、同じ対象とは限りません。
7. 対象アドレス、出典参照、採用の根拠、抽出したい内容、状態を含む小規模なキューを作成してください。採用した対象を、それらのページに適した、実行範囲を限定した別のクローラーに渡してください。検索Actorは、そのクロールを実行せず、[本文](/ja/articles/%E3%82%A6%E3%82%A7%E3%83%96%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%AE%E6%9C%AC%E6%96%87%E6%8A%BD%E5%87%BA-%E7%A2%BA%E8%AA%8D%E6%96%B9%E6%B3%95/)も提供しません。
8. 収集した観測、重複を除いた確認済み候補、採用・除外・判断保留の対象、上限への到達状況を照合してください。採用対象が0件でも、該当する対象がないという正常な結果の場合があります。推測したページで一覧を埋めないでください。候補発見にかける予算を増やす前に、最後に対象を1件確認してください。

## 独自に作成した架空の具体例

このセクションのドメイン、語句、件数は、すべて独自に作成した架空のものです。返された観測は7件あり、対象アドレスの完全一致を基準にすると、重複を除いた候補アドレスは6件です。2件の観測が、同じアドレス`https://garden.example/products`を指しています。残る5件の観測は、商品ページ、ブログのガイド記事、転送先が分からないリダイレクト、ログインページ、無効なアドレスをそれぞれ指しています。

### 1. 検索結果の観測7件

| 観測ID | クエリ | 順位 | 観測日時 | 返されたURL | 出典参照 |
| --- | --- | --- | --- | --- | --- |
| obs-1 | garden tools | 1 | 2026-10-13T06:20:14Z | https://garden.example/products | 検索エンジン：Bing、ページ1 |
| obs-2 | indoor plants | 2 | 2026-10-13T06:20:15Z | https://garden.example/products | 検索エンジン：Bing、ページ1 |
| obs-3 | garden tools | 3 | 2026-10-13T06:20:16Z | https://garden.example/items/shears | 検索エンジン：Bing、ページ1 |
| obs-4 | indoor plants | 4 | 2026-10-13T06:20:17Z | https://blog.example/guide | 検索エンジン：Bing、ページ1 |
| obs-5 | garden tools | 5 | 2026-10-13T06:20:18Z | https://redirect.example/out | 検索エンジン：Bing、ページ1 |
| obs-6 | indoor plants | 6 | 2026-10-13T06:20:19Z | https://account.example/login | 検索エンジン：Bing、ページ1 |
| obs-7 | garden tools | 7 | 2026-10-13T06:20:20Z | ftp://invalid.example/file | 検索エンジン：Bing、ページ1 |

### 2. 重複を除いた対象候補6件とその状態

| 対象候補のURL | リンク先の確認結果 | 関連性の判定状態 | 理由／根拠 |
| --- | --- | --- | --- |
| `https://garden.example/products` | 正常なHTTP 200応答 | accepted_target | 複数の観測が指す共通の商品一覧ページが、収集範囲に合致する。 |
| `https://garden.example/items/shears` | 正常なHTTP 200応答 | accepted_target | 個別の商品ページが収集範囲に合致する。 |
| `https://blog.example/guide` | 正常なHTTP 200応答 | rejected_target | ブログのガイド記事は、商品データの収集に関係しない。 |
| `https://redirect.example/out` | 利用不可／転送先不明 | needs_review | 転送先が分からないリダイレクトのため、直接検証できない。 |
| `https://account.example/login` | ログインが必要 | needs_review | リンク先には認証が必要で、利用できない。 |
| `ftp://invalid.example/file` | HTTP以外のスキーム | rejected_target | 形式が不正なアドレス、またはHTTP以外のアドレスは、収集基準に違反する。 |

### 3. キューに採用した対象2件

| 対象アドレス | 出典参照 | 確認の根拠 | 次に抽出したい内容 | 対象の状態 |
| --- | --- | --- | --- | --- |
| `https://garden.example/products` | obs-1, obs-2 | HTTP 200ステータスを確認済みで、商品一覧ページの基準に合致 | カテゴリー内の商品一覧を抽出 | accepted |
| `https://garden.example/items/shears` | obs-3 | HTTP 200ステータスを確認済みで、個別商品ページの基準に合致 | 商品の詳細と価格を抽出 | accepted |

照合すると、候補6件は、採用対象2件、除外対象2件、判断保留の対象2件に分かれます。商品一覧ページの2件の観測は、キュー内の1件の対象にひも付けたままにし、両方のクエリ、順位、時刻の参照を保持します。7件の観測を7件のクロール対象サイトと呼んだり、重複する参照を捨てたりしないでください。後で別のクローラーを実行した際に商品一覧ページの処理が失敗した場合は、その失敗を記録してください。事前に採用したことは、抽出の成功を保証しません。

## 次に行うこと

[Google Search Scraper Actor](https://apify.com/chronometrica/google-search-scraper)と[Bing Search Results Taskのプリセット](https://apify.com/chronometrica/google-search-scraper/examples/bing-search-results-scraper)を使い、候補1件のリンク先と関連性の確認結果を記録してください。その後、採用した対象を別のクロールキューに追加してください。利用できない場合は、needs_reviewのまま保持してください。

## 出典と参考資料

- [Redditの議論をスクレイピングするためのURL検索を自動化する](https://www.reddit.com/r/learnpython/comments/f96o07/automate_the_process_of_finding_urls_for_scraping/)