Como o Google detecta raspadores SERP
O Google investe fortemente na proteção de seus resultados de busca do acesso automatizado. Antes que você possa evitar blocos, você precisa entender os métodos de detecção que a Google emprega. Cada método visa um sinal diferente, e o raspamento SERP eficaz requer abordar todos eles simultaneamente.
Para uma visão completa da arquitetura de raspagem SERP com proxies, consulte SERP raspando com guia proxies.
Detecção baseada em IP
A primeira linha de defesa é a análise IP. O Google rastreia o volume de consulta por endereço IP e sinaliza aqueles que excedem padrões normais de pesquisa humana. Os sinais específicos incluem:
- Frequência do pedido: Mais do que algumas pesquisas por minuto de um único IP desencadeia a limitação da taxa
- Reputação IP: Faixas de IP de datacenter conhecidas recebem escrutínio imediato
- Inconsistência geográfica: Um IP da Alemanha que faz consultas em língua inglesa direcionadas para os EUA levanta bandeiras
- Análise ASN: Google identifica blocos IP pertencentes a provedores de hospedagem vs ISPs
Impressão digital do navegador
Além dos endereços IP, o Google examina o pedido em si de sinais de automação:
| Sinal | O que o Google verifica | Bandeira Vermelha |
|---|---|---|
| Agente do Usuário | Texto de identificação do navegador e do sistema operacional | Faltando, desatualizado ou inconsistente com outros cabeçalhos |
| Aceitar cabeçalhos | Preferências do tipo de conteúdo | Falta a aceitação de idioma ou valores de aceitação não padrão |
| Impressões digitais TLS | Características do aperto de mão SSL/TLS | Impressões digitais correspondentes às bibliotecas HTTP conhecidas (pedidos, urllib) |
| Execução em JavaScript | Comportamento do script do lado do cliente | Nenhuma execução JavaScript (detecção sem cabeça) |
| Comportamento dos cookies | Aceitação e gestão de cookies | Pedidos sem cookies ou padrões de cookies idênticos |
Para uma análise mais profunda dessas técnicas, leia nosso artigo sobre como sistemas anti-bots detectam proxies.
Análise comportamental
Google analisa padrões através de solicitações para detectar automação:
- Calendário do pedido: Intervalos perfeitamente consistentes entre pedidos (por exemplo, exatamente 3 segundos de intervalo) não são naturais
- Padrões de pesquisa: Raspar palavras-chave alfabeticamente ou em sequências previsíveis parece automatizado
- Comportamento da sessão: Usuários reais navegam em várias páginas, clicam nos resultados e passam tempo lendo — raspadores apenas buscam SERPs
- Padrões de volume: Os picos súbitos no volume de consultas de IPs relacionados sugerem raspagem coordenada
As Três Camadas da Estratégia Antibloqueio
Evitar blocos do Google requer uma abordagem em camadas. Nenhuma técnica é suficiente por si só.
Camada 1: Infraestrutura de Proxy
A sua escolha proxy é a base da sua estratégia anti-bloqueio. ProxyHat proxies residenciais Fornecer a diversidade de PI e o nível de confiança necessários para o raspamento SERP sustentado.
Camada 2: Configuração do Pedido
Cada solicitação HTTP deve parecer que vem de um navegador real. Cabeçalhos, cookies e cronometragem precisam ser realistas.
Camada 3: Padrões comportamentais
O padrão geral de sua atividade de raspagem deve imitar o comportamento de busca natural. Isso significa atrasos randomizados, sequências de consulta variadas e volumes de solicitação adequados.
Proxies Residenciais: Sua Primeira Defesa
A única mudança mais impactante que você pode fazer é mudar de datacenter para proxies residenciaisAqui está por que IPs residenciais são fundamentalmente diferentes da perspectiva do Google:
- Os IP residenciais pertencem a ISPs reais (Comcast, AT&T, BT, Deutsche Telekom), não a provedores de nuvem
- Google não pode bloquear intervalos IP residenciais sem bloquear usuários legítimos
- Cada IP tem um histórico de navegação e reputação construída por seu usuário real
- IPs residenciais suportam geo-segmentação de nível municipal para SERPs precisos de localização
Configuração do proxy para raspar SERP
import requests
# ProxyHat residential proxy with automatic rotation
PROXY_URL = "http://USERNAME:PASSWORD@gate.proxyhat.com:8080"
session = requests.Session()
session.proxies = {
"http": PROXY_URL,
"https": PROXY_URL,
}
# Each request automatically gets a new residential IP
response = session.get(
"https://www.google.com/search",
params={"q": "best proxy service", "num": 10, "hl": "en", "gl": "us"},
headers={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Accept-Language": "en-US,en;q=0.9",
"Accept-Encoding": "gzip, deflate, br",
"DNT": "1",
"Connection": "keep-alive",
"Upgrade-Insecure-Requests": "1",
},
timeout=15,
)Consultar Documentação do ProxyHat para configurações avançadas de rotação e sessão.
Cabeçalhos de Pedido Realistas
Cabeçalhos incompletos ou inconsistentes são uma das razões mais comuns para raspadores serem bloqueados. Aqui está um conjunto de cabeçalho completo e realista:
import random
# Rotate between realistic User-Agent strings
USER_AGENTS = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:125.0) Gecko/20100101 Firefox/125.0",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.3 Safari/605.1.15",
]
def get_headers():
ua = random.choice(USER_AGENTS)
headers = {
"User-Agent": ua,
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8",
"Accept-Language": "en-US,en;q=0.9",
"Accept-Encoding": "gzip, deflate, br",
"DNT": "1",
"Connection": "keep-alive",
"Upgrade-Insecure-Requests": "1",
"Sec-Fetch-Dest": "document",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-Site": "none",
"Sec-Fetch-User": "?1",
"Cache-Control": "max-age=0",
}
# Firefox has different Sec-Ch headers
if "Firefox" not in ua:
headers["Sec-Ch-Ua"] = '"Chromium";v="124", "Google Chrome";v="124", "Not-A.Brand";v="99"'
headers["Sec-Ch-Ua-Mobile"] = "?0"
headers["Sec-Ch-Ua-Platform"] = '"Windows"' if "Windows" in ua else '"macOS"'
return headersMantenha sempre as strings do User-Agent atualizadas com as versões atuais do navegador. O envio de um Agente de Usuário Chrome 90 em 2026 é uma bandeira vermelha imediata.
Limitação da Taxa e Tempo de Pedido
O padrão de seus pedidos importa tanto quanto os próprios pedidos. Aqui estão estratégias comprovadas de timing:
Atrasos Aleatórios
Nunca use intervalos fixos entre as solicitações. Em vez disso, randomizar atrasos para imitar o comportamento de busca humana:
import time
import random
def human_delay():
"""Generate a realistic delay between searches."""
# Base delay: 3-8 seconds (normal browsing pace)
base = random.uniform(3, 8)
# Occasionally add longer pauses (simulating reading results)
if random.random() < 0.15:
base += random.uniform(10, 30)
# Rare very short delays (rapid refinement searches)
if random.random() < 0.05:
base = random.uniform(1, 2)
return base
# Usage in scraping loop
for keyword in keywords:
result = scrape_serp(keyword)
delay = human_delay()
time.sleep(delay)Recomendar orientações sobre o volume
| Tipo de Proxy | Pedidos/Min seguros por IP | Máximo de IPs Concorrentes |
|---|---|---|
| Residencial (rotação) | 1-2 | Ilimitado (rotações de grupo) |
| Residencial (sessão fixa) | 1 por 30s | Com base no tamanho da piscina |
| Centro de Dados | 1 por 60 anos | Limitado pela contagem IP |
Tratamento de CAPTCHAs e Blocos
Mesmo com as melhores precauções, você ocasionalmente encontrará blocos. Construa seu raspador para lidar com eles graciosamente.
Detecção de Blocos
def is_blocked(response):
"""Check if Google has blocked or challenged the request."""
# HTTP 429: Rate limited
if response.status_code == 429:
return "rate_limited"
# HTTP 503: Service unavailable (temporary block)
if response.status_code == 503:
return "service_unavailable"
text = response.text.lower()
# CAPTCHA detection
if "captcha" in text or "recaptcha" in text:
return "captcha"
# Unusual traffic message
if "unusual traffic" in text or "automated queries" in text:
return "unusual_traffic"
# Empty or suspicious results
if "did not match any documents" in text and len(text) < 5000:
return "empty_suspicious"
return NoneRepetir estratégia
import time
import random
def scrape_with_retry(keyword, max_retries=3):
"""Scrape a SERP with automatic retry on blocks."""
for attempt in range(max_retries):
proxy_url = "http://USERNAME:PASSWORD@gate.proxyhat.com:8080"
proxies = {"http": proxy_url, "https": proxy_url}
response = requests.get(
"https://www.google.com/search",
params={"q": keyword, "num": 10, "hl": "en", "gl": "us"},
headers=get_headers(),
proxies=proxies,
timeout=15,
)
block_type = is_blocked(response)
if block_type is None:
return parse_results(response.text)
if block_type == "rate_limited":
# Exponential backoff
wait = (2 ** attempt) * 5 + random.uniform(0, 5)
print(f"Rate limited. Waiting {wait:.1f}s (attempt {attempt + 1})")
time.sleep(wait)
elif block_type == "captcha":
# Switch to a new IP and wait
print(f"CAPTCHA detected. Rotating IP and waiting...")
time.sleep(random.uniform(10, 20))
else:
# Generic block: wait and retry
time.sleep(random.uniform(5, 15))
return None # All retries exhaustedCoerência geográfica
Uma medida antidetecção sutil, mas importante, é garantir a consistência geográfica entre os parâmetros de sua solicitação:
- Se seu IP proxy está nos Estados Unidos, definido
gl=usehl=en - Coincidir o cabeçalho Aceitar- Língua com o local de destino
- Use uma string do User-Agent para uma combinação OS/browser comum nesse país
- Definir os tempos de solicitação adequados ao fuso horário
ProxyHat's recurso de direcionamento geométrico permite selecionar proxies de países e cidades específicas, tornando-se direto para manter essa consistência. Saiba mais sobre o uso de pedidos direcionados à localização em nosso guia sobre raspagem sem bloqueio.
Node.js Implementação Anti-Block
Aqui está a estratégia anti-bloco equivalente implementada em Node.js:
const axios = require('axios');
const cheerio = require('cheerio');
const { HttpsProxyAgent } = require('https-proxy-agent');
const USER_AGENTS = [
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36',
'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:125.0) Gecko/20100101 Firefox/125.0',
];
function getRandomUA() {
return USER_AGENTS[Math.floor(Math.random() * USER_AGENTS.length)];
}
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function scrapeWithRetry(keyword, maxRetries = 3) {
for (let attempt = 0; attempt < maxRetries; attempt++) {
const agent = new HttpsProxyAgent('http://USERNAME:PASSWORD@gate.proxyhat.com:8080');
try {
const { data, status } = await axios.get('https://www.google.com/search', {
params: { q: keyword, num: 10, hl: 'en', gl: 'us' },
headers: {
'User-Agent': getRandomUA(),
'Accept': 'text/html,application/xhtml+xml',
'Accept-Language': 'en-US,en;q=0.9',
},
httpsAgent: agent,
timeout: 15000,
validateStatus: () => true,
});
if (status === 429) {
const wait = Math.pow(2, attempt) * 5000 + Math.random() * 5000;
console.log(`Rate limited. Waiting ${(wait/1000).toFixed(1)}s`);
await sleep(wait);
continue;
}
if (data.toLowerCase().includes('captcha')) {
console.log('CAPTCHA detected. Rotating IP...');
await sleep(10000 + Math.random() * 10000);
continue;
}
return cheerio.load(data);
} catch (err) {
console.log(`Attempt ${attempt + 1} failed: ${err.message}`);
await sleep(5000 + Math.random() * 10000);
}
}
return null;
}Técnicas Avançadas
Aleatório de Consulta
Não raspar palavras-chave em ordem alfabética ou sequencial. Embaralhe sua lista de palavras-chave antes de cada execução:
import random
keywords = ["proxy service", "web scraping", "serp tracking", "seo tools"]
random.shuffle(keywords)
# Now scrape in random order
for kw in keywords:
scrape_with_retry(kw)Parâmetros de Pesquisa do Google
Use estes parâmetros para obter resultados limpos e não personalizados:
| Parâmetro | Valor | Objecto |
|---|---|---|
pws | 0 | Desabilitar resultados personalizados |
gl | Código do país | Definir o país de pesquisa |
hl | Código da língua | Definir idioma de interface |
num | 10-100 | Resultados por página |
filter | 0 | Desactivar a filtragem duplicada |
nfpr | 1 | Desactivar a correcção automática |
Agendamento Distribuído
Para monitoramento de SERP em larga escala, distribua solicitações ao longo do tempo para evitar padrões de ruptura. Em vez de raspar 10.000 palavras-chave em uma hora, espalhe-os por 8-12 horas com curvas de tráfego natural (mais pedidos durante o horário de trabalho, menos à noite).
O objetivo não é apenas evitar blocos — é tornar seu tráfego de raspagem indistinguível do comportamento normal de busca do usuário. Cada detalhe importa.
Para mais informações sobre a construção de oleodutos de raspagem confiáveis em grande escala, consulte guia completo para web raspando proxies e Soluções de raspagem de web ProxyHat.






