Come funziona la rilevazione del cloudflare
Cloudflare è il servizio anti-bot più diffuso, proteggendo oltre il 20% di tutti i siti web. Capire come rileva il traffico automatizzato è essenziale per chiunque costruisca strumenti di raschiamento legittimi. Cloudflare utilizza una pipeline di rilevamento multistrato:
- Valutazione della reputazione IP: Cloudflare mantiene un database globale di informazioni sulle minacce. Gli IP dei datacenter, gli intervalli VPN noti e gli indirizzi precedentemente contrassegnati ricevono punteggi di rischio più elevati.
- Impronte TLS: Cloudflare analizza Messaggi TLS ClientHello per determinare se il client di collegamento corrisponde alla sua identità rivendicata.
- Impronte del browser: JavaScript sfide sonda tela, WebGL, proprietà navigatore, e decine di altri segnali.
- sfide JavaScript: Cloudflare serve JavaScript che deve eseguire correttamente in un vero ambiente del browser.
- Analisi comportamentale: Richiedi tempistiche, modelli di navigazione, movimenti del mouse e segnali di interazione vengono analizzati.
- Modelli di apprendimento automatico: Tutti i segnali sono alimentati in modelli ML che si adattano continuamente a nuovi modelli di automazione.
Per una visione più ampia, vedere il nostro guida completa ai sistemi di rilevamento anti-bot.
Pneumatici di protezione del cloudflare
| Tiro | Metodi di rilevamento | Livello di difficoltà | Siti tipici |
|---|---|---|---|
| Basic (Free) | reputazione IP, sfida di base JS | Basso | Piccoli blog, siti personali |
| Pro | + regole WAF, limitazione dei tassi | Media | Imprese medie, SaaS |
| Affari | + Gestione avanzata del Bot | Alto | E-commerce, siti aziendali |
| Imprese | + ML-powered bot scoring, analisi comportamentale | Molto alto | Principali rivenditori, servizi finanziari |
Quadro etico per l'accesso ai siti Cloudflare-Protected
Prima di attuare qualsiasi approccio tecnico, stabilire confini etici chiari:
- Controlla prima le API: Molti siti protetti da cloudflare offrono API ufficiali per l'accesso ai dati. Preferisci sempre questi.
- Rispettare robot.txt: Se il sito non consente esplicitamente di raschiare percorsi specifici, onorare queste direttive.
- Termini di servizio: Capire cosa il sito permette per quanto riguarda l'accesso automatizzato.
- Accesso solo ai dati pubblici: Non tentare mai di bypassare l'autenticazione o accedere ai dati privati.
- Minimizza l'impatto del server: Utilizzare i tassi di richiesta ragionevoli e non sovraccaricare il server di destinazione.
- Considerare le licenze di dati: Per casi di uso commerciale, esplorare accordi di licenza di dati.
Le tecniche di questa guida sono progettate per l'accesso legittimo ai dati pubblicamente disponibili. Essi non dovrebbero mai essere utilizzati per aggirare le protezioni di sicurezza per l'accesso non autorizzato, furto di credenziali, o attacchi negazione di servizio.
Strategia 1: Processi residenziali con IP puliti
Il primo passo più efficace è garantire che gli indirizzi IP hanno una reputazione pulita. Il punteggio IP di Cloudflare penalizza fortemente i datacenter e gli IP 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")
I proxy residenziali di ProxyHat fornire IP classificati come indirizzi residenziali autentici nel database di Cloudflare, bypassando lo strato di reputazione IP. Vedi il nostro confronto di proxy residenziali vs VPN per il motivo per cui gli IP VPN falliscono contro Cloudflare.
Strategia 2: Browser-Grade TLS Impronte digitali
Controlli Cloudflare JA3/JA4 TLS impronte digitali per identificare il client di connessione. Python's requests biblioteca, Go's net/http, e i client di default di Node.js tutti producono firme TLS non-browser che Cloudflare bandiere.
| Cliente | Risultato del Cloudflare | Perché? |
|---|---|---|
| Richieste di Python | Bloccato o sfidato | L'impronta digitale OpenSSL TLS è non-browser |
| curl cffi (impersonate="chrome") | Di solito passa | Mimica Chrome BoringSSL impronte |
| Chrome senza testa (Puppeteer/Playwright) | Di solito passa | Real BoringSSL TLS stack |
| Vai al sito | Bloccato o sfidato | Go crypto/tls impronta digitale è distintivo |
| Vai con uTLS (Croma ciao) | Di solito passa | Mimics Chrome impronta |
Strategia 3: Gestione delle sfide JavaScript
Le sfide JavaScript di Cloudflare richiedono un ambiente reale del browser da risolvere. Ci sono due approcci:
Approccio A: Browser senza testa
// 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;
}
Approccio B: Estrazione e riutilizzo dei cookie
Risolvere la sfida una volta in un browser senza testa, estrarre i cookie (soprattutto cf_clearance), poi riutilizzarli in un client HTTP leggero:
// 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: The cf_clearance cookie è legato all'indirizzo IP e all'utente che ha risolto la sfida. È necessario utilizzare la stessa sessione di proxy (IP appiccicosa) e l'utente-agente identico durante il riutilizzo.
Strategia 4: richiesta ottimizzazione del modello
L'analisi comportamentale di Cloudflare contrassegna i modelli di richiesta non umani. Seguire questi modelli per un accesso legittimo:
Flusso di navigazione realistico
# 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))
Linee guida di limitazione del tasso
| Pneumatico Cloudflare | Tariffa di richiesta sicura | Ritardo tra richieste |
|---|---|---|
| Basic/Free | 20-30 req/min | 2-3 secondi |
| Pro | 10-20 req/min | 3-6 secondi |
| Affari | 5-10 req/min | 6-12 secondi |
| Imprese | 2-5 req/min | 12-30 secondi |
Strategia 5: Gestione delle risposte comuni del Cloudflare
| Codice di stato | Significato | Azione |
|---|---|---|
| 200 | Successo | Contenuti di Parse normalmente |
| 403 | Proibita — IP o impronte bloccate | Ruotare su un nuovo IP, controllare le impronte TLS |
| 429 | Tasso limitato | Indietro esponenzialmente, ridurre il tasso di richiesta |
| 503 | JavaScript sfida | Utilizzare il browser senza testa per risolvere |
| 520-527 | Errori del server Cloudflare | Riprovare dopo ritardo — problema del server di origine |
# 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
Approccio multistrato completo
La strategia più affidabile combina tutti i livelli:
- Processi residenziali: IP residenziali ProxyHat per la reputazione IP pulita.
- TLS di livello del browser:
curl_cffio browser senza testa per le impronte corrette. - Intestazioni costanti: Set di intestazioni completi corrispondenti al browser richiesto.
- Tempismo naturale: Ritardo randomizzato a seguito di modelli di navigazione umana.
- Gestione dei cookie: Accettare e mantenere i cookie durante le sessioni.
- Catene di riferimento: Flusso di navigazione corretto da homepage a pagine di destinazione.
Per strategie complete di riduzione del rilevamento, vedere i nostri guida completa anti-detezione. Per l'integrazione dei proxy nei linguaggi di programmazione, vedere le nostre guide per Python♪ Node.jse Vai..
Quando non a Scrape
Riconoscere situazioni in cui raschiare non è l'approccio giusto:
- Il sito ha una API pubblica: Utilizzare sempre API ufficiali quando disponibile.
- I dati sono dietro l'autenticazione: L'accesso ai dati protetti da login tramite raschiamento è in genere una violazione di ToS.
- Il sito vieta esplicitamente la raschiatura: Rispetta i proibizioni evidenti nel ToS.
- È disponibile la licenza di dati: Per uso commerciale, l'acquisto di licenze di dati è spesso più affidabile e legale.
- Il contenuto è protetto da copyright: Scraping contenuto protetto da copyright per la ridistribuzione solleva preoccupazioni legali.
Fare riferimento a Documentazione di ProxyHat per linee guida e termini di servizio di utilizzo responsabili.






