Torna al blog

Come bypassare la rilevazione di Cloudflare utilizzando un proxy

Cloudflare blocca le tue richieste tramite proxy? Analizziamo i metodi tecnici per eludere il rilevamento: dalla corretta configurazione di TLS all'uso di browser headless con esempi reali.

📅17 dicembre 2025
```html

7 metodi collaudati per bypassare la rilevazione di Cloudflare quando si utilizza un proxy

Cloudflare gestisce oltre il 20% di tutto il traffico web e utilizza un sistema di protezione multilivello contro i bot. Quando si utilizza un server proxy, la probabilità di ricevere un captcha o un blocco aumenta notevolmente. In questa guida esploreremo gli aspetti tecnici della rilevazione e i metodi pratici di bypass che funzionano nel 2024.

Come Cloudflare identifica proxy e bot

Cloudflare utilizza un sistema di analisi complesso che verifica decine di parametri per ogni richiesta. Comprendere i meccanismi di rilevazione è il primo passo per un bypass efficace della protezione.

Principali metodi di rilevazione

TLS Fingerprinting: Cloudflare analizza i parametri della handshake SSL/TLS (cipher suites, estensioni, ordine di sequenza). Ogni client HTTP ha un "fingerprint" unico. Ad esempio, Python requests utilizza OpenSSL con un set caratteristico di cifrature, facilmente distinguibile da Chrome o Firefox.

Quando analizza una richiesta, Cloudflare confronta il TLS fingerprint con l'User-Agent dichiarato. Se dichiari Chrome 120, ma i parametri TLS corrispondono a Python requests, si tratta di una rilevazione immediata di un bot.

Parametro di controllo Cosa viene analizzato Rischio di rilevazione
TLS fingerprint Cipher suites, estensioni, versione TLS Alto
HTTP/2 fingerprint Ordine degli header, frame SETTINGS Alto
Reputazione IP Storia IP, appartenenza a data center Medio
Sfida JavaScript Esecuzione JS, fingerprint canvas, WebGL Alto
Analisi comportamentale Pattern delle richieste, timing, movimenti del mouse Medio

Dal 2023, Cloudflare utilizza attivamente il machine learning per analizzare i pattern comportamentali. Il sistema monitora non solo i parametri tecnici, ma anche gli intervalli di tempo tra le richieste, la sequenza delle azioni dell'utente, i movimenti del mouse e lo scroll della pagina.

Mascheramento del TLS fingerprint

Il TLS fingerprinting è il metodo di rilevazione dei bot più efficace. I client HTTP standard (requests, curl, axios) generano un fingerprint che non può essere confuso con un browser reale. La soluzione è utilizzare librerie specializzate che imitano il comportamento TLS dei browser.

Utilizzo di curl-impersonate

La libreria curl-impersonate è una versione modificata di curl che copia esattamente i fingerprint TLS e HTTP/2 dei browser più popolari. Supporta Chrome, Firefox, Safari ed Edge.

# Installazione di curl-impersonate
git clone https://github.com/lwthiker/curl-impersonate
cd curl-impersonate
make chrome-build

# Utilizzo con imitazione di Chrome 120
curl_chrome120 -x http://username:password@proxy.example.com:8080 \
  -H "Accept-Language: en-US,en;q=0.9" \
  https://example.com

Python: libreria tls-client

Per Python esiste un wrapper tls-client, che utilizza curl-impersonate sotto il cofano e fornisce un'interfaccia simile a requests.

import tls_client

# Creazione di una sessione con fingerprint Chrome 120
session = tls_client.Session(
    client_identifier="chrome_120",
    random_tls_extension_order=True
)

# Configurazione del proxy
proxies = {
    'http': 'http://username:password@proxy.example.com:8080',
    'https': 'http://username:password@proxy.example.com:8080'
}

# Esecuzione della richiesta
response = session.get(
    'https://example.com',
    proxies=proxies,
    headers={
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;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'
    }
)

print(response.status_code)

Importante: Quando si utilizza tls-client, è fondamentale che l'User-Agent negli header corrisponda al client_identifier scelto. Una discrepanza porterà a una rilevazione immediata.

Verifica del TLS fingerprint

Prima di iniziare il parsing, è consigliabile verificare il proprio TLS fingerprint. Utilizza i servizi tls.peet.ws o ja3er.com per l'analisi.

# Verifica del fingerprint
response = session.get('https://tls.peet.ws/api/all')
print(response.json()['tls']['ja3'])

# Confronta con il fingerprint di Chrome reale:
# https://kawayiyi.com/tls-fingerprint-database/

Configurazione corretta degli header HTTP

Anche con un TLS fingerprint corretto, header HTTP errati riveleranno un bot. Cloudflare analizza non solo la presenza degli header, ma anche il loro ordine, il formato dei valori e la coerenza logica.

Header obbligatori per Chrome

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.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',
    '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',
    'Sec-Ch-Ua': '"Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120"',
    'Sec-Ch-Ua-Mobile': '?0',
    'Sec-Ch-Ua-Platform': '"Windows"',
    'Cache-Control': 'max-age=0'
}

Gli header Sec-Ch-Ua-* sono apparsi in Chrome 89 e fanno parte dell'API Client Hints. La loro assenza quando si utilizza un User-Agent moderno è un chiaro segno di un bot.

L'ordine degli header è importante

In HTTP/2, l'ordine degli header è fisso per ogni browser. Python requests e altri client standard inviano gli header in ordine alfabetico, il che è diverso dal comportamento dei browser. Utilizza librerie che supportano un ordine personalizzato degli header.

Suggerimento: Utilizza gli strumenti di sviluppo del browser (Network tab → clic destro sulla richiesta → Copy → Copy as cURL) per ottenere una copia esatta degli header di un browser reale. Poi adatta questi header al tuo codice.

Generazione dinamica dell'User-Agent

Utilizzare lo stesso User-Agent per tutte le richieste aumenta il rischio di rilevazione. Crea un pool di User-Agent attuali e ruotali.

import random

# Pool di User-Agent attuali (dicembre 2024)
USER_AGENTS = [
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1 Safari/605.1.15',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
]

def get_random_headers():
    ua = random.choice(USER_AGENTS)
    
    # Adattamento degli altri header al UA scelto
    if 'Chrome' in ua:
        return {
            'User-Agent': ua,
            'Sec-Ch-Ua': '"Not_A Brand";v="8", "Chromium";v="120"',
            # ... altri header di Chrome
        }
    elif 'Firefox' in ua:
        return {
            'User-Agent': ua,
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
            # ... header di Firefox
        }
    # ... gestione di altri browser

Utilizzo di browser headless

Quando Cloudflare utilizza una sfida JavaScript o una rilevazione avanzata, l'unico modo affidabile per bypassare è utilizzare un browser reale. I browser headless gestiscono automaticamente JavaScript, cookies e creano un fingerprint completamente autentico.

Playwright con patch anti-detect

Playwright è un'alternativa moderna a Selenium con prestazioni migliori. Tuttavia, il Playwright standard è facilmente rilevabile tramite navigator.webdriver e altri indicatori. Utilizza playwright-stealth per mascherare.

from playwright.sync_api import sync_playwright
from playwright_stealth import stealth_sync

def bypass_cloudflare(url, proxy):
    with sync_playwright() as p:
        browser = p.chromium.launch(
            headless=True,
            proxy={
                "server": f"http://{proxy['host']}:{proxy['port']}",
                "username": proxy['username'],
                "password": proxy['password']
            },
            args=[
                '--disable-blink-features=AutomationControlled',
                '--disable-dev-shm-usage',
                '--no-sandbox'
            ]
        )
        
        context = browser.new_context(
            viewport={'width': 1920, 'height': 1080},
            user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
            locale='en-US',
            timezone_id='America/New_York'
        )
        
        page = context.new_page()
        stealth_sync(page)  # Applicazione delle patch anti-detect
        
        # Navigazione alla pagina
        page.goto(url, wait_until='networkidle', timeout=30000)
        
        # Attesa per il superamento della sfida Cloudflare (di solito 5-10 secondi)
        page.wait_for_timeout(8000)
        
        # Verifica del bypass riuscito
        if 'Just a moment' in page.content():
            print('Sfida Cloudflare non superata')
            return None
        
        # Estrazione dei cookies per uso futuro
        cookies = context.cookies()
        html = page.content()
        
        browser.close()
        return {'html': html, 'cookies': cookies}

# Utilizzo
proxy_config = {
    'host': 'proxy.example.com',
    'port': 8080,
    'username': 'user',
    'password': 'pass'
}

result = bypass_cloudflare('https://example.com', proxy_config)

Puppeteer Extra con plugin

Per l'ecosistema Node.js, la soluzione migliore è puppeteer-extra con il plugin puppeteer-extra-plugin-stealth. Questo plugin applica oltre 30 tecniche diverse di mascheramento dell'automazione.

const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');

puppeteer.use(StealthPlugin());

async function bypassCloudflare(url, proxyUrl) {
    const browser = await puppeteer.launch({
        headless: 'new',
        args: [
            `--proxy-server=${proxyUrl}`,
            '--disable-blink-features=AutomationControlled',
            '--window-size=1920,1080'
        ]
    });
    
    const page = await browser.newPage();
    
    // Impostazione del viewport e dell'user-agent
    await page.setViewport({ width: 1920, height: 1080 });
    await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36');
    
    // Ridefinizione di navigator.webdriver
    await page.evaluateOnNewDocument(() => {
        delete Object.getPrototypeOf(navigator).webdriver;
    });
    
    // Navigazione alla pagina
    await page.goto(url, { waitUntil: 'networkidle2', timeout: 30000 });
    
    // Attesa per il superamento della sfida
    await page.waitForTimeout(8000);
    
    // Ottenimento del contenuto e dei cookies
    const content = await page.content();
    const cookies = await page.cookies();
    
    await browser.close();
    
    return { content, cookies };
}

// Esempio di utilizzo
bypassCloudflare('https://example.com', 'http://user:pass@proxy.example.com:8080')
    .then(result => console.log('Successo'))
    .catch(err => console.error(err));

Prestazioni: I browser headless consumano significativamente più risorse (200-500 MB di RAM per istanza). Per compiti ad alta intensità, utilizzali solo per ottenere cookies, quindi passa a client HTTP con questi cookies.

Scelta del tipo di proxy per il bypass di Cloudflare

Il tipo di proxy influisce in modo critico sul successo del bypass. Cloudflare mantiene database di indirizzi IP dei data center e applica regole di controllo più severe a questi.

Tipo di proxy Probabilità di bypass Velocità Costo Raccomandazione
Data center 30-40% Alta Basso Solo con browser headless
Residenziale 85-95% Media Alta Scelta ottimale
Mobile 90-98% Media Molto alta Per compiti critici
ISP (Static Residential) 80-90% Alta Media Equilibrio tra prezzo e qualità

Perché i proxy residenziali sono più efficaci

I proxy residenziali utilizzano indirizzi IP di dispositivi reali (router domestici, smartphone). Cloudflare non può bloccare massicciamente tali IP, poiché ciò bloccherebbe gli utenti normali. Le statistiche mostrano che gli IP residenziali ricevono captcha 15-20 volte meno frequentemente rispetto ai data center.

Quando si lavora con proxy residenziali, la geolocalizzazione è fondamentale. Se il sito target è orientato agli Stati Uniti, l'uso di proxy dall'Asia aumenterà la sospettosità. Scegli fornitori con una vasta geografia e la possibilità di targeting per città.

Proxy mobili per la massima affidabilità

I proxy mobili utilizzano indirizzi IP di operatori mobili (4G/5G). La caratteristica delle reti mobili è il cambio dinamico di IP tramite la modalità aereo, il che offre praticamente un numero illimitato di indirizzi IP puliti. La probabilità di blocco di un IP mobile è prossima a zero.

# Esempio di rotazione dell'IP mobile tramite API
import requests
import time

def rotate_mobile_ip(proxy_api_url):
    """Cambio IP del proxy mobile"""
    response = requests.get(f"{proxy_api_url}/rotate")
    if response.status_code == 200:
        print("IP cambiato con successo")
        time.sleep(5)  # Attesa per l'applicazione delle modifiche
        return True
    return False

# Utilizzo con proxy mobile
mobile_proxy = "http://user:pass@mobile.proxy.com:8080"

for i in range(10):
    # Esecuzione della richiesta
    response = requests.get(
        'https://example.com',
        proxies={'http': mobile_proxy, 'https': mobile_proxy}
    )
    
    # Rotazione dell'IP dopo ogni richiesta
    rotate_mobile_ip('https://api.proxy.com/mobile')

Gestione di cookies e sessioni

Dopo aver superato con successo la sfida di Cloudflare, il server imposta cookies (cf_clearance, __cfduid e altri) che confermano la legittimità del client. Una corretta gestione di questi cookies consente di evitare controlli ripetuti.

Estrazione e riutilizzo di cf_clearance

Il cookie cf_clearance è solitamente valido per 30-60 minuti. Dopo averlo ottenuto tramite un browser headless, può essere utilizzato in normali richieste HTTP.

import requests
import pickle
from datetime import datetime, timedelta

class CloudflareCookieManager:
    def __init__(self, cookie_file='cf_cookies.pkl'):
        self.cookie_file = cookie_file
        self.cookies = self.load_cookies()
    
    def load_cookies(self):
        """Caricamento dei cookies salvati"""
        try:
            with open(self.cookie_file, 'rb') as f:
                data = pickle.load(f)
                # Verifica della scadenza
                if data['expires'] > datetime.now():
                    return data['cookies']
        except FileNotFoundError:
            pass
        return None
    
    def save_cookies(self, cookies, ttl_minutes=30):
        """Salvataggio dei cookies con TTL"""
        data = {
            'cookies': cookies,
            'expires': datetime.now() + timedelta(minutes=ttl_minutes)
        }
        with open(self.cookie_file, 'wb') as f:
            pickle.dump(data, f)
    
    def get_cf_clearance(self, url, proxy):
        """Ottenimento di cf_clearance tramite browser"""
        if self.cookies:
            return self.cookies
        
        # Qui il codice per avviare il browser (dalla sezione precedente)
        # ...
        browser_cookies = bypass_cloudflare(url, proxy)['cookies']
        
        # Conversione in formato requests
        cookies_dict = {c['name']: c['value'] for c in browser_cookies}
        self.save_cookies(cookies_dict)
        self.cookies = cookies_dict
        
        return cookies_dict
    
    def make_request(self, url, proxy):
        """Richiesta con gestione automatica dei cookies"""
        cookies = self.get_cf_clearance(url, proxy)
        
        response = requests.get(
            url,
            cookies=cookies,
            proxies={'http': proxy, 'https': proxy},
            headers=get_random_headers()
        )
        
        # Se riceviamo di nuovo la sfida — aggiorniamo i cookies
        if response.status_code == 403 or 'cf-browser-verification' in response.text:
            print("Cookies scaduti, ottenimento di nuovi...")
            self.cookies = None
            return self.make_request(url, proxy)
        
        return response

# Utilizzo
manager = CloudflareCookieManager()
response = manager.make_request(
    'https://example.com/api/data',
    'http://user:pass@proxy.example.com:8080'
)

Associazione dei cookies all'indirizzo IP

Cloudflare associa cf_clearance all'indirizzo IP da cui è stata superata la sfida. L'uso di questo cookie da un altro IP porterà a un blocco. Quando si lavora con proxy rotanti, è necessario conservare un set separato di cookies per ogni IP.

import hashlib

class IPBoundCookieManager:
    def __init__(self):
        self.cookies_by_ip = {}
    
    def get_ip_hash(self, proxy_url):
        """Creazione di un hash per identificare il proxy"""
        return hashlib.md5(proxy_url.encode()).hexdigest()
    
    def get_cookies_for_proxy(self, proxy_url, target_url):
        """Ottenimento di cookies per un proxy specifico"""
        ip_hash = self.get_ip_hash(proxy_url)
        
        if ip_hash in self.cookies_by_ip:
            cookies_data = self.cookies_by_ip[ip_hash]
            if cookies_data['expires'] > datetime.now():
                return cookies_data['cookies']
        
        # Ottenimento di nuovi cookies tramite browser
        new_cookies = self.fetch_cookies_with_browser(target_url, proxy_url)
        
        self.cookies_by_ip[ip_hash] = {
            'cookies': new_cookies,
            'expires': datetime.now() + timedelta(minutes=30)
        }
        
        return new_cookies

Rotazione dei proxy e controllo della frequenza delle richieste

Anche con la giusta tecnologia, una frequenza di richieste troppo alta da un singolo IP attiva il rate limiting. Cloudflare analizza i pattern di traffico e identifica attività anomale.

Strategie di rotazione dei proxy

Ci sono tre approcci principali alla rotazione: round-robin (sequenziale), random (casuale) e sticky sessions (associazione alla sessione). Per bypassare Cloudflare, la strategia ottimale è sticky sessions con limitazione delle richieste per IP.

import time
import random
from collections import defaultdict
from datetime import datetime, timedelta

class SmartProxyRotator:
    def __init__(self, proxy_list, max_requests_per_ip=20, cooldown_minutes=10):
        self.proxy_list = proxy_list
        self.max_requests_per_ip = max_requests_per_ip
        self.cooldown_minutes = cooldown_minutes
        
        # Contatori di utilizzo
        self.usage_count = defaultdict(int)
        self.last_used = {}
        self.cooldown_until = {}
    
    def get_proxy(self):
        """Ottenimento del prossimo proxy disponibile"""
        available_proxies = []
        
        for proxy in self.proxy_list:
            # Verifica del cooldown
            if proxy in self.cooldown_until:
                if datetime.now() < self.cooldown_until[proxy]:
                    continue
                else:
                    # Reset del contatore dopo il cooldown
                    self.usage_count[proxy] = 0
                    del self.cooldown_until[proxy]
            
            # Verifica del limite di richieste
            if self.usage_count[proxy] < self.max_requests_per_ip:
                available_proxies.append(proxy)
        
        if not available_proxies:
            # Se tutti i proxy sono in cooldown — aspetta
            wait_time = min(
                (self.cooldown_until[p] - datetime.now()).total_seconds()
                for p in self.cooldown_until
            )
            print(f"Tutti i proxy sono in cooldown. Attesa di {wait_time:.0f} secondi...")
            time.sleep(wait_time + 1)
            return self.get_proxy()
        
        # Selezione del proxy con il minor utilizzo
        proxy = min(available_proxies, key=lambda p: self.usage_count[p])
        
        self.usage_count[proxy] += 1
        self.last_used[proxy] = datetime.now()
        
        # Impostazione del cooldown al raggiungimento del limite
        if self.usage_count[proxy] >= self.max_requests_per_ip:
            self.cooldown_until[proxy] = datetime.now() + timedelta(
                minutes=self.cooldown_minutes
            )
            print(f"Il proxy {proxy} ha raggiunto il limite. Cooldown di {self.cooldown_minutes} minuti.")
        
        return proxy
    
    def add_delay(self):
        """Ritardo casuale tra le richieste (imitazione umana)"""
        delay = random.uniform(2, 5)  # 2-5 secondi
        time.sleep(delay)

# Utilizzo
proxy_pool = [
    'http://user:pass@proxy1.example.com:8080',
    'http://user:pass@proxy2.example.com:8080',
    'http://user:pass@proxy3.example.com:8080',
    # ... fino a 50-100 proxy per un funzionamento stabile
]

rotator = SmartProxyRotator(
    proxy_pool,
    max_requests_per_ip=15,  # Valore conservativo
    cooldown_minutes=15
)

# Esecuzione delle richieste
for i in range(1000):
    proxy = rotator.get_proxy()
    
    response = requests.get(
        'https://example.com/page',
        proxies={'http': proxy, 'https': proxy},
        headers=get_random_headers()
    )
    
    print(f"Richiesta {i+1}: {response.status_code}")
    rotator.add_delay()

Rate limiting adattivo

Un approccio più avanzato è l'adattamento dinamico della frequenza delle richieste in base alle risposte del server. Se iniziano a comparire errori 429 o captcha, riduci automaticamente il ritmo.

class AdaptiveRateLimiter:
    def __init__(self, initial_delay=3.0):
        self.delay = initial_delay
        self.min_delay = 1.0
        self.max_delay = 30.0
        self.success_streak = 0
        self.failure_streak = 0
    
    def on_success(self):
        """Richiesta riuscita — si può accelerare"""
        self.success_streak += 1
        self.failure_streak = 0
        
        if self.success_streak >= 10:
            # Riduzione del ritardo del 10%
            self.delay = max(self.min_delay, self.delay * 0.9)
            self.success_streak = 0
    
    def on_failure(self, status_code):
        """Errore — rallentiamo"""
        self.failure_streak += 1
        self.success_streak = 0
        
        if status_code == 429:  # Rate limit
            # Rallentamento aggressivo
            self.delay = min(self.max_delay, self.delay * 2.0)
        elif status_code == 403:  # Possibile blocco
            self.delay = min(self.max_delay, self.delay * 1.5)
        
        print(f"Ritardo aumentato a {self.delay:.2f}s")
    
    def wait(self):
        """Attesa prima della prossima richiesta"""
        # Aggiungiamo casualità ±20%
        actual_delay = self.delay * random.uniform(0.8, 1.2)
        time.sleep(actual_delay)

Strumenti e librerie pronte all'uso per il bypass

Sviluppare una soluzione propria da zero richiede tempo e competenza. Esistono strumenti pronti che automatizzano il processo di bypass di Cloudflare.

cloudscraper (Python)

La libreria cloudscraper è un'estensione di requests che risolve automaticamente le sfide JavaScript. Funziona con le protezioni di base, ma potrebbe non affrontare controlli avanzati.

import cloudscraper

# Creazione di uno scraper con supporto proxy
scraper = cloudscraper.create_scraper(
    browser={
        'browser': 'chrome',
        'platform': 'windows',
        'desktop': True
    }
)

# Configurazione del proxy
proxies = {
    'http': 'http://user:pass@proxy.example.com:8080',
    'https': 'http://user:pass@proxy.example.com:8080'
}

# Esecuzione della richiesta
response = scraper.get('https://example.com', proxies=proxies)

if response.status_code == 200:
    print("Bypass riuscito")
    print(response.text)
else:
    print(f"Errore: {response.status_code}")

FlareSolverr (universale)

FlareSolverr è un server proxy che avvia un browser headless per risolvere le sfide di Cloudflare. Funziona tramite API HTTP e supporta qualsiasi linguaggio di programmazione.

# Avvio di FlareSolverr tramite Docker
docker run -d \
  --name=flaresolverr \
  -p 8191:8191 \
  -e LOG_LEVEL=info \
  ghcr.io/flaresolverr/flaresolverr:latest

# Utilizzo da Python
import requests

def solve_cloudflare(url, proxy=None):
    flaresolverr_url = "http://localhost:8191/v1"
    
    payload = {
        "cmd": "request.get",
        "url": url,
        "maxTimeout": 60000
    }
    
    if proxy:
        payload["proxy"] = {
            "url": proxy
        }
    
    response = requests.post(flaresolverr_url, json=payload)
    result = response.json()
    
    if result['status'] == 'ok':
        return {
            'html': result['solution']['response'],
            'cookies': result['solution']['cookies'],
            'user_agent': result['solution']['userAgent']
        }
    else:
        raise Exception(f"Errore FlareSolverr: {result['message']}")

# Esempio di utilizzo
result = solve_cloudflare(
    'https://example.com',
    proxy='http://user:pass@proxy.example.com:8080'
)

print(result['html'])

undetected-chromedriver

Versione patchata di Selenium ChromeDriver, che applica automaticamente molte tecniche anti-detect. Più semplice da usare rispetto a Playwright, ma meno flessibile.

import undetected_chromedriver as uc
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

def bypass_with_uc(url, proxy):
    options = uc.ChromeOptions()
    options.add_argument(f'--proxy-server={proxy}')
    options.add_argument('--disable-blink-features=AutomationControlled')
    
    driver = uc.Chrome(options=options, version_main=120)
    
    try:
        driver.get(url)
        
        # Attesa della scomparsa della sfida Cloudflare
        WebDriverWait(driver, 20).until_not(
            EC.presence_of_element_located((By.ID, "cf-spinner-please-wait"))
        )
        
        # Ulteriore attesa per affidabilità
        time.sleep(3)
        
        # Ottenimento del risultato
        html = driver.page_source
        cookies = driver.get_cookies()
        
        return {'html': html, 'cookies': cookies}
    
    finally:
        driver.quit()

# Utilizzo
result = bypass_with_uc(
    'https://example.com',
    'http://user:pass@proxy.example.com:8080'
)

Approccio combinato: La strategia ottimale è utilizzare un browser headless solo per l'ottenimento iniziale dei cookies, quindi passare a client HTTP (tls-client, cloudscraper) con questi cookies. Questo offre un equilibrio tra affidabilità e prestazioni.

Conclusione

Bypassare Cloudflare quando si utilizza un proxy richiede un approccio complesso: un corretto TLS fingerprint, header HTTP autentici, proxy di qualità e una gestione delle sessioni efficace. Raccomandazioni chiave:

  • Utilizza proxy residenziali o proxy mobili invece di data center
  • Applica librerie con un corretto TLS fingerprint (tls-client, curl-impersonate)
  • Per casi complessi, utilizza browser headless con patch anti-detect
  • Salva e riutilizza i cookies cf_clearance
  • Ruota i proxy tenendo conto del rate limiting (non più di 15-20 richieste per IP)
  • Aggiungi ritardi casuali tra le richieste (2-5 secondi)

La protezione di Cloudflare evolve costantemente, quindi è importante aggiornare regolarmente gli strumenti e adattare le strategie. Monitora le modifiche nelle tecniche di fingerprinting e testa le soluzioni sulle versioni attuali della protezione.

Per un funzionamento stabile, è consigliabile utilizzare servizi proxy professionali con un ampio pool di IP e rotazione automatica.

```