Google Search Results Scraper
By asermnasr
SCRAPESEO
descriptionDescription
Extracts structured data from Google search results including titles, URLs, snippets, site links, and metadata based on a custom search query.
data_objectVariables
querystring
self hosted browser automation
settingsBehavior & Action Config
Wait Time (ms)0
Rotate UAfalse
Rotate Proxiesfalse
Rotate Viewportfalse
Human Typingfalse
Shadow DOMtrue
Disable Recordingfalse
Stateless Execfalse
Stealth Features
fatigue
allowTypos
deadClicks
overscroll
idleMovements
naturalTyping
account_treeAutomation Steps
No explicit actions defined in configuration.
outputExpected Output
| Title | url | Description | displayedUrl | Emphasized keywords | siteLinks | Date | productInfo | Type | position |
|---|---|---|---|---|---|---|---|---|---|
free, self-hosted browser automation built on Playwright | https://www.reddit.com/r/selfhosted/comments/1py00xh/doppelg%C3%A4nger_free_selfhosted_browser_automation/ | It's a self-hosted, open-source tool on top of Playwright that lets you build scraping workflows locally. No per-run costs, no data leaving your ...Read more | 20+ comments · 1 month ago | self-hosted, open-source tool on top of Playwright | free, self-hosted browser automation built on PlaywrightReddit · r/selfhosted20+ comments · 1 month ago | 5 best open-source/self-hosted automation tools - Reddit | Best Open Source Autonomous Web Browser AI Agents ... | More results from www.reddit.com | 5 best open-source/self-hosted automation tools - Reddit | Organic | 2 | |
Best Free Open Source Browser Automation Tools in 2025 | https://www.skyvern.com/blog/best-free-open-source-browser-automation-tools-in-2025/ | Sep 8, 2025 — Skyvern automates browser-based workflows using LLMs and computer vision, providing a simple API endpoint to fully automate manual workflows ...Read more | https://www.skyvern.com › blog › best-free-open-sourc... | Skyvern automates browser-based workflows | Best Free Open Source Browser Automation Tools in 2025Skyvernhttps://www.skyvern.com › blog › best-free-open-sourc... | Sep 8, 2025 — | Organic | 4 | |
Browserless - Browser Automation and Bypass Bot Detectors | https://www.browserless.io/ | Bypass any bot detection for your scraping or automations. Sign up for free today, to use our API, proxies and captcha solving. | https://www.browserless.io | Bypass any bot detection for your scraping or automations | Browserless - Browser Automation and Bypass Bot DetectorsBrowserlesshttps://www.browserless.io | Organic | 6 | ||
angrykoala/awesome-browser-automation | https://github.com/angrykoala/awesome-browser-automation | A curated list of awesome browser automation tools and resources. Browser automation is the act of executing actions automatically in a web browser.Read more | https://github.com › angrykoala › awesome-browser-aut... | awesome browser automation tools and resources | angrykoala/awesome-browser-automationGitHubhttps://github.com › angrykoala › awesome-browser-aut... | Organic | 8 | ||
Browserbase: A web browser for AI agents & applications | https://www.browserbase.com/ | We help AI use the web. Autonomously read, write, and perform tasks on the web with a serverless browser. Try for free. No credit card required. Get a demo.Read more | https://www.browserbase.com | Autonomously read, write, and perform tasks on the web | Browserbase: A web browser for AI agents & applicationsBrowserbasehttps://www.browserbase.com | Organic | 10 | ||
Top 10 Browser Automation Tools for Web Testing and ... | https://www.firecrawl.dev/blog/browser-automation-tools-comparison-2025 | Comprehensive comparison of the best browser automation frameworks including Selenium, Playwright, Puppeteer, and Cypress for web testing, data extraction, ... | https://www.firecrawl.dev › blog › browser-automation... | Selenium, Playwright, Puppeteer, and Cypress | Top 10 Browser Automation Tools for Web Testing and ...Firecrawlhttps://www.firecrawl.dev › blog › browser-automation... | Top Browser Automation Tools... | How to Choose the Right... | Future Trends | Organic | 12 | ||
Top 10 Self‑Hosted Browser Automation Tools (2026) | https://doppelgangerdev.com/docs/top-10-self-hosted-browser-automation-tools-2026 | Jan 25, 2026 — Explore the top 10 self-hosted no-code and low-code browser automation tools in 2026, with detailed strengths, weaknesses, ... | https://doppelgangerdev.com › docs › top-10-self-hoste... | self-hosted no-code and low-code browser automation tools | Top 10 Self‑Hosted Browser Automation Tools (2026)doppelgangerdev.comhttps://doppelgangerdev.com › docs › top-10-self-hoste... | Jan 25, 2026 — | Organic | 16 | |
Browser Use - Enable AI to automate the web | https://browser-use.com/ | The Way AIuses the web. Agents at scale. Undetectable browsers. Purpose-built models. The API for any website. Get Started Free. Trusted by teams at.Read more | https://browser-use.com | web, browsers | Browser Use - Enable AI to automate the webBrowser Usehttps://browser-use.com | Organic | 20 |
codeExtraction Script
// 1. Parse the raw HTML string into a queryable DOM
const parser = new DOMParser();
const doc = parser.parseFromString($$data.html(), "text/html");
// 2. Initialize results array
const extractedData = [];
// 3. Helper function to clean text (remove extra spaces/newlines)
const cleanText = (text) => (text ? text.replace(/\s+/g, " ").trim() : "");
// 4. Select all search result containers
const results = doc.querySelectorAll(".MjjYud");
results.forEach((result, index) => {
// --- Extraction Logic ---
// Title & URL: Found in the main anchor tag
const anchor = result.querySelector("a[jsname='UWckNb']") || result.querySelector(".yuRUbf a");
const titleEl = result.querySelector("h3");
// Skip if we can't find a title or link (filters out "People also ask" or empty fillers)
if (!anchor || !titleEl) return;
const title = cleanText(titleEl.textContent);
const url = anchor.href;
// Displayed URL: Usually in a <cite> tag
const displayedUrlEl = result.querySelector("cite");
const displayedUrl = displayedUrlEl ? cleanText(displayedUrlEl.textContent) : "";
// Description: Found in the snippet div (often class .VwiC3b or data-sncf="1")
const descEl = result.querySelector(".VwiC3b, [data-sncf='1']");
const description = descEl ? cleanText(descEl.textContent) : "";
// Emphasized Keywords: <em> or <b> tags inside the description
const keywords = [];
if (descEl) {
descEl.querySelectorAll("em, b").forEach((em) => {
keywords.push(cleanText(em.textContent));
});
}
const emphasizedKeywords = keywords.join(", ");
// Site Links: Sub-links often found in specific containers like .kb0PBd
const siteLinkEls = result.querySelectorAll(".kb0PBd a, .St3GK a");
const siteLinks = Array.from(siteLinkEls)
.map((link) => cleanText(link.textContent))
.filter((text) => text && text !== "Read more") // Remove "Read more" noise
.join(" | ");
// Date: Look for specific date spans (common classes: .LEwnzc, .r0bn4c, .YrbPuc)
const dateEl = result.querySelector(".LEwnzc, .r0bn4c, .YrbPuc, .OSrXXb span");
let date = "";
if (dateEl) {
// If the date is inside a complex span, try to isolate the date text
date = cleanText(dateEl.textContent);
} else if (description) {
// Fallback: Check if description starts with a date pattern (e.g., "Sep 8, 2025 — ...")
const dateMatch = description.match(/^([A-Z][a-z]{2}\s\d{1,2},?\s\d{4})/);
if (dateMatch) date = dateMatch[0];
}
// Product Info: Ratings or store info (rare in this specific HTML but good to have)
const productInfoEl = result.querySelector(".fG8Fp, .os-seller-name-primary");
const productInfo = productInfoEl ? cleanText(productInfoEl.textContent) : "";
// Type: Detect if it's a Video, Ad, or Organic result
let type = "Organic";
if (result.querySelector(".WZiv5b") || result.textContent.includes("Videos")) {
type = "Video";
}
if (result.querySelector(".vdQmEd")) {
type = "Ad";
}
// Position: 1-based index
const position = index + 1;
// --- Push to Array ---
extractedData.push({
Title: title,
url: url,
Description: description,
displayedUrl: displayedUrl,
"Emphasized keywords": emphasizedKeywords,
siteLinks: siteLinks,
Date: date,
productInfo: productInfo,
Type: type,
position: position,
});
});
// 5. Convert to CSV Format
const headers = [
"Title",
"url",
"Description",
"displayedUrl",
"Emphasized keywords",
"siteLinks",
"Date",
"productInfo",
"Type",
"position",
];
// Create CSV Header row
const csvRows = [headers.join(",")];
// Create CSV Data rows
extractedData.forEach((row) => {
const values = headers.map((header) => {
const value = row[header];
// Escape double quotes by doubling them (" -> "") and wrap the field in quotes
const escapedValue = String(value).replace(/"/g, '""');
return `"${escapedValue}"`;
});
csvRows.push(values.join(","));
});
// 6. Return the final CSV string
return csvRows.join("\n");