Google Search Scraper — Bing, Brave & DuckDuckGo avatar

Google Search Scraper — Bing, Brave & DuckDuckGo

Pricing

from $0.75 / 1,000 search results

Go to Apify Store
Google Search Scraper — Bing, Brave & DuckDuckGo

Google Search Scraper — Bing, Brave & DuckDuckGo

Scrape Google, Bing, Brave, and DuckDuckGo search results. Export each engine result with its exact query, rank, URL, title, and snippet.

Pricing

from $0.75 / 1,000 search results

Rating

0.0

(0)

Developer

Chronometrica

Chronometrica

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

5 days ago

Last modified

Share

🏠 What does Google Search Scraper do?

Google Search Scraper collects public results from Google, Bing, Brave, and DuckDuckGo. Google works on its own. You can add other engines when you want more coverage or want to compare ranks.

The main output is a search result observation. Each row tells you:

  • ⚙️ which exact query the Actor ran;
  • 🧭 which search engine returned the result;
  • 🏅 where the supported result block appeared;
  • 🔗 which public URL was found;
  • 📝 its title and any snippet the engine showed.

One engine result is one row. Results are not merged across engines. If Google returns 10 results and DuckDuckGo returns 10 results, the dataset can contain 20 rows. If both engines find the same URL, both rows stay in the dataset.

Use the Actor for SEO checks, brand tracking, competitor research, site search, public mention discovery, lead research, scheduled alerts, AI tools, and RAG.

Each query runs exactly as entered. You can use normal text, quoted phrases, site:, intitle:, filetype:, exclusions, and other operators supported by the selected search engine.

🧭 Supported search engines

EngineWeb search
🔵 GoogleYes
🟦 BingYes
🦁 BraveYes
🦆 DuckDuckGoYes

Each engine runs as its own search. If one engine fails, useful rows from other engines can still be saved. The run summary shows what happened.

📦 What data can I extract?

The dataset grain is:

one run + one engine + one executed query + one page + one result position

Data groupFields
🏠 RunrunId
🔎 Search requestcountry, language, safeSearch
⚙️ Search executionengine, executedQuery
🏅 Positionpage, rankOnPage, rank
🔗 Resulttitle, canonicalUrl, resultDomain, snippet
📣 Sponsored resultisSponsored, advertiserDomain
🕐 ObservationobservedAt, schemaVersion

Missing public values stay null. They are not guessed.

What does executedQuery mean?

executedQuery is the exact query one engine received. Search operators remain part of this value, so every row keeps its own query and engine origin.

🚀 Quick start

  1. Open the Actor in Apify Console.
  2. Enter one or more queries.
  3. Pick Google or add more engines.
  4. Start with 10 results.
  5. Click Start.
  6. Open Output to view or export the rows.
{
"queries": ["machine learning tutorials"],
"engines": ["google"],
"maxResultsPerExecutedQuery": 10,
"country": "US",
"language": "en",
"safeSearch": true,
"includeSponsoredResults": false
}

🧭 Compare Google and DuckDuckGo

{
"queries": ["best web scraping tools"],
"engines": ["google", "duckduckgo"],
"maxResultsPerExecutedQuery": 10
}

This input can save up to 20 rows: 10 from Google and 10 from DuckDuckGo.

🎯 Search selected sites with site:

{
"queries": ["site:apify.com web scraping", "site:github.com web scraping"],
"engines": ["google", "duckduckgo"],
"maxResultsPerExecutedQuery": 25
}

Each operator query runs separately. Search engines decide which results match their supported operators.

⚙️ Input settings

SettingWhat it controls
queries1 to 100 original queries.
enginesSearch engines to run. Google is selected by default.
maxResultsPerExecutedQuery1 to 100 saved rows for each engine and exact executed query. Default: 10.
countryLocalizes results. Choose one of 249 ISO countries and territories. Default: United States.
languageSearch language such as en, fr, de, or ja. Default: en.
safeSearchAsks supported engines to filter explicit results. Default: true.
includeSponsoredResultsKeeps detected paid results when on. Default: false.

How many rows can a run save?

The cap applies to every executed query on every engine.

For one web query, two engines, and a cap of 10:

1 query × 2 engines × 10 results = up to 20 rows

The run summary shows searchesCompiled, executionsPlanned, and saved row counts by query and engine.

How does country change the results?

Country can change ranks, local sites, ads, and which results appear. The same chosen country is requested from every engine and saved in every row. Country targeting is a preference, not a promise; source availability can vary.

Sponsored results are removed by default. Turn on includeSponsoredResults only when ads are useful to your research.

Each kept paid result has:

  • isSponsored: true
  • advertiserDomain: the detected advertiser domain, when shown

Because rows are not merged, an organic Google result and a paid DuckDuckGo result remain two clear observations.

⬆️ Output example

{
"runId": "abc123",
"country": "US",
"language": "en",
"safeSearch": true,
"engine": "google",
"executedQuery": "best web scraping tools",
"page": 1,
"rankOnPage": 3,
"rank": 3,
"title": "A guide to web scraping tools",
"canonicalUrl": "https://example.com/web-scraping-tools",
"resultDomain": "example.com",
"snippet": "Search-engine snippet",
"isSponsored": false,
"advertiserDomain": null,
"observedAt": "2026-07-17T12:00:00.000Z",
"schemaVersion": "7.0"
}

You can export the dataset as JSON, JSONL, CSV, Excel, XML, RSS, or HTML. You can also use the Apify API, SDKs, webhooks, schedules, Make, Zapier, or n8n.

🔁 Repeated runs and schedules

Each Actor run receives its own dataset. Running the same query again creates new observations with a new runId and observedAt. Rows are not silently updated across runs. Use engine, executedQuery, canonicalUrl, and observedAt when comparing rank observations over time.

📌 Run summary

OUTPUT and RUN_SUMMARY report:

  • 🔎 queries, compiled searches, and planned engine executions;
  • 📄 pages attempted and parsed;
  • 📦 rows saved by original query and by engine;
  • 🚫 invalid URLs removed;
  • 📣 sponsored candidates seen, removed, and saved;
  • 🧭 status counts for every engine;
  • 🏁 the final stop reason.

💵 Pricing event and cost controls

The Actor uses pay-per-result pricing. One search-result event means one row saved for one engine and one executed query. The current price is shown in Apify Console before a run.

Use maxResultsPerExecutedQuery, the number of queries, and the number of selected engines to control the maximum row count. Start with one engine and 10 results. Add more only when the small run proves useful.

🧪 Test evidence

Version 1.0 focuses on simple web queries through Google, Bing, Brave, and DuckDuckGo. Release checks cover input rules, row grain, URL safety, sponsored-result filtering, pagination, countries, engine failures, billing, and the public output contract.

Search results, blocks, runtime, and cost change by query, country, language, engine state, and Apify rates. Test records are evidence, not promises.

🔒 Public-data boundary

The Actor reads public, logged-out search results.

It does not:

  • 🔐 log in to search accounts;
  • 🍪 use customer cookies or copied sessions;
  • 🧩 solve CAPTCHAs or other access challenges;
  • ✅ promise complete coverage of the web.

⚠️ Limits

  • Search indexes change often.
  • Results and ranks vary by engine, time, place, and language.
  • An engine can block, rate-limit, repeat, or stop on deeper pages.
  • The Actor can return fewer rows than the cap after checks and filtering.
  • A URL can appear more than once by design when engines or executed queries differ.
  • Snippets can be missing or stale.

Use runId, engine, executedQuery, page, and rankOnPage to identify and audit each row.

❓ FAQ

Why does the same URL appear more than once?

This is expected. Each row is one engine result. The same URL from Google and DuckDuckGo gives you two rank observations. No cross-engine result is hidden.

Why did I get fewer rows than the cap?

The cap is a maximum, not a promise. A source may have fewer results, block a request, or return rows removed by URL or sponsored-result checks. Read the run summary for exact counts.

Does it need a search-engine API key?

No. It reads public, logged-out search results.

ActorUse it for
X Search & Discovery ScraperFind public X posts with keywords, filters, and date ranges.
YouTube Search ScraperFind public YouTube videos and channels.
TikTok Search ScraperFind public TikTok posts and profiles.

🛟 Support

For help, send the run ID, input, expected result, observed row or missing URL, and the engine that had the problem.

Use public data in line with the law, search-engine rules, and Apify rules. Do not use it to harass people or build sensitive personal profiles.