Por que acontece a detecção
A detecção de raspagem na Web é um processo multicamadas. Os sistemas anti-bots não dependem de um único sinal — combinam reputação IP, cabeçalhos HTTP, Impressões digitais TLS, impressões digitais do navegador, e análise comportamental para calcular um escore de risco. Quando essa pontuação excede um limiar, você é bloqueado, servido um CAPTCHA, ou alimentado dados enganosos.
Este guia fornece uma abordagem abrangente para reduzir a detecção em todas as camadas. Para uma visão geral de como esses sistemas funcionam, consulte nosso artigo sobre como sistemas anti-bots detectam proxies.
Camada 1: Reputação IP e Seleção de Proxy
O seu endereço IP é a primeira coisa que um servidor vê. Sistemas anti-bot mantêm bancos de dados que pontuam endereços IP por tipo, histórico e comportamento.
Selecção do Tipo de Proxy
| Tipo de Proxy | Risco de detecção | Melhor para |
|---|---|---|
| Residencial | Baixo | A maioria das tarefas de raspagem, locais protegidos |
| ISP (Residencial Estático) | Média Baixa | Sessões longas, contas |
| Centro de Dados | Alta | Sites desprotegidos, tarefas de alto volume |
| Telemóvel | Muito Baixo | Sites de maior proteção, redes sociais |
Para a maioria dos projectos de raspagem, Proxies residenciais do ProxyHat oferecer o melhor equilíbrio de baixo risco de detecção e eficiência de custo. Veja o nosso detalhe comparação do tipo de proxy para orientação.
Estratégia de Rotação IP
# Python: Rotating proxy per request using ProxyHat
import requests
proxy_url = "http://USERNAME:PASSWORD@gate.proxyhat.com:8080"
proxies = {
"http": proxy_url,
"https": proxy_url
}
# Each request through the gateway gets a different IP
for url in urls_to_scrape:
response = requests.get(url, proxies=proxies, timeout=30)
process(response)
- Rodar por pedido para listar páginas e resultados de pesquisa.
- Usar sessões pegajosas para fluxos de várias páginas (paginação, sequências de login).
- Geo- direcionar seus IPs para corresponder ao público esperado do site usando Localização do ProxyHat.
Camada 2: Cabeçalhos HTTP
Os cabeçalhos HTTP incorretos ou ausentes são um dos sinais mais fáceis de detectar para sistemas anti-bots. Um navegador real envia 15-20 cabeçalhos em uma ordem específica; um script padrão Python envia 3-4.
Cabeçalhos Essenciais
# Python: Realistic header set
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
"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, zstd",
"Cache-Control": "max-age=0",
"Sec-Ch-Ua": '"Chromium";v="131", "Not_A Brand";v="24"',
"Sec-Ch-Ua-Mobile": "?0",
"Sec-Ch-Ua-Platform": '"Windows"',
"Sec-Fetch-Dest": "document",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-Site": "none",
"Sec-Fetch-User": "?1",
"Upgrade-Insecure-Requests": "1",
"Connection": "keep-alive"
}
response = requests.get(url, headers=headers, proxies=proxies)
Regras de consistência do cabeçalho
- Combine Sec-Ch-Ua com o Agente do Usuário: Se você reivindicar Chrome 131, seu
Sec-Ch-Uadeve referenciar a versão 131. - Incluir todos os cabeçalhos Sec- Fetch: O Chrome moderno envia-os em cada navegação. Faltar é um sinal forte.
- Definir o idioma de aceitação para corresponder ao seu geoproxy: Um proxy dos EUA com
Accept-Language: ja-JPé suspeito. - Manter a ordem do cabeçalho: Alguns sistemas anti-bot verificam a ordem do cabeçalho. Usar bibliotecas que preservam a ordem de inserção.
Camada 3: TLS e impressão digital HTTP/2
Sua biblioteca de clientes HTTP produz uma única Impressões digitais TLS que os sistemas anti-bots verificam contra o seu alegado agente-utilizador. Um agente de usuário Chrome com uma impressão digital TLS Python é imediatamente sinalizado.
Mitigação por idioma
| Língua | Biblioteca padrão | Risco de detecção | Alternativa de Grau de Navegador |
|---|---|---|---|
| Python | pedidos/urllib3 | Muito Alto | curl cffi com personificar |
| Node.js | axios | Alta | scraping |
| Vai. | rede/http | Muito Alto | uTLS + transporte personalizado |
# Python: Browser-grade TLS with curl_cffi
from curl_cffi import requests as curl_requests
response = curl_requests.get(
"https://example.com",
impersonate="chrome",
proxies={
"http": "http://USERNAME:PASSWORD@gate.proxyhat.com:8080",
"https": "http://USERNAME:PASSWORD@gate.proxyhat.com:8080"
}
)
Camada 4: Impressão digital do navegador
Se você está usando um navegador sem cabeça, JavaScript anti-bot sonda seu impressão digital do navegador — Canvas, WebGL, AudioContext, propriedades de navegador. O princípio-chave é a coerência interna:
- Todos os sinais de impressão digital devem concordar entre si
- A impressão digital deve corresponder às reivindicações do utilizador- agente
- A impressão digital deverá mudar quando rodar proxies
Configuração Stealth
// Node.js: Puppeteer with stealth and proxy
const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
puppeteer.use(StealthPlugin());
const browser = await puppeteer.launch({
headless: 'new',
args: [
'--proxy-server=http://gate.proxyhat.com:8080',
'--disable-blink-features=AutomationControlled',
'--window-size=1920,1080'
]
});
const page = await browser.newPage();
await page.authenticate({
username: 'USERNAME',
password: 'PASSWORD'
});
await page.setViewport({ width: 1920, height: 1080 });
Camada 5: Padrões Comportamentais
Mesmo com perfeito mimetismo técnico, padrões de comportamento tipo bot irá desencadear a detecção. Sistemas anti-bot analisam timing, padrões de navegação e assinaturas de interação.
Solicitar a Hora
- Adicionar atrasos aleatórios: Os humanos não fazem pedidos em intervalos exatos. Adicionar 1-5 segundos de atraso aleatório entre as solicitações.
- Variar atrasos por tipo de página: Páginas de conteúdo merecem pausas mais longas de "leitura" do que listar páginas.
- Evite padrões de ruptura: Não faça 50 pedidos rápidos em seguida, pause. Distribuir pedidos uniformemente com variância natural.
# Python: Natural request timing
import time
import random
def scrape_with_natural_timing(urls, proxies):
for url in urls:
response = requests.get(url, proxies=proxies, headers=headers)
process(response)
# Random delay: 1-4 seconds with normal distribution
delay = max(0.5, random.gauss(2.5, 0.8))
time.sleep(delay)
Padrões de navegação
- Siga caminhos naturais: Visite a página inicial primeiro, depois páginas de categoria, depois páginas de detalhe — não pule diretamente para URLs profundas.
- Definir os cabeçalhos de referência adequados: Cada página deve referenciar a página anterior como referência.
- Reencaminhamento do tratamento: Siga redirecionamentos HTTP naturalmente ao invés de tentar novamente o URL original.
Gerenciamento de Sessão
- Manter os frascos de cookies: Aceitar e devolver cookies em uma sessão — descartar todos os cookies é um sinal bot.
- Limitar o comprimento da sessão: Após 50-100 solicitações, inicie uma nova sessão com um novo IP e cookies.
- Limites da taxa de respeito: Se receber 429 respostas, afaste-se exponencialmente em vez de tentar novamente imediatamente.
Camada 6: Validação da Resposta
A detecção nem sempre resulta num bloqueio. Os sites podem servir conteúdo diferente, injetar dados enganosos ou devolver blocos macios. Sempre valide suas respostas:
- Códigos de estado da verificação: 200 nem sempre significa sucesso — alguns sites retornam 200 com páginas CAPTCHA ou conteúdo vazio.
- Validar a estrutura de conteúdo: Assegurar que a resposta contenha elementos esperados (preços do produto, texto do artigo, etc.).
- Monitor para potes de mel: Links ocultos ou campos de forma projetados para capturar rastreadores automatizados.
- Rastreie as taxas de sucesso: Se sua taxa de sucesso cair abaixo de 90%, algo mudou e precisa de investigação.
Lista de verificação antidetecção abrangente
| Camada | Acção | Prioridade |
|---|---|---|
| IP | Usar proxies residenciais com geo-segmentação | Crítico |
| IP | Rodar IPs por solicitação ou sessão | Crítico |
| Cabeçalhos | Enviar conjuntos de cabeçalho completos e realistas | Crítico |
| Cabeçalhos | Coincidir a língua de aceitação com a localização do proxy | Alta |
| TLS | Usar a biblioteca TLS de nível de navegador | Crítico |
| TLS | Coincidir com a impressão digital do TLS para o navegador reivindicado | Crítico |
| Navegador | Usar plugins ocultos para navegadores sem cabeça | Alta |
| Navegador | Manter perfis de impressões digitais consistentes | Alta |
| Comportamento | Adicionar atrasos aleatórios entre os pedidos | Alta |
| Comportamento | Siga caminhos de navegação naturais | Médio |
| Comportamento | Manter os cookies dentro das sessões | Médio |
| Validação | Verificar o conteúdo da resposta, não apenas códigos de estado | Alta |
Exemplo: raspador anti-detecção completo
# Python: Complete anti-detection scraper setup
from curl_cffi import requests as curl_requests
import time
import random
class StealthScraper:
def __init__(self, proxy_user, proxy_pass):
self.proxy = f"http://{proxy_user}:{proxy_pass}@gate.proxyhat.com:8080"
self.session = curl_requests.Session(impersonate="chrome")
self.session.proxies = {
"http": self.proxy,
"https": self.proxy
}
self.request_count = 0
def get(self, url, referer=None):
headers = {}
if referer:
headers["Referer"] = referer
response = self.session.get(url, headers=headers, timeout=30)
self.request_count += 1
# Rotate session every 50-80 requests
if self.request_count >= random.randint(50, 80):
self._rotate_session()
# Natural delay
time.sleep(max(0.5, random.gauss(2.0, 0.6)))
return response
def _rotate_session(self):
self.session = curl_requests.Session(impersonate="chrome")
self.session.proxies = {
"http": self.proxy,
"https": self.proxy
}
self.request_count = 0
# Usage
scraper = StealthScraper("USERNAME", "PASSWORD")
home = scraper.get("https://example.com")
listing = scraper.get("https://example.com/products", referer="https://example.com")
detail = scraper.get("https://example.com/products/123", referer="https://example.com/products")
Quando subir sua abordagem
Comece com a abordagem mais simples e aumente apenas quando necessário:
- Nível 1 — Cliente HTTP + cabeçalhos + proxy: Funciona para a maioria dos sites. Utilização
curl_cffiougot-scrapingcom ProxyHat proxies. - Nível 2 — Adicionar TLS de tipo navegador: Necessário quando o local verificar as impressões digitais JA3/JA4.
- Nível 3 — Navegador sem cabeça + furtivo: Necessário para conteúdo renderizado em JavaScript e sistemas anti-bot sofisticados.
- Nível 4 — Automação completa do navegador com mimetismo comportamental: Reservado para os locais mais protegidos (Cloudflare Enterprise, PerimeterX, etc.).
Para padrões de implementação em idiomas específicos, consulte nossos guias: Python, Node.js, e Vai..
Diretrizes éticas
As técnicas antidetecção são ferramentas — o seu uso ético depende do contexto. Sempre:
- Respeito robots.txt e termos de serviço
- Raspe apenas dados disponíveis publicamente
- Limitar as taxas de solicitação para evitar o impacto do servidor
- Cumpra com os regulamentos de proteção de dados (GDPR, CCPA)
- Utilização práticas éticas de raspagem como a sua linha de base
O objectivo da antidetecção não é contornar a segurança legítima. É para garantir que seu acesso automatizado a dados públicos não seja incorretamente marcado como malicioso.






