O Google é o alvo mainstream mais difícil de fazer scraping, e a razão é simples: ele vê mais tráfego do que qualquer um, então tem o modelo mais rico de como é um buscador real. Acesse-o de um IP de datacenter em qualquer volume e você recebe um 429, uma página "sorry/index" ou um bloqueio suave em que os resultados silenciosamente rareiam. Este guia cobre o que de fato dispara os bloqueios do Google e a estratégia de proxy e rate-limit que mantém um scraper de SERP vivo em 2026.
O Google não depende de um único sinal — ele empilha vários e bane quando a pontuação combinada cruza uma linha:
Para a maioria dos alvos, você consegue se virar com IPs de datacenter em dados públicos. O Google é a exceção: sua pontuação de reputação de ASN é agressiva o suficiente para que proxies de datacenter sejam estrangulados quase imediatamente. Exits residenciais — ASNs reais de consumidor — são o que permite a um scraper de SERP sustentar volume. Reserve o datacenter para todo o resto e gaste o orçamento residencial onde ele realmente faz diferença.
A rotação distribui a carga para que nenhum IP único pareça um bot, mas a disciplina que te mantém vivo é a taxa por exit, não apenas o tamanho do pool. Mil proxies ainda são banidos se você disparar todos eles a todo vapor. Marque o ritmo de cada exit como uma pessoa:
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
O atraso aleatorizado faz um trabalho real: um sleep(3) fixo é, em si, um fingerprint. Varie-o e distribua as consultas entre exits para que cada um fique abaixo do limiar por IP do Google.
Resultados localizados (rankings, idioma, moeda) dependem da localização do exit, então escolha proxies na geografia que você quer medir e mantenha uma sessão sticky para uma consulta de múltiplas páginas, de modo que todas as páginas de uma busca venham do mesmo lugar. Misturar exits no meio da consulta te dá resultados costurados de locais diferentes — inúteis para rastreamento de ranking.
O Google também lê seu handshake TLS. Uma chamada simples de requests envia um JA3 que grita Python, o que se soma à pontuação do IP. Envie um fingerprint de navegador real com curl_cffi (usado acima) ou um navegador real — veja Como Burlar o TLS Fingerprinting com curl_cffi. Se o Google começar a barrar com um muro de consentimento de JS, escale para um motor de navegador real, como coberto no guia do Turnstile — a mesma lógica de "precisa de um runtime JS" se aplica.
/sorry/ — pare de acessar esse exit, rotacione e recue exponencialmente. Martelar um IP sinalizado prolonga o banimento./sorry/ em vez de insistir e entrar num banimento mais longo.Novos usuários recebem 500MB ao se cadastrar, mais um bônus na primeira recarga. Oferta por tempo limitado.