Google 是主流目标里最难抓的,原因很简单:它看到的流量比谁都多,所以对「真实搜索者长什么样」的模型也最丰富。用机房 IP 上量去撞,立刻吃 429、「sorry/index」页,或者软封——结果悄悄变少。这篇讲清到底什么触发 Google 的封禁,以及 2026 年能让 SERP 爬虫活下来的代理与限速策略。
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 会话,让一次搜索的所有页都来自同一个地方。中途混出口,你拿到的就是不同地区拼起来的结果——对排名追踪毫无用处。
Google 也读你的 TLS 握手。一个普通 requests 调用发的 JA3 明晃晃写着 Python,会叠加到 IP 分上。用 curl_cffi(上面用了)或真实浏览器发真实浏览器指纹——见 用 curl_cffi 绕过 TLS 指纹。如果 Google 开始用 JS 同意墙拦你,升级到真实浏览器引擎,逻辑和 Turnstile 那篇 一样——同样的「需要 JS 运行时」。
/sorry/——别再打那个出口,轮换,并指数退避。猛打被标记的 IP 只会延长封禁。/sorry/ 狠狠退避,别重试进更长的封禁。新用户注册即送500M免费流量,首次充值额外加赠,活动期间限时开放。