🎯 一款可定制、具备反检测功能的云浏览器,由自主研发的 Chromium驱动,专为网页爬虫AI 代理设计。👉立即试用
返回博客

如何使用Scrapeless Scraping浏览器抓取Google搜索结果:自然结果、相关问答、知识面板和AI概述

Alex Johnson
Alex Johnson

Senior Web Scraping Engineer

27-Apr-2026

主要收获:

  • 一个命令行工具,覆盖每个Google界面。 scrapeless-scraping-browser工作流程可抓取Google的自然结果、特色摘要、相关问题、知识面板、相关搜索及AI概览——均来自同一会话模式。经过全面验证,验证日期为2026-04-24(在scrapeless查询中每页138个自然容器)。
  • Google的等待策略。 wait --load networkidle耗时约14秒,因为Google的跟踪器从未完全停止;可以使用固定的wait 5000,并通过统计div[data-ved][data-hveid]容器(≥8意味着SERP已渲染)来验证准备好状态。
  • 发现 → 使用联合选择器提取。 Google在A/B变体之间旋转摘要容器(div.VwiC3bdiv[data-content-feature="1"].lEBKkfspan.st)。独立查询每个字段并按卡片压缩——一个严格的“必须同时拥有h3、锚点和摘要”规则会导致失去4/10的结果,因被广告和视频卡片覆盖。
  • 特色摘要已不在.kno-rdesc中。 在高度/测量查询中,Google现在将答案呈现为按属性分隔的知识面板片段(span.T286Pc)。该稳健模式是一种选择器级联,后跟正文文本正则回退——详见第4步。

引言:抓取Google搜索

Google搜索是SEO排名跟踪、竞争情报、品牌SOV、AI基础管道和LLM评估数据集的支撑面。2026年可靠地抓取它意味着处理四个动态部分:住宅IP路由绕过/sorry/index速率限制、固定等待策略因为跟踪器从未完全空闲、针对旋转A/B类名称的联合选择器,以及逐个特性的提取模式(自然结果、特色摘要、相关问题、知识面板、相关搜索、AI概览)。

Google的/sorry/index CAPTCHA墙以可变速率触发——在平静的日子中约为1/10,到在重负荷期间几乎每个美国出口请求——具体取决于代理池、时间和目标地区。DE/GB/JP/FR/CA的代理通常在Google方面的通过率高于美国(见第1步)。Scrapeless Scraping Browser处理住宅代理、反检测指纹识别和JavaScript渲染作为会话级关注,因此管道代码专注于选择器和等待。

这篇文章是一个以CLI为中心、以验证为基础的scrapeless-scraping-browser云浏览器操作指南。以下每个选择器、等待阈值和失败模式都有2026年4月24日在Ubuntu上验证的支持——针对自然提取、分页、本地化、经典SERP抑制、AI概览轮询、知识面板、PAA和相关搜索的Google特定声明。


您可以用它做什么

  • Google上的SERP排名跟踪。 跟踪一组关键词的位置,构建每个域的可见性评分,并为每个查询和时间戳固定前N个结果。
  • 竞争关键词情报。 提取竞争对手目标查询的前10名,比较主机列表,并识别自己的SEO未捕获的SERP成功。
  • AI答案基础。 收集Google的AI概览引用、特色摘要归属和相关问题对,以构建LLM驱动的搜索工具呈现给最终用户的确切证据集。
  • 知识面板提取。 通过Google的data-attrid属性映射提取实体事实表——每个实体20多个结构化字段,适用于知识图谱或实体丰富管道。
  • 多地区监测。 通过地理匹配的住宅代理从hl=de&gl=dehl=en&gl=ushl=ja&gl=jp查询相同关键词,以捕捉市场之间的SERP差异。
  • LLM评估数据集。 建立确定性的真实数据集,用于评估增强检索生成系统,通过为每个查询和时间戳固定前N项来进行验证。

为什么选择Scrapeless Scraping Browser

Scrapeless Scraping Browser是一个可定制的反检测云浏览器,专为网络爬虫和AI代理设计。针对Google搜索,它提供:

  • 覆盖195多个国家的住宅代理--proxy-country--proxy-state--proxy-city)——由于Google的边缘过滤数据中心IP范围,住宅出口是持续抓取的支撑基础。
  • 集成的验证码解决器
  • 每个会话的反检测指纹识别——Google的SearchGuard客户端检查将该浏览器视为真正的Chrome。
  • 云中的JavaScript渲染——Google的SERP已被填充;静态HTML不足以应对。
  • 基于会话的地区对齐,通过--timezone--languages实现——与代理地理位置自动匹配。
    获取您在 scrapeless.com 免费计划下的 API 密钥。相关的 Scrapeless 产品有:通用抓取 API代理解决方案,以及用于模型上下文协议集成的 Scrapeless MCP 服务器

如果结构化 JSON API 比浏览器更适合您的管道,请参阅伴随的 Google 搜索抓取 API 指南。


先决条件

  • Node.js 18 或更高版本。
  • 一个 Scrapeless 帐户和 API 密钥 — 在 scrapeless.com 注册。
  • 用于 JSON 解析的 jq(推荐)。
  • 对终端有基本的熟悉度。

安装

以下配方在 scrapeless-scraping-browser CLI 上运行。设置分为三个步骤 — CLI 用户和 AI-agent 用户都需要第 #1 和 #2 步;AI-agent 用户还需要第 #3 步。

1. 安装 CLI 包

bash Copy
npm install -g scrapeless-scraping-browser

这会提供 scrapeless-scraping-browser 二进制文件,本帖的每一步都会调用它。该技能不带有自己的运行时 — 它将命令模式加载到您的 AI 助手中,但 CLI 本身必须先安装。

2. 配置您的 API 密钥

scrapeless.com 获取您的令牌,然后将其存储在 CLI 可以读取的位置:

bash Copy
scrapeless-scraping-browser config set apiKey your_api_token_here
scrapeless-scraping-browser config get apiKey   # 验证

使用 AI agent? 该技能的说明明确告知您的代理在任何会话调用之前需要身份验证。如果在代理首次尝试使用 CLI 时未设置 API 密钥,代理将提示您并为您运行 config set apiKey … 命令 — 您可以选择现在手动设置(上面的命令)或在代理询问时粘贴您的令牌。

配置文件位于 ~/.scrapeless/config.json,访问权限限制为当前用户,优先于环境变量,并且可以在代理和 CI 运行器之间移植。对于 CI 管道,建议使用:

bash Copy
export SCRAPELESS_API_KEY=your_api_token_here

3. 在您的 AI agent 中安装 Scrapeless 技能

这与上面的第 1 步是 独立步骤。第 1 步安装了 CLI 二进制文件 — 您的代理调用的运行时。技能 是教导您的代理 如何 正确调用它(选择器、等待、重试模式、发现→提取工作流)。这两者是不同的东西,您需要两者。

技能是一个包含 SKILL.md + skill.json + references/ 的文件夹。规范源是 scrapeless-ai/scrapeless-agent-browser → skills/scraping-browser-skill GitHub 仓库。

要在 Claude Code、Cursor、VS Code + GitHub Copilot、OpenAI Codex CLI 或 Gemini CLI 中安装它,请遵循 Scrapeless AI Agent 安装指南 — 它提供了每个代理的复制粘贴命令(bash 和 Windows PowerShell)。安装后重新加载您的代理,以使技能变为活跃状态。

没有安装技能,您的代理不知道发现→提取模式、每个引擎的等待,或在 2026 年实际有效的选择器,您将不得不在每个提示中逐条提供每个细节。

技能在您代理的操作上下文中预加载的内容:

  • 身份验证 — 检查 ~/.scrapeless/config.jsonSCRAPELESS_API_KEY,并在缺失时提示您设置(见第 2 步)。
  • 发现 → 提取工作流防脆弱模式。代理首先使用 get html "<region>" 读取实时 DOM,识别稳定锚点 (data-ved, data-attrid, aria-label, role, 语义 ID),然后根据实际渲染的内容编写 eval 选择器 — 而不是猜测 Google 每几周在 A/B 变体中轮换的实用类名。
  • 选择器语法 — CSS (div[data-ved][data-hveid]) 与可访问性引用 (@e1 来自 snapshot -i)。
  • Google 等待策略wait 5000 加上 div[data-ved][data-hveid] 计数检查作为就绪信号。代理选择此默认值,而不是依赖 wait --load networkidle,该策略在 Google 上从未稳定。
  • 并行 CLI 工作者 — 单壳 && 链接、唯一会话名称、每个主机 ≤3 个并发工作者。仅 --session-id 在守护进程争用下是不够的。
  • 常见错误eval 返回 JSON 引号值,open 在成功导航时以非零状态退出,wait --load networkidle 在冷会话上发生竞争,连接关闭时会话终止。
  • 完整命令参考new-sessionopenwaitevalgetclickfillsnapshotauthprofilerecordingstop 等的每个标志。

4. 验证技能是否已连接

在你第一次真正的 Google 抓取之前,用以下安全提示进行安装的烟雾测试:

"使用 Scrapeless 技能,打开 https://example.com 并告诉我页面标题。"

你的代理应该创建一个会话,打开页面,并回复**"示例域"**。如果成功,你准备好抓取 Google 了。

如果失败:

症状 可能原因 解决方法
"我没有工具/技能来做到这一点" 此代理会话中未加载技能 按照 技能安装指南 重新安装并重新加载代理
身份验证失败 / 401 未设置 API 密钥 重新运行 scrapeless-scraping-browser config set apiKey <token>(安装步骤 2)
命令未找到 CLI 二进制文件在 PATH 中缺失 重新运行安装步骤 1(npm install -g scrapeless-scraping-browser
陷入 /sorry/index(Google CAPTCHA 墙) 美国代理过载 请代理尝试 DE/GB/JP/FR/CA 代理—技能知道如何轮换
挂起 / 陷入 chrome://new-tab-page/ 冷会话等待竞争 代理应重试—在 openwait --load networkidle 之间 wait 1500 在技能的操作手册中

如何使用这一点:提示你的代理

安装后,你通过与代理交谈来抓取 Google,而不是通过复制粘贴 bash。技能将联合选择器、Google 调整的等待策略和发现→提取模式加载到代理上下文中,因此一行提示足以获得干净的 SERP JSON。

可粘贴的提示

你对代理说 返回的内容
"抓取 '最佳跑鞋' 的前 10 个 Google 结果" JSON 列表,仅包含自然结果,字段 {position, title, url, displayedUrl, snippet}
"在第 1–3 页抓取 Google 的 'airpods',去重,保存为 airpods-serp.json" 单个 JSON 文件,3 个 SERP 页面合并 + 通过 URL 去重
"Google 针对 '埃菲尔铁塔有多高?' 的特色摘要是什么?" 答案文本,带选择器级联 + 正则表达式主体备份
"提取阿尔伯特·爱因斯坦的知识面板" data-attrid → 值的 JSON 映射(出生、去世、配偶等)
"获取 '最佳跑鞋' 的所有人们还问的问题及其答案" {question, answer} 数组
"监测 '什么是机器学习' 的 AI 概述存在,为 5 次投票设置 30 秒间隔" 带内容长度保护的循环,为每次投票返回存在 + 正文
"Google 在德国语 IP 上显示 'wetter' 的内容?" 会话创建为 --proxy-country DE,本土语言结果
"'在日本比特币合法吗' 的特色摘要 — 仅返回答案文本" 原始答案字符串,无附加内容
"获取 '机器学习' 的相关搜索条" 从页面底部条中获取的 8–10 个查询建议的数组
"抓取上周 '电动车' 的 Google 新闻垂直体系" URL 自动应用 &tbm=nws&tbs=qdr:w
"强制 '什么是 python' 的经典 SERP 布局 — 不要 AI 概述" 应用 &udm=14 的 URL;干净的 10 个自然结果布局

示例:在 3 页中抓取 Google 的 "airpods"

你输入:

"抓取 Google 中的 'airpods',跨越第 1–3 页,根据 URL 去重,保存为 airpods-serp.json。仅自然结果 — 标题、URL、摘要。"

代理的计划(用简单英语表达):

  1. 创建三个美国出口会话,一个页面一个(每个页面清洁状态胜过重用一个漂移的会话)。
  2. 打开 https://www.google.com/search?q=airpods&hl=en&gl=us&start={0,10,20},然后 wait 5000(Google 追踪器永远不会完全闲置,因此固定等待胜过 networkidle)。
  3. 确认 div[data-ved][data-hveid] 数量 ≥ 8 — 表示 SERP 实际渲染的加载信号。
  4. eval 联合选择器提取器(div.VwiC3b, div[data-content-feature="1"], .lEBKkf, span.st, .MUxGbd)— Google 在 A/B 变体之间轮换,查询所有内容有助于避免轮换。
  5. 过滤 title && url && snippet,根据 URL 去重,写入文件。

你得到的内容airpods-serp.json,简略):

json Copy
[
  { "page": 1, "title": "AirPods", "url": "https://www.apple.com/airpods/",
    "snippet": "AirPods 提供无与伦比的无线耳机体验..." },
  { "page": 1, "title": "Apple AirPods 无线耳塞,蓝牙耳机 ...",
    "url": "https://www.amazon.com/Apple-AirPods-Charging-Latest-Model/dp/B07PXGQC1Q",
    "snippet": "新款 AirPods 将智能设计与突破性技术结合 ..." },
  { "page": 1, "title": "AirPods", "url": "https://en.wikipedia.org/wiki/AirPods",

"snippet": "AirPods 是苹果设计的无线蓝牙耳塞..." },
{ "page": 2, "title": "2026 年最佳 AirPods:专家测试和评测",
"url": "https://www.cnet.com/tech/mobile/best-apple-airpods/",
"snippet": "优点 - 轻便,更紧凑的设计和舒适的贴合感..." },
{ "page": 3, "title": "下一代 AirPods Pro 的期待,将推出为 ...",
"url": "https://www.macrumors.com/2026/04/22/airpods-pro-cameras-2026/",
"snippet": "红外相机能够识别手势..." }
谷歌每个SERP返回10个自然结果。简单选择器——“容器必须有h3和锚点和摘要”——只返回了6个,因为10个结果中有4个是非摘要卡片(视频预览、购物广告、Twitter区块)。稳健的模式是独立查询每个字段并按容器压缩。

bash Copy
scrapeless-scraping-browser --session-id $SESSION eval '
(function(){
  const out = [];
  document.querySelectorAll("div[data-ved][data-hveid]").forEach((r, i) => {
    const h3 = r.querySelector("h3");
    const a  = r.querySelector("a[href^=\"http\"]");
    const sn = r.querySelector(
      "div.VwiC3b, div[data-content-feature=\"1\"], .lEBKkf, span.st, .MUxGbd"
    );
    const cite = r.querySelector("cite");

    // 跳过没有标题和没有锚点的容器(装饰盒)
    if (!h3 && !a) return;

    out.push({
      position:     i + 1,
      title:        h3?.textContent?.trim() || null,
      url:          a?.href || null,
      displayedUrl: cite?.textContent?.trim() || null,
      snippet:      sn?.textContent?.trim()?.slice(0, 300) || null,
    });
  });
  return JSON.stringify(out);
})()
' > google-organic.json

jq '. | length' google-organic.json                              # 原始结果——预计很多
jq 'map(select(.title and .url)) | length' google-organic.json   # 自然 + 特征子集
jq 'map(select(.title and .url and .snippet))' google-organic.json  # 仅典型自然结果

来自验证运行的诚实观察(查询scrapeless,2026年4月24日 Ubuntu):

  • 原始结果在“有标题或URL”的筛选后获得了80个容器,这些容器都有data-ved][data-hveid组合。谷歌返回很多分享此属性对的卡片/特征容器。
  • 应用title != null && url != null后缩减为16个项目——有用的工作集,包括自然结果 + PAA条目 + 知识面板链接。
  • 应用title && url && snippet进一步缩减到约10个——典型自然子集。这是严格的10个每SERP列表。
  • 选择适合你用例的筛选器:排名跟踪器通常希望获得典型的10个;上下文挖掘管道通常希望获得16个项目的工作集。
  • 在同一页面上的cite计数为14——预计cite会与典型自然计数相匹配或超过,因为某些特征(PAA条目、广告)也会渲染一个cite。

第4步 — 提取SERP特征(突出摘要、PAA、知识面板、相关)

谷歌在自然列表之上分层了几种特征类型。每种都有自己的提取模式。

4a — 突出摘要(带有文本正则回退)

谷歌逐步将答案文本从经典的.kno-rdesc容器移除,转移到每个属性的知识面板片段(例如“span.T286Pc”用于测量)。稳健的模式是选择器级联加上一个正文文本正则回退。

bash Copy
scrapeless-scraping-browser --session-id $SESSION open \
  "https://www.google.com/search?q=how+tall+is+the+eiffel+tower&hl=en&gl=us"
scrapeless-scraping-browser --session-id $SESSION wait 5000

scrapeless-scraping-browser --session-id $SESSION eval '
(function(){
  // 第1次通过 — 选择器级联(经典 → 现代)
  const selectors = [
    ".kno-rdesc",
    "[data-attrid=\"wa:/description\"]",
    ".IZ6rdc",
    ".hgKElc",
    "span.T286Pc",               // 2026 — 每个属性的片段
    "[data-attrid] .LrzXr",      // 知识面板的事实
  ];
  for (const sel of selectors) {
    const el = document.querySelector(sel);
    if (el && el.textContent.trim().length > 10) {
      return JSON.stringify({ source: "selector", selector: sel, text: el.textContent.trim() });
    }
  }

  // 第2次通过 — 用于数值答案的正文文本正则回退
  const body = document.body.innerText;
  const m = body.match(/([0-9][0-9,\. ]*(meters|feet|metres|m|ft|km|miles|°F|°C|%)[^\.]{0,40})/i);
  if (m) return JSON.stringify({ source: "regex", text: m[0].trim() });

  return JSON.stringify({ source: null, text: null });
})()
'

4b — 人们还询问

bash Copy
scrapeless-scraping-browser --session-id $SESSION open \
  "https://www.google.com/search?q=best+running+shoes&hl=en&gl=us"
scrapeless-scraping-browser --session-id $SESSION wait 5000

scrapeless-scraping-browser --session-id $SESSION eval '
(function(){
  const out = [];
  document.querySelectorAll(".related-question-pair, div[jsname=\"N760b\"]").forEach(q => {
    const text = q.textContent.trim();
    if (text.length > 5) out.push({ question: text.slice(0, 200) });
  });
  return JSON.stringify(out);
})()
'

在验证运行中,“最佳跑鞋”查询有5个问题。对于每个问题,单击以展开并重新快照以提取回答正文。

4c — 通过data-attrid映射获取知识面板

实体查询(人、地点、公司、地标)呈现一个知识面板——这是在2026年谷歌上最稳定的结构化属性映射之一。

bash Copy
scrapeless-scraping-browser --session-id $SESSION open \

"https://www.google.com/search?q=阿尔伯特·爱因斯坦&hl=zh-CN&gl=cn"
scrapeless-scraping-browser --session-id $SESSION wait 5000

scrapeless-scraping-browser --session-id $SESSION eval '
(function(){
const attrs = {};
document.querySelectorAll("div[data-attrid]").forEach(el => {
const key = el.getAttribute("data-attrid");
const val = el.textContent.trim().replace(/\s+/g, " ").slice(0, 200);
if (key && val && !attrs[key]) attrs[key] = val;
});
return JSON.stringify({
title: document.querySelector("[data-attrid="title"]")?.textContent?.trim() || null,
attrCount: Object.keys(attrs).length,
attrs: attrs,
});
})()
'

在“阿尔伯特·爱因斯坦”的Ubuntu验证运行中返回了20个属性;后续在GB/US代理下的运行报告显示15-18个——代理侧的本地化影响哪些事实呈现,而不是选择器是否工作。键的模式如下:kc:/people/person:bornkc:/people/person:diedkc:/people/person:spouse

4d — 相关搜索

bash Copy
scrapeless-scraping-browser --session-id $SESSION eval '
(function(){
  const out = [];
  document.querySelectorAll("#bres a, .brs_col a, .AJLUJb, [data-reltq]").forEach(a => {
    const t = a.textContent.trim();
    if (t.length > 1 && t.length < 80) out.push(t);
  });
  return JSON.stringify(out.slice(0, 10));
})()
'

返回“阿尔伯特·爱因斯坦”的10个相关查询——页面底部的条带是主题挖掘的可靠查询扩展来源。


第5步 — 分页、本地化和经典SERP

5a — 通过start=N进行分页

谷歌通过&start=0&start=10&start=20 ... 直到&start=90进行分页(实际深度10页;&num=参数在2025年9月禁用,每页现在返回正好10个自然结果)。

每页创建新的会话——谷歌的滚动历史机制会在多个分页跳转的单一会话内降低结果质量。

bash Copy
for START in 0 10 20 30 40 50; do
  SID=$(scrapeless-scraping-browser new-session \
    --name "gs-page-$START" --ttl 300 --proxy-country DE --json \
    | jq -r '.data.taskId')

  scrapeless-scraping-browser --session-id $SID open \
    "https://www.google.com/search?q=scrapeless&hl=zh-CN&gl=cn&start=$START"
  scrapeless-scraping-browser --session-id $SID wait 5000

  scrapeless-scraping-browser --session-id $SID eval '
    JSON.stringify(Array.from(
      document.querySelectorAll("div[data-ved][data-hveid] a[href^=\"http\"]")
    ).slice(0, 10).map(a => a.href))
  ' > "google-page-$START.json"

  scrapeless-scraping-browser stop $SID >/dev/null 2>&1
  sleep 2
done

在验证运行中,第2页(start=10)返回10个网址,与第1页没有重叠——清晰的分页。

5b — 本地化(hlgl

bash Copy
# 德国用户在德国
DE_SID=$(scrapeless-scraping-browser new-session \
  --name "gs-de" --ttl 600 --proxy-country DE --json | jq -r '.data.taskId')

scrapeless-scraping-browser --session-id $DE_SID open \
  "https://www.google.com/search?q=wetter&hl=de&gl=de"
scrapeless-scraping-browser --session-id $DE_SID wait 5000

代理国家(DE)和URL参数(hl=de&gl=de)应当匹配。不匹配的组合可能会触发欧盟流量的同意墙(consent.google.com/*)——通过eval单击拒绝/接受按钮以在提取之前关闭。

5c — 通过udm=14强制经典布局(AI概述抑制)

附加&udm=14可以强制谷歌的“经典”SERP——没有AI概述,仅有自然结果。对于需要稳定的10个自然结果布局的可复现性和管道非常有用。

bash Copy
scrapeless-scraping-browser --session-id $SESSION open \
  "https://www.google.com/search?q=什么是机器学习&hl=zh-CN&gl=cn&udm=14"
scrapeless-scraping-browser --session-id $SESSION wait 5000

验证:udm=14在测试查询中返回了40个自然容器和零AI概述——一个干净的经典布局。

其他有用的参数:

参数 效果
&tbm=nws 新闻垂直
&tbm=shop 购物垂直
&udm=2 图片垂直(在2026年取代tbm=isch
&tbs=qdr:w 仅过去一周
&tbs=qdr:d 仅过去24小时
&udm=14 经典SERP(无AI概述)

第6步 — AI概述(SGE)提取 — 非确定性

AI概述在某些查询上呈现,但在其他查询上不呈现,且同一查询可能会在重复时返回,也可能不会——渲染率因主题、地区、账户状态和会话而异。设计管道以接受这两种结果(present: truepresent: false)作为正常现象。

bash Copy
AI_SID=$(scrapeless-scraping-browser new-session \
  --name "gs-ai" --ttl 600 --proxy-country DE --json | jq -r '.data.taskId')

scrapeless-scraping-browser --session-id $AI_SID 打开
"https://www.google.com/search?q=what+is+machine+learning&hl=zh-CN&gl=cn"
scrapeless-scraping-browser --session-id $AI_SID 等待 5000

最多轮询 10 秒 — AI 概述异步渲染。

重要提示:容器选择器与未提供 AI 概述的查询中的占位符元素匹配。

在声明 "present=true" 之前始终检查 textContent 长度 > 100

否则会产生 text_len=0,cites=0 的假阳性。

for i in 1 2 3 4 5; do
PRESENT=$(scrapeless-scraping-browser --session-id $AI_SID eval '
(function(){
const ai = document.querySelector(
"[data-subtree="gw"], .yp, .LT6XE, [aria-label*="AI Overview"], [jsname="uIYcDb"]"
);
if (!ai || ai.textContent.trim().length < 100) return "no";
return "yes";
})()
' | tail -1 | tr -d '"')
[ "$PRESENT" = "yes" ] && break
sleep 2
done

scrapeless-scraping-browser --session-id $AI_SID eval '
(function(){
const ai = document.querySelector(
"[data-subtree="gw"], .yp, .LT6XE, [aria-label*="AI Overview"], [jsname="uIYcDb"]"
);
// 内容长度保护:在实际未渲染 AI 概述时,容器选择器会对占位符元素产生假阳性。
if (!ai || ai.textContent.trim().length < 100) {
// 在声明不存在之前的二次正文文本启发式
const bodyHit = /AI Overview|Generated with AI/i.test(document.body.innerText);
return JSON.stringify({ present: false, body_heuristic: bodyHit });
}
const citations = Array.from(ai.querySelectorAll("a[href^="http"]"))
.slice(0, 8)
.map(a => ({ url: a.href, text: a.textContent.trim().slice(0, 80) }));
return JSON.stringify({
present: true,
text: ai.textContent.trim().slice(0, 800),
citations,
});
})()
'

Copy
在验证运行中,天真的 `querySelector` 方法对 `what is machine learning` 产生了假阳性 — 无论 AI 概述是否实际渲染,占位符元素都会存在,返回 `present: true, text_len: 0, cites: 0`。上面的内容长度保护 (`textContent.length < 100` ⇒ 视为不存在) 是强制要求的,而非可选的。

生产管道应该:

1. 接受 `present: false` 作为正常状态 — 这不是失败。
2. 可选择在 60 秒以上的新会话上重新轮询 — AI 概述的存在情况在短时间窗口中变化。
3. 使用 `&udm=14` 强制经典 SERP,当不希望 AI 概述时(步骤 5c)。
4. 记录 `body_heuristic: true` 的情况 — 这些在容器选择器失效但正文文本确认 AI 概述已渲染时是有用的信号。这些情况需要在步骤 2 风格中进行选择器发现处理,以捕捉新的容器。

---

## 第 7 步 — 扩展:隔离每个工作线程的 CLI 状态

在验证过程中捕捉到一个重要的陷阱:**Scrapeless CLI 不会隔离同一主机上并行 shell 的守护程序状态。** 同时运行三个 shell,每个 shell 通过 `new-session` mint 自己的会话,然后同时导航,最终会合并为一个胜者 — 另外两个 shell 最终查询相同的底层浏览器上下文,并且三个 `eval` 调用中有两个返回 `0` 组织节点。

这是一个 CLI 层级的本地状态问题,而不是会话 ID 问题。正确地在每个调用中传递 `--session-id` 并不足够;本地主机上共享的守护程序、PID/端口文件和会话池缓存会在并行负载下覆盖 `--session-id`。

**实际工作的原语**(在 2026-04-26 的 10 个以上并行 CLI 代理中验证):

1. **单 shell `&&` 链接** — 在单个原子 shell 调用中为一个作业链接每个 CLI 调用;其他工作线程不能在你的步骤之间交错。这是负载承载的原语。
2. **每个工作线程唯一的会话名称** — 守护程序端口是从名称中哈希计算得出的;唯一名称可以避免端口冲突。
3. **每个主机最多约 3 个并发工作线程** — 经过经验验证,超过这个数量,瞬态 `chrome://new-tab-page/`、`ERR_TUNNEL_CONNECTION_FAILED` 和 “会话终止” 错误会增加。
4. **`USERPROFILE`/`HOME` 环境变量** 已在上游技能中记录,但在验证中不会在 Windows 上隔离 Rust v0.1.1 二进制文件。不要依赖它们。为了更多的分发,跨主机分片。

**后备模式**:

- **跨主机分片。** 一旦超过每个主机约 3 个正在进行的工作线程,将额外的工作线程移动到单独的机器(每个主机都有自己的守护程序)。这是可行的,因为守护程序状态是按主机而非按账户分开的。
- **每个主机顺序执行。** 每个主机一次运行一个 SERP 获取;把其余的排队。简单、较慢,但对于小型管道来说足够。

并发在 ≤ 1 个进行中的请求时是可以的。除非每个工作线程的完整调用序列 (`new-session && open && wait && eval`) 都以一个原子 shell 命令的形式存在,否则不要超过这个限制。

---

## 你会收到什么
谷歌SERP投票的规范模式如下。下面的`organic[0]`值是针对查询`scrapeless`在一个DE-egress会话中的实时响应(2026-04-27验证):

```json
{
  "query": "scrapeless",
  "timestamp": "2026-04-27T15:42:00Z",
  "locale": { "hl": "en", "gl": "us" },
  "organic": [
    {
      "position": 1,
      "title": "Scrapeless: Effortless Web Scraping Toolkit",
      "url": "https://www.scrapeless.com/",
      "displayedUrl": "https://www.scrapeless.com",
      "snippet": "Scrapeless提供基于AI的强大、可扩展的网页抓取和自动化服务,受到领先企业的信赖。我们的企业级解决方案是..."
    }
  ],
  "organicCount":   10,
  "citeCount":      14,
  "featuredSnippet": null,
  "peopleAlsoAsk":   [],
  "knowledgePanel":  null,
  "relatedSearches": [],
  "aiOverview":     { "present": false },
  "errors":         []
}

诚实观察:

  • organicCount通常会是10,但页面上的总“卡片”数量可以超过100——严格过滤h3 + anchor的存在。
  • 生产管道中的featuredSnippet.source应该是其中之一:“selector-classic”、“selector-attrid”、“selector-T286Pc”或“regex-body-text”,以便后续消费者知道每个字段的可信度。
  • aiOverview.present: false是一个有效状态,而不是错误——AI Overview对于每个查询都是非确定性的。

需要无DOM操作的结构化JSON?使用Scraper API

上述抓取浏览器的方法为您提供了完全的灵活性——您可以控制选择器、等待策略和确切的JSON形状。如果您宁愿完全跳过DOM,并直接接收结构化的Google SERP JSON,Scrapeless提供了一个专用的Google搜索抓取器API

表面 抓取浏览器(此帖) Google搜索抓取器API
对选择器的控制 完全——您编写每个querySelector 无——API返回固定的JSON模式
DOM探索成本 您首先读取实时HTML 无——您发送{q, hl, gl}并获取JSON
每请求延迟 2秒最小+5-10秒渲染 单次HTTP往返
适合 自定义字段、SERP特性、AI Overview、非标准布局 结构化排名跟踪、高QPS管道
费用模型 按会话分钟计费 按API调用计费
并发 单shell && 链接+唯一会话名称;容量约为每主机~3个工作者(步骤7) API端——无需管理浏览器状态

对于以稳定时间表监测小关键字集的管道,API通常更便宜且更简单。对于自定义选择器工作、AI Overview收集和非标准布局,抓取浏览器是灵活的路径。

结论

在2026年抓取Google搜索不再是收集静态HTML。这需要一个能够处理旋转SERP布局、固定等待逻辑、地域感知会话和跨有机结果、People Also Ask、知识面板、特色片段、相关搜索和AI Overview的特征级提取的工作流程。

Scrapeless抓取浏览器为团队提供了一种实用的方式将其投入生产。通过住宅代理、防检测指纹识别、JavaScript渲染和会话级地理控制,它减轻了抓取Google的维护负担,同时保持了足够的灵活性,以支持自定义选择器和非标准布局。对于希望采用更简单结构化数据路径的团队,Scrapeless Google搜索抓取器API是更快速的选项。

现在准备抓取吗?

加入我们充满活力的社区,申请**$5-10免费计划**并与其他创新者联系:

Scrapeless官方Discord社区
Scrapeless官方Telegram社区


常见问题

问:我可以避免使用代理吗?
答:不可靠。数据中心IP范围被Google的边缘 aggressively 过滤,来自单个IP的请求模式会快速吸引限流。住宅代理(--proxy-country DE用于Google,请参见第1步)是维持抓取的负载支撑基础。

问:为什么在Google上wait --load networkidle大约需要14秒?
答:Google不停地发出广告/跟踪器XHR——networkidle要求在触发前有一个500毫秒的安静窗口,而Google的安静窗口很少。请使用第2步的固定wait 5000加上div[data-ved][data-hveid]计数检查,而不是依赖networkidle

问:为什么使用Scrapeless抓取浏览器进行Google抓取而不是本地浏览器设置?
因为谷歌搜索高度动态且有很强的防爬虫机制。Scrapeless 处理代理路由、指纹识别和云端渲染,这使得爬取工作流程比维护本地 Playwright 或 Puppeteer 任务更加稳定。

问:Scrapeless 能提取 AI 概述、特色摘要和相关问题吗?
可以。浏览器工作流程设计用于特征级提取,因此您可以从同一会话模式中提取自然结果、特色摘要、相关问题、知识面板、相关搜索和 AI 概述。

问:我什么时候应该使用 Google 搜索爬虫 API?
当您需要结构化 JSON,减少选择器工作和降低操作开销时,请使用 API。当您需要自定义提取、布局弹性或对每个 SERP 特征的读取进行直接控制时,请使用爬虫浏览器。

问:Scrapeless 支持多区域谷歌爬取吗?
可以。您可以为每个会话对代理地理位置、语言和时区进行对齐,这有助于在不同市场和本地 SERP 变化之间保持结果的一致性。

在Scrapeless,我们仅访问公开可用的数据,并严格遵循适用的法律、法规和网站隐私政策。本博客中的内容仅供演示之用,不涉及任何非法或侵权活动。我们对使用本博客或第三方链接中的信息不做任何保证,并免除所有责任。在进行任何抓取活动之前,请咨询您的法律顾问,并审查目标网站的服务条款或获取必要的许可。

最受欢迎的文章

目录