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
Neste artigo

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.

Perguntas frequentes

Por que o Google bloqueia scrapers de SERP?

O Google bloqueia scraping automatizado para proteger recursos do servidor, preservar a experiencia do usuario e manter o valor dos seus dados de busca. Ele usa analise de IP, browser fingerprinting e padroes comportamentais para detectar automacao.

Proxies residenciais sao suficientes para evitar bloqueios do Google?

Proxies residenciais sao essenciais mas nao suficientes sozinhos. Voce tambem precisa de headers realistas, timing aleatorizado de requisicoes e consistencia geografica adequada entre a localizacao do proxy e os parametros de busca.

Quantas buscas no Google posso fazer por minuto com proxies?

Com proxies residenciais rotativos, voce pode fazer com seguranca 1-2 requisicoes por IP por minuto. Como cada requisicao usa um novo IP de um grande pool, seu throughput total depende do tamanho do pool de proxies e conexoes concorrentes.

O que devo fazer quando meu scraper encontra um CAPTCHA?

Quando um CAPTCHA aparece, pare de usar aquele IP imediatamente, espere 10-20 segundos, depois tente novamente com um IP residencial novo. Se CAPTCHAs persistirem, reduza sua taxa de requisicoes e verifique se seus headers sao realistas.

E melhor usar navegadores headless ou clientes HTTP para SERP scraping?

Para a maioria do SERP scraping, clientes HTTP como requests (Python) ou axios (Node.js) com headers adequados sao suficientes e muito mais rapidos. Navegadores headless so sao necessarios quando o Google requer execucao de JavaScript, o que acontece menos frequentemente com fingerprinting adequado.

Pronto para começar?

Proxies residenciais, ISP e móveis em mais de 148 países. Crie uma conta grátis.

Criar conta grátis
← Voltar ao Blog