Como funciona a detecção de nuvem
Cloudflare é o serviço antibot mais amplamente implantado, protegendo mais de 20% de todos os sites. Entender como ele detecta o tráfego automatizado é essencial para qualquer pessoa construindo ferramentas de raspagem legítimas. Cloudflare usa um pipeline de detecção multi-camadas:
- Pontuação de reputação IP: Cloudflare mantém um banco de dados global de inteligência de ameaças. Os IPs do datacenter, os intervalos de VPN conhecidos e os endereços previamente marcados recebem maiores escores de risco.
- Impressões digitais TLS: Análises Cloudflare Cliente TLSHello messages Para determinar se o cliente de ligação corresponde à sua identidade reivindicada.
- Impressão digital do navegador: Sonda de desafios JavaScript canvas, WebGL, propriedades do navegador, e dezenas de outros sinais.
- Desafios do JavaScript: Cloudflare serve JavaScript que deve ser executado corretamente em um ambiente de navegador real.
- Análise comportamental: Solicitar tempo, padrões de navegação, movimentos do mouse e sinais de interação são analisados.
- Modelos de aprendizado de máquina: Todos os sinais são alimentados em modelos ML que se adaptam continuamente a novos padrões de automação.
Para uma visão mais ampla, consulte guia abrangente para sistemas de detecção anti-bot.
Níveis de proteção de chama em nuvem
| Nível | Métodos de detecção | Nível de Dificuldade | Sites Típicos |
|---|---|---|---|
| Básico (Livre) | Reputação IP, desafio JS básico | Baixo | Pequenos blogs, sites pessoais |
| Pro | + Regras WAF, limitação de taxa | Médio | Empresas médias, SaaS |
| Negócios | + Gerenciamento Avançado de Bots | Alta | Comércio electrónico, sítios empresariais |
| Empresa | + ML-powered bot pontuação, análise comportamental | Muito Alto | Principais retalhistas, serviços financeiros |
Framework ético para acessar sites protegidos por nuvem
Antes de aplicar qualquer abordagem técnica, estabelecer limites éticos claros:
- Verifique primeiro as APIs: Muitos sites protegidos por Cloudflare oferecem APIs oficiais para acesso a dados. Prefiro sempre isto.
- Respeitar robots.txt: Se o site explicitamente não permitir raspar caminhos específicos, honre essas diretivas.
- Termos de serviço de revisão: Entenda o que o site permite em relação ao acesso automatizado.
- Acesse apenas dados públicos: Nunca tente ignorar a autenticação ou acessar dados privados.
- Minimizar o impacto do servidor: Use taxas de solicitação razoáveis e não sobrecarregue o servidor alvo.
- Considere licenciamento de dados: Para casos de uso comercial, explore acordos de licenciamento de dados.
As técnicas contidas neste guia são concebidas para o acesso legítimo aos dados publicamente disponíveis. Eles nunca devem ser usados para contornar proteções de segurança para acesso não autorizado, roubo de credenciais ou ataques de negação de serviço.
Estratégia 1: Proxies residenciais com IPs limpos
O primeiro passo mais eficaz é garantir que seus endereços IP tenham reputação limpa. A pontuação IP da Cloudflare penaliza fortemente o datacenter e os IPs VPN.
# Python: Using residential proxies for Cloudflare-protected sites
from curl_cffi import requests as curl_requests
response = curl_requests.get(
"https://cloudflare-protected-site.com",
impersonate="chrome",
proxies={
"http": "http://USERNAME:PASSWORD@gate.proxyhat.com:8080",
"https": "http://USERNAME:PASSWORD@gate.proxyhat.com:8080"
},
timeout=30
)
if response.status_code == 200:
print("Access granted")
elif response.status_code == 403:
print("Blocked — may need additional measures")
elif response.status_code == 503:
print("Cloudflare challenge page — need browser execution")
Proxies residenciais do ProxyHat fornecer IPs classificados como endereços residenciais genuínos no banco de dados da Cloudflare, ignorando a camada de reputação IP. Veja o nosso comparação de proxies residenciais vs VPNs por que os IPs VPN falham contra o Cloudflare.
Estratégia 2: Impressões digitais TLS de grau de navegador
Verificações de chama em nuvem Impressões digitais JA3/JA4 TLS Identificar o cliente de ligação. Python's requests biblioteca, Go's net/http, e clientes padrão de Node.js todos produzem assinaturas TLS não-browser que Cloudflare sinaliza.
| Cliente | Resultado do Cloudflare | Porquê? |
|---|---|---|
| Pedidos em Python | Bloqueado ou desafiado | A impressão digital do OpenSSL TLS não é um navegador |
| curl cffi (impersonate="chrome") | Normalmente passa | Mimics Chrome aborrecimentoSSL impressão digital |
| Chrome sem cabeça (puppeer/Playwright) | Normalmente passa | Real Pilha TLS ChatoSSL |
| Ir para a rede/http | Bloqueado ou desafiado | Ir a impressão digital cripto/tls é distinta |
| Vai com uTLS (Olá Chrome) | Normalmente passa | Impressão digital do Chrome Mimics |
Estratégia 3: Lidar com Desafios JavaScript
Os desafios de JavaScript da Cloudflare requerem um ambiente de navegador real para resolver. Existem duas abordagens:
Abordagem A: Navegador sem Cabeça
// Node.js: Playwright with stealth for Cloudflare challenges
const { chromium } = require('playwright');
async function accessCloudflare(url) {
const browser = await chromium.launch({
proxy: {
server: 'http://gate.proxyhat.com:8080',
username: 'USERNAME',
password: 'PASSWORD'
}
});
const context = await browser.newContext({
locale: 'en-US',
timezoneId: 'America/New_York',
viewport: { width: 1920, height: 1080 }
});
const page = await context.newPage();
// Navigate and wait for Cloudflare challenge to resolve
await page.goto(url, { waitUntil: 'networkidle', timeout: 60000 });
// Cloudflare challenges typically redirect after completion
// Wait for the actual content to load
await page.waitForSelector('body', { timeout: 30000 });
// Check if we passed the challenge
const title = await page.title();
if (title.includes('Just a moment') || title.includes('Attention Required')) {
// Challenge not yet resolved — wait longer
await page.waitForNavigation({ waitUntil: 'networkidle', timeout: 30000 });
}
const content = await page.content();
await browser.close();
return content;
}
Abordagem B: Extração e reutilização de cookies
Resolver o desafio uma vez em um navegador sem cabeça, extrair os cookies (especialmente cf_clearance), então reutilizá-los em um cliente HTTP leve:
// Node.js: Extract Cloudflare cookies for reuse
const { chromium } = require('playwright');
async function extractCfCookies(url) {
const browser = await chromium.launch({
proxy: {
server: 'http://gate.proxyhat.com:8080',
username: 'USERNAME-session-cf1',
password: 'PASSWORD'
}
});
const context = await browser.newContext({
locale: 'en-US',
timezoneId: 'America/New_York',
});
const page = await context.newPage();
await page.goto(url, { waitUntil: 'networkidle', timeout: 60000 });
// Wait for challenge resolution
await page.waitForTimeout(10000);
// Extract cookies
const cookies = await context.cookies();
const cfClearance = cookies.find(c => c.name === 'cf_clearance');
const userAgent = await page.evaluate(() => navigator.userAgent);
await browser.close();
return { cookies, userAgent, cfClearance };
}
// Reuse cookies with got-scraping (same proxy session!)
import { gotScraping } from 'got-scraping';
const { cookies, userAgent } = await extractCfCookies('https://example.com');
const cookieString = cookies.map(c => `${c.name}=${c.value}`).join('; ');
const response = await gotScraping({
url: 'https://example.com/api/data',
proxyUrl: 'http://USERNAME-session-cf1:PASSWORD@gate.proxyhat.com:8080',
headers: {
'Cookie': cookieString,
'User-Agent': userAgent, // Must match the browser that solved the challenge
}
});
Importante: A cf_clearance cookie está ligado ao endereço IP e usuário-agente que resolveu o desafio. Você deve usar a mesma sessão de proxy (IP colado) e o mesmo usuário- agente ao reutilizá-lo.
Estratégia 4: Otimização do padrão de solicitação
A análise comportamental da Cloudflare indica padrões de solicitação não humanos. Siga estes padrões para acesso legítimo:
Fluxo Realístico de Navegação
# Python: Realistic navigation pattern
from curl_cffi import requests as curl_requests
import time
import random
session = curl_requests.Session(impersonate="chrome")
session.proxies = {
"http": "http://USERNAME:PASSWORD@gate.proxyhat.com:8080",
"https": "http://USERNAME:PASSWORD@gate.proxyhat.com:8080"
}
# Step 1: Visit homepage first
home = session.get("https://example.com")
time.sleep(random.uniform(2.0, 4.0))
# Step 2: Navigate to category (with Referer)
category = session.get(
"https://example.com/products",
headers={"Referer": "https://example.com"}
)
time.sleep(random.uniform(1.5, 3.5))
# Step 3: Browse items (with proper Referer chain)
for item_url in item_urls[:20]:
item = session.get(
item_url,
headers={"Referer": "https://example.com/products"}
)
time.sleep(random.uniform(1.0, 3.0))
Orientações de limitação de taxas
| Nível de chama em nuvem | Taxa de solicitação segura | Atraso entre Pedidos |
|---|---|---|
| Básico/Livre | 20-30 req/min | 2-3 segundos |
| Pro | 10-20 req/min | 3-6 segundos |
| Negócios | 5-10 req/min | 6-12 segundos |
| Empresa | 2-5 req/min | 12-30 segundos |
Estratégia 5: Manipulação de Respostas Comuns em Nuvem
| Código do Estado | Significado | Acção |
|---|---|---|
| 200 | Sucesso | Processar o conteúdo normalmente |
| 403 | Proibido — IP ou impressão digital bloqueada | Rodar para um novo IP, verifique a impressão digital TLS |
| 429 | Taxa limitada | Recuar exponencialmente, reduzir a taxa de solicitação |
| 503 | Desafio JavaScript | Usar o navegador sem cabeça para resolver |
| 520-527 | Erros no servidor Cloudflare | Repetir após o atraso — problema do servidor de origem |
# Python: Response handling with retry logic
import time
import random
def cloudflare_resilient_request(session, url, max_retries=3):
for attempt in range(max_retries):
try:
response = session.get(url, timeout=30)
if response.status_code == 200:
return response
if response.status_code == 403:
# IP flagged — rotate session
print(f"403 on attempt {attempt + 1} — rotating IP")
session = create_new_session()
time.sleep(random.uniform(5, 10))
continue
if response.status_code == 429:
# Rate limited — exponential backoff
wait = (2 ** attempt) * 5 + random.uniform(0, 5)
print(f"429 — waiting {wait:.1f}s")
time.sleep(wait)
continue
if response.status_code == 503:
# JS challenge — need headless browser
print("503 — JavaScript challenge detected")
return None # Escalate to browser-based approach
except Exception as e:
print(f"Error: {e}")
time.sleep(random.uniform(2, 5))
return None
Abordagem Completa Multi-Layer
A estratégia mais confiável combina todas as camadas:
- Proxies residenciais: IPs residenciais ProxyHat Para uma reputação IP limpa.
- TLS de nível de navegador:
curl_cffiou navegador sem cabeça para obter impressões digitais corretas. - Cabeçalhos consistentes: Completar os conjuntos de cabeçalho correspondentes ao navegador reivindicado.
- Tempo natural: Atrasos aleatórios seguindo padrões de navegação humanos.
- Gestão de cookies: Aceite e mantenha cookies durante todas as sessões.
- Correntes de referência: Fluxo de navegação adequado da página inicial às páginas alvo.
Para estratégias abrangentes de redução de detecção, consulte guia antidetecção completo. Para integração de proxy em linguagens de programação, consulte nossos guias para Python, Node.js, e Vai..
Quando não raspar
Reconhecer situações em que a raspagem não é a abordagem certa:
- O site tem uma API pública: Sempre use APIs oficiais quando disponíveis.
- Os dados estão por trás da autenticação: O acesso a dados protegidos por login via raspagem é tipicamente uma violação do ToS.
- O site proíbe explicitamente a raspagem: Respeitar proibições claras no TOS.
- O licenciamento de dados está disponível: Para uso comercial, comprar licenças de dados é muitas vezes mais confiável e legal.
- O conteúdo tem direitos autorais: A eliminação de conteúdos com direitos de autor para redistribuição suscita preocupações jurídicas.
Consultar Documentação do ProxyHat as orientações e os termos de serviço de utilização responsável.






