Web scraping senza essere rilevati: copertina illustrata dell'articolo Clawbrowser

Web scraping senza essere rilevati: tecniche che reggono

Clawbrowser Teamweb-scrapinganti-botfingerprintingproxyguida

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 level

Clawbrowser è 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:
            break

Gestire 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 data

Estrarre 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 appears

Ruotare 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

  1. TLS fingerprint (JA3/JA4): un ClientHello incoerente genera challenge prima dell'HTML.
  2. JavaScript execution: Turnstile richiede un vero ambiente di rendering.
  3. IP reputation: la reputazione IP viene valutata su milioni di siti.
  4. 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

Vedi tutti →