Manually running the same Google query, scrolling past the AI overview, and copying the first ten organic results into a research doc is the kind of repetitive task that ate an hour of your week. This template automates it. You type the query once when you save the workflow; every run, the extension opens Google, types the query, scrapes the result block, and dumps {title, url} pairs as a JSON file. Common users: SEO analysts checking ranking on a tracked keyword set, journalists building source lists, or anyone tired of Cmd+C, Cmd+Tab, Cmd+V cycles.
How this workflow works
The workflow drives Google as a real user would — type, press Enter, wait, scrape. Eight blocks total.
manual_trigger— Run button in the sidepanel. The trigger exposes aqueryinput with a default value, so you can override the search per-run via the prompt that pops up.targetTab: "new"opens a fresh tab.navigate— Goes tohttps://www.google.com. Plain landing page, no search params.wait_for— Waits fortextarea[name="q"]to be visible. Google switched the search input from<input>to<textarea>in 2023, which is why that selector looks slightly off.input— Types the query value into that textarea. The value template{{vars.input.query}}substitutes whatever you entered at the prompt.press_key— Sends anEnterkeypress. This submits the search just like a human pressing return.wait_for— Waits up to 10 seconds (timeoutMs: 10000) for#searchto appear. That's the wrapper Google uses around organic results, and it shows up after the AI overview (if any) finishes streaming.scrape_list— The core extraction. Container selector is#search a:has(h3)— every organic result link that wraps an<h3>title. For each, it pullstitlefrom the<h3>text andurlfrom the anchor's ownhref(the:scopeselector means "the current container element").export_data— Writes everything togoogle-results.jsonvia Chrome's download bar.
The workflow only captures the first page of results (typically 10 organic links). Pagination is not part of this template — see customisation below if you need it.
Customising it for your case
Three things people typically tweak.
- Hardcode the query for a scheduled run. If you want this on a cron, replace the
data.valueon theinputblock from{{vars.input.query}}to a fixed string like"new york times opinion"and swapmanual_triggerforschedule_triggerwithmode: "cron"andcron: "0 9 * * 1"(Monday mornings). - Target a regional Google. Change the
navigate.urlfromhttps://www.google.comtohttps://www.google.co.uk,.de,.jp, etc. The selectors still work — Google ships the same DOM globally. To force a country regardless of your IP, append?gl=us&hl=ento the URL. - Filter by domain. Use Google's
site:operator inside the query default. Example default value:"chrome extension site:reddit.com". The workflow is unchanged — it's just a different query.
Common gotchas
Google actively detects and throttles automated traffic. If you hammer this template every 30 seconds you'll see a CAPTCHA page and the workflow will fail because #search never renders. Spacing runs 10+ minutes apart is usually fine. Second pitfall: the AI overview block at the top of results sometimes pushes #search further down and delays its appearance — bumping timeoutMs to 15000 helps on slow connections. Third: ad blocks at the top match the #search a:has(h3) selector on some queries; expect a few sponsored links mixed into the JSON.
FAQ
Do I need a Google account or API key? No. The workflow uses the regular search UI, so it works as long as you can open google.com in a browser. If you want a CAPTCHA-free option, switch to the official Custom Search JSON API — but that has a 100-queries-per-day free limit.
Will this trip Google's bot detection? Occasionally, especially if you reuse the same Chrome profile that's been making lots of automated searches. The fix is the same as for any scraper: slow down, vary timing, or use a fresh profile.
Can Automa or Browserflow do this? Yes — both have similar text-input + scrape patterns. The selectors and the press_key Enter pattern are portable. The main difference is this template uses BNOD's $('Step Name').items grammar; in Automa you'd reference the previous block by index.