
Configure the Apify Google Search Scraper build 1.0.15 by replacing the whole saved sample query and engine lists with your intended query phrase and `["bing"]`, using the input JSON: `{"queries": ["Python asyncio documentation"], "engines": ["bing"], "maxResultsPerExecutedQuery": 2, "country": "US", "language": "en", "safeSearch": true, "includeSponsoredResults": false}`. Note that public build 1.0.15 supports multiple engines, but only Bing is accepted here; Google, Brave, and DuckDuckGo paths are held or excluded. The control test OUTPUT run-summary counts report: `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". These run-summary counts reflect scraper execution totals, not per-target rows. This confirmed bounded Bing URL, rank, and provenance support, not unaccepted peers, other markets, or destination fetching.
1. Set up your collection rules
- Set up your collection rules by replacing the whole saved query and engine lists with one intended query phrase and `["bing"]`, `maxResultsPerExecutedQuery: 2`, US country, English language, `safeSearch: true`, and `includeSponsoredResults: false`. No public page-limit input is prescribed.
- Save raw Bing result rows and OUTPUT metadata. Native row fields include `runId`, `country`, `language`, `safeSearch`, `engine`, `executedQuery`, `page`, `rankOnPage`, `rank`, `title`, `canonicalUrl`, `resultDomain`, `snippet`, `isSponsored`, `advertiserDomain`, `observedAt`, and `schemaVersion`. Keep full run and settings identity.
- Build an observation key using `runId` + `engine` + `executedQuery` + `page` + `rankOnPage`. Keep rank and observedAt as evidence. Remove exact duplicate export rows from your working table and record a duplicate receipt. If a repeated key has conflicting URL values, hold both candidates for source review rather than choosing silently or trusting the majority.
- Create a target key from the returned `canonicalUrl` (a normalized candidate address, not HTML canonical proof or original href). Start with exact returned URL strings. If normalizing host case, fragments, or tracking parameters, record why the destination remains the same. Different paths or query parameters stay separate.
- Link observations to the target table through a target key column. The same URL found by two queries or at two times has multiple observations and one reviewed target. Query membership comes from actual observations only.
- Export working tables safely. Keep query quotes, commas, newlines, and Unicode safe. Use raw JSON or JSONL as your primary reference because CSV exporters or importers may collapse null and empty distinctions. Check exact round trips with a small fixture before merging large exports.
- Report raw rows, duplicate export rows, distinct valid observations, conflicts, and distinct target keys as separate counts. Unique URLs or query memberships do not estimate total search volume or all websites. Keep failed, empty, or capped searches in your collection receipt.
- Pass target addresses and observation references to a separate destination check. Resource merging does not prove page access, relevance, or source reliability. Keep Bing scope explicit.
Fictional merge ledger and data check
*Note: The following tables and records are original fiction used for teaching.*
Imagine a test where run R1 with query "AI agents" gives rank 1 U1 and rank 2 U2. Run R1 with query "small business automation" gives rank 1 U2 and rank 2 U3. Run R2 with query "AI agents" gives rank 1 U1 and rank 2 U4. All are Bing results under declared same settings, with their own times. Six observation keys map to four target keys U1, U2, U3, and U4. U1 has two time observations; U2 has two query observations. Neither repetition is a duplicated export row.
A seventh raw row exactly repeats R1 / query "AI agents" / page 1 / rank 2 U2, copying every original raw value exactly as a duplicate export row. An eighth row with that same key has U9. The key R1+bing+AI agents+1+2 is conflicted for BOTH U2 and U9; hold both candidate values in the conflict ledger rather than trusting the first or majority. Preserving eight raw rows, one duplicate export row, six observation keys, one conflicted key, five uncontested observations, and four accepted targets. U9 remains outside accepted targets.
*Original fiction eight raw rows table.*
| RowId | RunId | Engine | ExecutedQuery | Page | RankOnPage | CanonicalUrl | ObservedAt |
|---|---|---|---|---|---|---|---|
| 1 | R1 | bing | AI agents | 1 | 1 | U1 | 2026-10-13T06:20:15Z |
| 2 | R1 | bing | AI agents | 1 | 2 | U2 | 2026-10-13T06:20:15Z |
| 3 | R1 | bing | small business automation | 1 | 1 | U2 | 2026-10-13T06:21:00Z |
| 4 | R1 | bing | small business automation | 1 | 2 | U3 | 2026-10-13T06:21:00Z |
| 5 | R2 | bing | AI agents | 1 | 1 | U1 | 2026-10-13T07:00:15Z |
| 6 | R2 | bing | AI agents | 1 | 2 | U4 | 2026-10-13T07:00:15Z |
| 7 | R1 | bing | AI agents | 1 | 2 | U2 | 2026-10-13T06:20:15Z |
| 8 | R1 | bing | AI agents | 1 | 2 | U9 | 2026-10-13T06:20:15Z |
*Original fiction six key-status table.*
| ObservationKey | CandidateCanonicalUrl | Status / State |
|---|---|---|
| R1+bing+AI agents+1+1 | U1 | Uncontested |
| R1+bing+AI agents+1+2 | U2, U9 | Conflicted Hold (Both candidates held; row 7 is duplicate export receipt) |
| R1+bing+small business automation+1+1 | U2 | Uncontested |
| R1+bing+small business automation+1+2 | U3 | Uncontested |
| R2+bing+AI agents+1+1 | U1 | Uncontested |
| R2+bing+AI agents+1+2 | U4 | Uncontested |
*Original fiction target reference table (four accepted targets).*
| TargetKey | Uncontested Observation References | Status |
|---|---|---|
| U1 | R1 AI agents rank 1, R2 AI agents rank 1 | Uncontested |
| U2 | R1 small business automation rank 1 | Uncontested (R1 AI agents rank 2 conflict held) |
| U3 | R1 small business automation rank 2 | Uncontested |
| U4 | R2 AI agents rank 2 | Uncontested |
*Original fiction CSV fixture with embedded newline, doubled quotes, Unicode café, and comma query:*
Code snippet
runId,engine,executedQuery,page,rankOnPage,title,canonicalUrl
"R1","bing","garden, tray",1,1,"Café guide
""Best picks""","https://example.com/garden"*Decoded fixture values and reader check:* The query field decodes to `garden, tray`, the title field decodes to `Café guide` followed by an actual newline and one quote pair around `Best picks`, and the canonicalUrl decodes to the plain string `https://example.com/garden` with no Markdown syntax. A reader round-trip check confirms that comma separation, embedded newlines, single quote pairs, and Unicode characters are preserved correctly. Any completed Python parse, write, or read statement applies only to this one fictional fixture, never an Actor export or large dataset.
Sources & further reading
By Chronometrica · Updated
Back to top ↑
