

# 如何從 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 清單換成一個預定查詢和 `engines ["bing"]`，設定 `maxResultsPerExecutedQuery 2`、預定的 country、language 和相同的布林值，並留意並不存在擴展設定或公開的頁數上限輸入。

### 原生結果欄位與輸出摘要

每筆資料集結果列包含這些確切欄位：`runId`、`country`、`language`、`safeSearch`、`engine`、`executedQuery`、`page`、`rankOnPage`、`rank`、`title`、`canonicalUrl`、`resultDomain`、`snippet`、`isSponsored`、`advertiserDomain`、`observedAt` 和 `schemaVersion`。一列代表在某個引擎、查詢、頁面和位置上的一次觀察。`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`
- 傳回結果：兩個直接的 `docs.python.org` URL，排名為 1 和 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. 使用只含一個預定片語的查詢，把 engines 設為 bing，並設定較小的列數上限。檢查已執行的查詢、引擎、時間戳和輸出。查詢用字會改變你的來源樣本。除非你自行測試搜尋引擎如何解讀查詢用字，否則使用普通詞語。
3. 在選取目標之前，保留傳回的結果列。保留標題、候選網址、來源主機、排名、查詢、時間和來源停止狀態。依你的規則拒絕損壞或非網頁的網址。把不透明的重新導向或目的地不清楚的項目保持為未解決。像標準網址這類正規化欄位名稱，並不能證明原頁面的真實身分。把傳回的字串保持不變，作為來源證據。
4. 按你的收集目的檢查每個候選主機和路徑。搜尋標題和摘要可能過時或錯誤。有需要時，透過你自行執行的頁面收集流程檢查公開目的地。記錄最終 URL、內容類型和頁面證據。不要只憑標題猜測產品內容。登入頁和私人頁面仍然無法取得。
5. 為每個目標指定已接受、已拒絕或需要覆核，並寫明原因。已接受表示它在該時刻符合你的檢查。這不保證爬取成功、完整權利或準確的產品資料。把失敗的目的地檢查和來源缺口留在已接受佇列之外。
6. 只在安全規則下合併[已覆核的重複目標網址](/zh-Hant/articles/bing-%E6%90%9C%E5%B0%8B%E7%B5%90%E6%9E%9C-%E5%90%88%E4%BD%B5%E8%88%87%E5%8E%BB%E9%87%8D/)，同時保留所有結果參照。觀察紀錄和目標紀錄要分開保存。不要刪除可識別不同頁面的不同路徑或查詢參數。相同主機不代表相同頁面。相同標題不代表相同目標。
7. 用目標網址、來源參照、接受證據、所需擷取和狀態建立小型佇列。把已接受的目標交給專為那些頁面而設的另一個範圍有限的爬蟲。搜尋 Actor 不會執行該次爬取，也不會提供[主要文字](/zh-Hant/articles/%E6%AA%A2%E6%9F%A5%E5%BE%9E%E7%B6%B2%E9%A0%81%E6%93%B7%E5%8F%96%E7%9A%84%E6%AD%A3%E6%96%87/)。
8. 核對你收集到的觀察、不重複的已覆核候選、已接受、已拒絕和未解決的目標，以及上限狀態。已接受目標為零可以是正常的缺口，不是要用猜測頁面填滿的清單。結束前先檢查一個目標，再擴大你的發現預算。

## 原創虛構的演算示例

本節所有網域、用詞和計數都是原創虛構。七筆傳回的觀察在精確目標規則下指向六個不同的候選網址。兩筆觀察共用網址 `https://garden.example/products`. 其餘五筆觀察分別指向一個產品頁、一篇網誌指南、一個不透明重新導向、一個登入頁和一個無效網址。

### 1. 七筆結果觀察

| 觀察 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. 六個不重複的目標候選及狀態

| 候選目標 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. 兩個已接受的佇列目標

| 目標網址 | 來源參照 | 檢查證據 | 下一步所需擷取 | 目標狀態 |
| --- | --- | --- | --- | --- |
| `https://garden.example/products` | obs-1, obs-2 | 已核實 HTTP 200 狀態，符合產品索引條件 | 擷取分類項目清單 | accepted |
| `https://garden.example/items/shears` | obs-3 | 已核實 HTTP 200 狀態，符合單一產品條件 | 擷取產品詳情和價格 | accepted |

核對結果顯示，六個候選得出兩個已接受目標、兩個已拒絕目標和兩個未解決目標。產品索引的兩筆觀察仍然附在同一個佇列目標上，並同時保留查詢、排名和時間參照。不要把七筆觀察說成七個爬取網站，也不要丟掉重複參照。如果產品索引在稍後獨立爬蟲執行時失敗，記錄該次失敗；較早的接受並不保證擷取成功。

## 下一步行動

在把該已接受目標加入獨立爬取佇列之前，先記錄一個候選目的地和相關性檢查；如果無法取得，則保留 needs_review。請使用 [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)。

## 來源與延伸閱讀

- [自動化尋找用於爬取 Reddit 討論的 URL 的流程](https://www.reddit.com/r/learnpython/comments/f96o07/automate_the_process_of_finding_urls_for_scraping/)