Como Evitar Bloqueios do Google ao Fazer SERP Scraping

Saiba como o Google detecta raspadores SERP e como evitar blocos usando proxies residenciais, cabeçalhos realistas, tempo aleatório e estratégias de repetição com exemplos de código.

Como Evitar Bloqueios do Google ao Fazer SERP Scraping

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:

Impressão digital do navegador
SinalO que o Google verificaBandeira Vermelha
Agente do UsuárioTexto de identificação do navegador e do sistema operacionalFaltando, desatualizado ou inconsistente com outros cabeçalhos
Aceitar cabeçalhosPreferências do tipo de conteúdoFalta a aceitação de idioma ou valores de aceitação não padrão
Impressões digitais TLSCaracterísticas do aperto de mão SSL/TLSImpressões digitais correspondentes às bibliotecas HTTP conhecidas (pedidos, urllib)
Execução em JavaScriptComportamento do script do lado do clienteNenhuma execução JavaScript (detecção sem cabeça)
Comportamento dos cookiesAceitação e gestão de cookiesPedidos 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 headers
Mantenha 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

Recomendar orientações sobre o volume
Tipo de ProxyPedidos/Min seguros por IPMáximo de IPs Concorrentes
Residencial (rotação)1-2Ilimitado (rotações de grupo)
Residencial (sessão fixa)1 por 30sCom base no tamanho da piscina
Centro de Dados1 por 60 anosLimitado 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 None

Repetir 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 exhausted

Coerê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=us e hl=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âmetros de Pesquisa do Google
ParâmetroValorObjecto
pws0Desabilitar resultados personalizados
glCódigo do paísDefinir o país de pesquisa
hlCódigo da línguaDefinir idioma de interface
num10-100Resultados por página
filter0Desactivar a filtragem duplicada
nfpr1Desactivar 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.

Pronto para começar?

Acesse mais de 50M de IPs residenciais em mais de 148 países com filtragem por IA.

Ver preçosProxies residenciais
← Voltar ao Blog