Скрапинг выдачи Google через прокси (SERP, 2026)

Опубликовано 12 июня 2026 г. · ≈9 мин чтения

Google — самая трудная для скрапинга крупная цель, и причина проста: он видит больше трафика, чем кто-либо, поэтому у него богатейшая модель того, как выглядит реальный искатель. Бейте по нему с серверного IP на любом объёме — и получите 429, страницу «sorry/index» или мягкий блок, где результаты тихо редеют. В этом руководстве — что реально вызывает блоки Google и какая стратегия прокси и лимита запросов держит SERP-скрапер живым в 2026.

Что вызывает блок Google

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-сессии и геолокация

Локализованные результаты (ранжирование, язык, валюта) зависят от локации выхода, поэтому берите прокси в нужной географии и держите sticky-сессию на многостраничный запрос, чтобы все страницы одного поиска шли из одного места. Смешивать выходы посреди запроса — получить результаты, сшитые из разных локалей, бесполезные для отслеживания позиций.

Не забудьте про отпечаток

Google читает и ваше TLS-рукопожатие. Обычный вызов requests шлёт JA3, кричащий «Python», что усугубляет оценку IP. Шлите отпечаток браузера через curl_cffi (выше) или настоящий браузер — см. Обход фингерпринтинга TLS с curl_cffi. Если Google начнёт гейтить на JS-стене согласия, эскалируйте до настоящего движка браузера, как в руководстве по Turnstile — логика «нужен JS-рантайм» та же.

Обрабатывайте блок аккуратно

Чек-лист

Все IP-продукты · огромный пул узлов, доступных в любой момент

Зарегистрируйтесь сейчас и получите до 100% кэшбэка на пополнение

Новым пользователям — 5U при регистрации, бонус к первому пополнению. Акция ограничена по времени.