Google — самая трудная для скрапинга крупная цель, и причина проста: он видит больше трафика, чем кто-либо, поэтому у него богатейшая модель того, как выглядит реальный искатель. Бейте по нему с серверного IP на любом объёме — и получите 429, страницу «sorry/index» или мягкий блок, где результаты тихо редеют. В этом руководстве — что реально вызывает блоки Google и какая стратегия прокси и лимита запросов держит SERP-скрапер живым в 2026.
Google не полагается на один сигнал — он складывает несколько и банит, когда суммарная оценка переходит черту:
На большинстве целей с публичными данными можно обойтись серверными IP. Google — исключение: его оценка репутации ASN агрессивна настолько, что серверные прокси душатся почти сразу. Резидентные выходы — настоящие потребительские ASN — вот что позволяет SERP-скраперу держать объём. Серверные оставьте на всё остальное, а резидентный бюджет тратьте там, где он реально решает.
Ротация распределяет нагрузку, чтобы ни один IP не выглядел ботом, но дисциплина, которая держит вас живым, — это скорость на выход, а не размер пула. Тысяча прокси всё равно получит бан, если палить из всех сразу. Задавайте темп каждому выходу как человек:
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) сам по себе отпечаток. Варьируйте её и распределяйте запросы по выходам, чтобы каждый оставался ниже порога Google на IP.
Локализованные результаты (ранжирование, язык, валюта) зависят от локации выхода, поэтому берите прокси в нужной географии и держите sticky-сессию на многостраничный запрос, чтобы все страницы одного поиска шли из одного места. Смешивать выходы посреди запроса — получить результаты, сшитые из разных локалей, бесполезные для отслеживания позиций.
Google читает и ваше TLS-рукопожатие. Обычный вызов requests шлёт JA3, кричащий «Python», что усугубляет оценку IP. Шлите отпечаток браузера через curl_cffi (выше) или настоящий браузер — см. Обход фингерпринтинга TLS с curl_cffi. Если Google начнёт гейтить на JS-стене согласия, эскалируйте до настоящего движка браузера, как в руководстве по Turnstile — логика «нужен JS-рантайм» та же.
/sorry/ — перестаньте бить по этому выходу, ротируйте и отступайте экспоненциально. Долбить помеченный IP — продлевать бан./sorry/, а не повторяйте в более длинный бан.Новым пользователям — 5U при регистрации, бонус к первому пополнению. Акция ограничена по времени.