用代理爬取 Google 搜尋結果(SERP,2026)

發佈於 2026年6月12日 · 約 9 分鐘閱讀

Google 是主流目標中最難爬取的一個,理由很簡單:它看到的流量比任何人都多,因此它對「一個真實搜尋者長什麼樣子」擁有最豐富的模型。在任何流量規模下從機房 IP 命中它,你都會拿到 429、一個「sorry/index」頁面,或是一種軟封鎖 — 結果會悄悄變得稀疏。本指南涵蓋真正觸發 Google 封鎖的因素,以及在 2026 年讓一個 SERP 爬蟲存活的代理與限速策略。

什麼會觸發 Google 封鎖

Google 不倚賴單一訊號 — 它疊加多個訊號,當綜合分數越過某條線時便封鎖:

在這裡住宅 IP 沒得商量

對多數目標而言,在公開資料上你可以靠機房 IP 矇混過去。Google 是例外:它的 ASN 信譽評分激進到足以讓機房代理幾乎立刻被節流。住宅 exit — 真實的消費者 ASN — 才是讓一個 SERP 爬蟲撐住流量的關鍵。把機房 IP 留給其他一切,把住宅預算花在真正能起作用的地方。

輪換,但要對每個 exit 限速

輪換能分散負載,讓任何單一 IP 都不像機器人,但讓你存活下來的紀律是每個 exit的速率,而不只是 pool 的大小。即使有一千個代理,只要你把它們全速火力全開,照樣會被封。把每個 exit 都調成像一個真人的步調:

import time, random, itertools
from curl_cffi import requests   # browser TLS fingerprint, see notes below

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("rate-limited - back off and rotate")
    return r.text

for q in queries:
    html = serp(q)
    parse(html)
    time.sleep(random.uniform(2.0, 5.0))   # human-paced gap between queries

那個隨機化的延遲是在做實事:一個固定的 sleep(3) 本身就是一種指紋。讓它有變化,並把查詢分散到各個 exit,使每一個都維持在 Google 的每個 IP 門檻之下。

sticky 工作階段與地理位置

在地化結果(排名、語言、貨幣)取決於 exit 的所在地,所以要挑選你想要衡量的地理區裡的代理,並對一個多頁查詢維持一個 sticky 工作階段,讓一次搜尋的所有分頁都來自同一個地方。在查詢途中混用 exit,會給你一份由不同地區拼湊而成的結果 — 對排名追蹤毫無用處。

別忘了指紋

Google 也會讀你的 TLS 交握。一個樸素的 requests 呼叫送出的 JA3 大喊著 Python,這會加重 IP 評分。用 curl_cffi(如上所用)或一個真實瀏覽器送出真實的瀏覽器指紋 — 參見 用 curl_cffi 繞過 TLS 指紋偵測。如果 Google 開始用一道 JS 同意牆來把關,就升級到一個真實的瀏覽器引擎,如 Turnstile 指南所述 — 同樣的「需要一個 JS 執行環境」邏輯也適用。

優雅地處理封鎖

檢查清單

適用於所有 IP 產品 · 龐大的節點池隨時可用

立即註冊,儲值最高可享 100% 返現

新用戶註冊即送 500M免費流量,首次儲值另有贈金。優惠限時供應。