Il tuo scraper funziona alla prima esecuzione. Alla terza arrivano 403, risposte vuote o loop CAPTCHA. Il codice non è cambiato. Il sito nemmeno. Il sistema anti-bot ha creato un profilo della sessione e ha iniziato a bloccarla.
TL;DR: i blocchi nascono da quattro livelli: rete, identità del browser, comportamento e stato della sessione. Parti da un anti-detect browser che gestisce fingerprints e proxy routing a livello engine, poi lascia al codice riconoscimento, estrazione, paginazione e scala.
Per il modello completo a quattro livelli, leggi Automazione browser senza blocchi: lo stack di difesa a 4 livelli.
Ricognizione prima del codice
Scrivere subito il scraper porta spesso a rifarlo. Dieci minuti di ricognizione bastano per scegliere lo stack giusto.
Identificare il sistema anti-bot
Apri DevTools sul sito target e controlla i response headers.
| Header | Sistema anti-bot |
|---|---|
cf-ray, server: cloudflare |
Cloudflare Bot Management |
x-akamai-transformed |
Akamai Bot Manager |
x-datadome |
DataDome |
x-px-* headers |
PerimeterX (now HUMAN) |
| Nessuno di questi | Probabilmente nessun anti-bot commerciale o una soluzione custom |
Un sito semplice si scrapea con curl_cffi; un sito con Cloudflare richiede un browser reale con fingerprints gestiti.
Verificare se esiste una API
Prima del browser, guarda Network e filtra XHR/Fetch. Molti siti caricano dati da endpoint JSON.
# If the site loads product data from an API endpoint
from curl_cffi import requests
response = requests.get(
"https://target-site.com/api/v2/products?category=electronics&page=1",Gli endpoint sono veloci, ma su siti protetti è più sicuro caricare la pagina in un browser reale e intercettare la risposta.
Valutare il rendering
Disabilita JavaScript. Se il contenuto resta visibile, HTTP basta; se sparisce, serve un engine browser.
| Contenuto visibile senza JS? | Strumento |
|---|---|
| Si, tutto renderizzato | curl_cffi or requests with TLS impersonation |
| Parziale | curl_cffi for static parts, browser for dynamic |
| No, pagina vuota | Full browser (Clawbrowser + Playwright/Puppeteer) |
Scegliere lo stack di scraping
Lo strumento dipende da protezione e rendering. Un browser completo costa troppo quando HTTP basta; HTTP fallisce su SPA protette.
Albero decisionale
Nessun anti-bot + HTML server-side: usa curl_cffi con TLS impersonation.
from curl_cffi import requests
response = requests.get(
"https://unprotected-site.com/products",
impersonate="chrome136"Nessun anti-bot + rendering JavaScript: usa un headless browser standard.
Anti-bot + HTML server-side: usa curl_cffi con residential proxy.
Anti-bot + rendering JavaScript: usa Clawbrowser con fingerprints gestiti e residential proxy.
from playwright.async_api import async_playwright
async def scrape_protected_site():
async with async_playwright() as p:
# Clawbrowser handles fingerprints, TLS and proxy at the engine levelClawbrowser è un anti-detect browser locale, gratuito e basato su Chromium, con fingerprints gestiti, proxy routing, CDP nativo e server MCP integrato.
Pattern di estrazione dati
Superato l'anti-bot, il lavoro è estrarre dati strutturati in modo stabile.
Paginazione
La paginazione di solito appare in tre forme.
Paginazione via URL
async def scrape_paginated(page, base_url, max_pages=50):
all_items = []
for page_num in range(1, max_pages + 1):
await page.goto(f"{base_url}?page={page_num}")
await human_delay(2000, 4000)Infinite scroll (contenuto caricato allo scroll):
async def scrape_infinite_scroll(page, max_scrolls=30):
all_items = []
previous_count = 0
for _ in range(max_scrolls):"Load more" button:
async def scrape_load_more(page):
while True:
load_more = await page.query_selector('[data-testid="load-more"]')
if not load_more:
breakGestire contenuto dinamico
Alcuni dati appaiono solo dopo click, accordion o hover.
async def extract_product_details(page, product_url):
await page.goto(product_url)
await human_delay(1000, 2000)
# Click "Specifications" tab to reveal hidden dataEstrarre dallo shadow DOM
I componenti in shadow DOM richiedono accesso alla shadow root.
# Pierce through shadow DOM to extract data
data = await page.evaluate("""
() => {
const host = document.querySelector('product-card');
const shadow = host.shadowRoot;Gestione sessioni per scraping
Uno scraper visita molte più pagine di un utente reale; la sessione deve restare credibile.
Session warming
Non partire dalla pagina target: home, categoria, cookie banner, poi scraping. I blocchi comportamentali sono in Automazione browser senza blocchi: lo stack di difesa a 4 livelli.
async def warm_session(page, site_url):
await page.goto(site_url)
await human_delay(2000, 4000)
# Accept cookies if banner appearsRuotare profili a scala
Distribuisci grandi volumi su più profili Clawbrowser, ognuno con fingerprint, cookies, storage e proxy propri.
import asyncio
from playwright.async_api import async_playwright
async def scrape_batch(profile_name, urls):
async with async_playwright() as p:| Scala | Approccio |
|---|---|
| < 100 pages/day | Single profile, residential proxy, 3-5s delays |
| 100-1,000 pages/day | 3-5 rotating profiles, sticky residential sessions |
| 1,000-10,000 pages/day | 10+ profiles, proxy pool, session warming |
| 10,000+ pages/day | Distributed setup, multiple Clawbrowser instances, backoff logic |
Diagnosticare i blocchi
Il sintomo indica spesso il livello che sta fallendo.
| Sintomo | Causa probabile | Fix |
|---|---|---|
| Blocco alla prima request | Reputazione IP o browser fingerprint | Passa a residential proxy e anti-detect browser |
| Blocca dopo 5-10 pagine | Comportamento o limite di sessione | Rallenta, aggiungi delay e scalda sessioni |
| CAPTCHA on every page | Fingerprint leak | Browser is leaking automation signals, switch to managed fingerprints |
| 403 after proxy rotation | Browser fingerprint unchanged | New IP but same broken fingerprint, fix the browser layer |
| Funziona localmente, fallisce in produzione | Datacenter IP | Aggiungi residential proxy in produzione |
| Pagina vuota / spinner infinito | JavaScript challenge failed | Browser can't pass Cloudflare/Akamai JS check, needs real engine |
| Dati diversi dalla visita manuale | Geo or locale mismatch | Proxy location doesn't match fingerprint timezone/language |
Script rapido di diagnosi
import asyncio
from playwright.async_api import async_playwright
async def diagnose_blocking(target_url):
async with async_playwright() as p:Scraping di siti protetti da Cloudflare
Cloudflare combina TLS, JavaScript, comportamento e reputazione IP.
Cosa controlla Cloudflare
- TLS fingerprint (JA3/JA4): un ClientHello incoerente genera challenge prima dell'HTML.
- JavaScript execution: Turnstile richiede un vero ambiente di rendering.
- IP reputation: la reputazione IP viene valutata su milioni di siti.
- Request patterns: request identiche ripetute dalla stessa sessione vengono marcate.
Il workflow
Tieni puliti tutti i livelli: anti-detect browser per TLS/JS, residential proxy per IP, timing nel codice.
async def scrape_cloudflare_site(target_url, profile="cf-scraper"):
async with async_playwright() as p:
browser = await p.chromium.connect_over_cdp(
f"http://127.0.0.1:9222?profile={profile}"
)Per il dettaglio su Cloudflare, leggi perché gli script Playwright vengono bloccati da Cloudflare.
Scraping con agenti IA
Il server MCP di Clawbrowser permette agli agenti IA di controllare sessioni browser reali via CDP con gli stessi fingerprints e proxy.
L'integrazione completa è in Browser CDP per agenti IA: guida per developer.
FAQ
Perché il mio scraper funziona in locale ma fallisce in produzione?
In locale usi spesso un IP residenziale; in produzione un IP datacenter. Aggiungi un residential proxy e verifica fingerprints gestiti.
Meglio client HTTP o browser?
HTTP basta per HTML server-side senza anti-bot. Per JavaScript rendering o challenge, serve un browser completo.
Come capisco se un sito usa Cloudflare?
Cerca cf-ray o server: cloudflare nei response headers di DevTools.
Posso fare scraping senza proxies?
Si su siti non protetti. Dietro Cloudflare o Akamai, a scala servono quasi sempre residential proxies.
Inizia a fare web scraping senza essere rilevato
Lo scraping affidabile parte da ricognizione, tool corretto e infrastruttura browser pulita.
Install Clawbrowser per gestire identità browser e rete: copia il prompt da clawbrowser.ai e incollalo nel tuo agente IA. Il setup richiede meno di due minuti.
Per il modello di detection, vedi Automazione browser senza blocchi: lo stack di difesa a 4 livelli. Per i dettagli di fingerprinting, vedi Browser fingerprinting: i 20+ segnali usati dai sistemi anti-bot.
Continue exploring
Ask AI how Clawbrowser helps
Continua a leggere
Articoli correlati

Automazione Browser Senza Blocchi: Le 4 Difese Che Servono Davvero
Perché l'automazione del browser viene bloccata e come risolvere ogni livello: identità del browser, rete, comportamento e gestione delle sessioni. Guida strutturale per sviluppatori.
Leggi l’articolo →
Puppeteer-Extra-Stealth è obsoleto: cosa usa l'automazione moderna
puppeteer-extra-plugin-stealth non viene aggiornato dal 2023. Ecco perché fallisce con i sistemi anti-bot moderni e cosa usare al suo posto.
Leggi l’articolo →