用代理抓取 Google 搜索结果(SERP,2026)

发布于 2026年6月12日 · 阅读约 9 分钟

Google 是主流目标里最难抓的,原因很简单:它看到的流量比谁都多,所以对「真实搜索者长什么样」的模型也最丰富。用机房 IP 上量去撞,立刻吃 429、「sorry/index」页,或者软封——结果悄悄变少。这篇讲清到底什么触发 Google 的封禁,以及 2026 年能让 SERP 爬虫活下来的代理与限速策略。

什么触发 Google 封禁

Google 不靠单一信号——它叠几个,综合分过线就封:

这里住宅代理没得商量

大多数目标抓公开数据用机房 IP 也能蒙混过去。Google 是例外:它的 ASN 信誉评分凶到机房代理几乎立刻被限速。住宅出口——真实消费者 ASN——才是让 SERP 爬虫撑住量的关键。机房留给别的活,住宅预算花在真正见效的地方。

轮换,但要按出口限速

轮换把负载摊开,让没有单个 IP 像机器人;但真正保命的纪律是每个出口的速率,不只是池子大小。一千个代理全速开火照样被封。把每个出口的节奏调得像个人:

import time, random, itertools
from curl_cffi import requests   # 浏览器 TLS 指纹,见下方说明

PROXIES = [
    "socks5h://USERNAME:[email protected]:913",
    "socks5h://USERNAME:[email protected]:913",
]
pool = itertools.cycle(PROXIES)

def serp(query, page=0):
    proxy = next(pool)
    params = {"q": query, "start": page * 10, "hl": "en"}
    r = requests.get("https://www.google.com/search", params=params,
                     impersonate="chrome",
                     proxies={"http": proxy, "https": proxy}, timeout=30)
    if r.status_code == 429 or "/sorry/" in r.url:
        raise RuntimeError("被限速——退避并轮换")
    return r.text

for q in queries:
    html = serp(q)
    parse(html)
    time.sleep(random.uniform(2.0, 5.0))   # 查询之间留真人节奏的间隔

那个随机延迟是真在干活:固定的 sleep(3) 本身就是一个指纹。把它打散,并把查询摊到多个出口,让每个出口都待在 Google 的单 IP 阈值之下。

Sticky 会话与地理位置

本地化结果(排名、语言、货币)取决于出口位置,所以挑你要测的那个地区的代理,并对多页查询保持一条 sticky 会话,让一次搜索的所有页都来自同一个地方。中途混出口,你拿到的就是不同地区拼起来的结果——对排名追踪毫无用处。

别忘了指纹

Google 也读你的 TLS 握手。一个普通 requests 调用发的 JA3 明晃晃写着 Python,会叠加到 IP 分上。用 curl_cffi(上面用了)或真实浏览器发真实浏览器指纹——见 用 curl_cffi 绕过 TLS 指纹。如果 Google 开始用 JS 同意墙拦你,升级到真实浏览器引擎,逻辑和 Turnstile 那篇 一样——同样的「需要 JS 运行时」。

优雅处理封禁

清单

所有IP产品通用 · 海量节点随时可用

现在加入,立享最高100%充值返现

新用户注册即送500M免费流量,首次充值额外加赠,活动期间限时开放。