Come Ridurre la Rilevazione durante lo Scraping: Una Guida Completa

Una guida multistrato completa per evitare il rilevamento quando si raschia il web — che copre la rotazione IP, le intestazioni HTTP, le impronte TLS, le impronte del browser, i modelli comportamentali e la gestione della sessione.

Come Ridurre la Rilevazione durante lo Scraping: Una Guida Completa

Perché succede la rilevazione

Il rilevamento del raschiamento del Web è un processo multistrato. I sistemi anti-bot non si basano su un singolo segnale — combinano la reputazione IP, le intestazioni HTTP, Impronte TLSimpronte del browser, e l'analisi comportamentale per calcolare un punteggio di rischio. Quando tale punteggio supera una soglia, si ottiene bloccato, servito un CAPTCHA, o alimentato dati fuorvianti.

Questa guida fornisce un approccio completo per ridurre il rilevamento su tutti i livelli. Per una panoramica di come questi sistemi funzionano, vedere il nostro articolo pilastro come i sistemi anti-bot rilevano i proxy.

Livello 1: Riputazione IP e Selezione proxy

Il tuo indirizzo IP è la prima cosa che un server vede. I sistemi anti-bot mantengono database che segnano indirizzi IP per tipo, storia e comportamento.

Selezione tipo proxy

Tipo di proxyRischio di rilevamentoMigliore per
ResidenzialeBassoLa maggior parte delle attività di raschiamento, siti protetti
ISP (Static Residential)Basso medioSessioni lunghe, conti
DatacenterAltoSiti non protetti, attività ad alto volume
MobileMolto bassoSiti di protezione più elevati, social media

Per la maggior parte dei progetti di raschiamento, I proxy residenziali di ProxyHat offrire il miglior equilibrio di basso rischio di rilevamento ed efficienza dei costi. Guarda i dettagli confronto tipo proxy per la guida.

Strategia di Rotazione IP

# Python: Rotating proxy per request using ProxyHat
import requests
proxy_url = "http://USERNAME:PASSWORD@gate.proxyhat.com:8080"
proxies = {
    "http": proxy_url,
    "https": proxy_url
}
# Each request through the gateway gets a different IP
for url in urls_to_scrape:
    response = requests.get(url, proxies=proxies, timeout=30)
    process(response)
  • Ruota per richiesta per l'elenco di pagine e risultati di ricerca.
  • Utilizzare sessioni appiccicose per flussi multi-pagina (paginazione, sequenze di login).
  • Geo-target il tuo IP per soddisfare il pubblico atteso del sito utilizzando Obiettivo della posizione di ProxyHat.

Livello 2: HTTP Heads

Le intestazioni HTTP non corrette o mancanti sono uno dei segnali più semplici per i sistemi anti-bot da rilevare. Un vero browser invia 15-20 intestazioni in un ordine specifico; uno script Python predefinito invia 3-4.

Intestazioni essenziali

# Python: Realistic header set
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.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, zstd",
    "Cache-Control": "max-age=0",
    "Sec-Ch-Ua": '"Chromium";v="131", "Not_A Brand";v="24"',
    "Sec-Ch-Ua-Mobile": "?0",
    "Sec-Ch-Ua-Platform": '"Windows"',
    "Sec-Fetch-Dest": "document",
    "Sec-Fetch-Mode": "navigate",
    "Sec-Fetch-Site": "none",
    "Sec-Fetch-User": "?1",
    "Upgrade-Insecure-Requests": "1",
    "Connection": "keep-alive"
}
response = requests.get(url, headers=headers, proxies=proxies)

Regole di coerenza dell'intestazione

  • Sec-Ch-Ua con User-Agent: Se si rivendica Chrome 131, il tuo Sec-Ch-Ua deve fare riferimento alla versione 131.
  • Include tutte le intestazioni Sec-Fetch: Modern Chrome invia questi su ogni navigazione. Mancarli è un forte segnale bot.
  • Impostare Accetta-Language per abbinare il proxy geo: Un proxy USA con Accept-Language: ja-JP è sospetto.
  • Mantenere l'ordine di intestazione: Alcuni sistemi anti-bot controllano l'ordine dell'intestazione. Utilizzare librerie che conservano l'ordine di inserimento.

Livello 3: TLS e HTTP/2

La tua libreria client HTTP produce un unico Impronte TLS che i sistemi anti-bot controllino contro l'utente-agente rivendicato. Un utente-agente Chrome con un'impronta di Python TLS è immediatamente contrassegnato.

Mitigazione per lingua

LinguaBiblioteca di defaultRischio di rilevamentoBrowser-Grade alternativa
Pythonrichieste/urllib3Molto altocurl cffi con impersonato
Node.jsaxios/gotAltoha-scrazia
Vai.net/httpMolto altouTLS + trasporto personalizzato
# Python: Browser-grade TLS with curl_cffi
from curl_cffi import requests as curl_requests
response = curl_requests.get(
    "https://example.com",
    impersonate="chrome",
    proxies={
        "http": "http://USERNAME:PASSWORD@gate.proxyhat.com:8080",
        "https": "http://USERNAME:PASSWORD@gate.proxyhat.com:8080"
    }
)

Livello 4: Sfogliatore Impronte

Se si utilizza un browser senza testa, sonde JavaScript anti-bot browser impronta digitale — Tela, WebGL, AudioContext, proprietà navigatore. Il principio chiave è la consistenza interna:

  • Tutti i segnali di impronte devono essere d'accordo tra di loro
  • L'impronta digitale deve corrispondere alle richieste dell'utente
  • L'impronta dovrebbe cambiare quando si ruotano i proxy

Configurazione della larghezza

// Node.js: Puppeteer with stealth and proxy
const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
puppeteer.use(StealthPlugin());
const browser = await puppeteer.launch({
  headless: 'new',
  args: [
    '--proxy-server=http://gate.proxyhat.com:8080',
    '--disable-blink-features=AutomationControlled',
    '--window-size=1920,1080'
  ]
});
const page = await browser.newPage();
await page.authenticate({
  username: 'USERNAME',
  password: 'PASSWORD'
});
await page.setViewport({ width: 1920, height: 1080 });

Livello 5: Motivi comportamentali

Anche con una mimica tecnica perfetta, i modelli di comportamento simili a bot innescano il rilevamento. I sistemi anti-bot analizzano la tempistica, i modelli di navigazione e le firme di interazione.

Richiesta tempistica

  • Aggiungi ritardi casuali: Gli esseri umani non fanno richieste a intervalli esatti. Aggiungi 1-5 secondi di ritardo casuale tra le richieste.
  • Vary ritardi per tipo di pagina: Le pagine dei contenuti meritano più lunghe pause "lettura" che pagine di elenco.
  • Evitare i modelli di scoppio: Non fare 50 richieste rapide poi pausa. Distribuire le richieste in modo uniforme con varianza naturale.
# Python: Natural request timing
import time
import random
def scrape_with_natural_timing(urls, proxies):
    for url in urls:
        response = requests.get(url, proxies=proxies, headers=headers)
        process(response)
        # Random delay: 1-4 seconds with normal distribution
        delay = max(0.5, random.gauss(2.5, 0.8))
        time.sleep(delay)

Modelli di navigazione

  • Seguire percorsi naturali: Visita prima la homepage, poi le pagine di categoria, poi le pagine di dettaglio — non saltare direttamente agli URL profondi.
  • Impostare correttamente intestazioni di riferimento: Ogni pagina dovrebbe fare riferimento alla pagina precedente come riferimento.
  • Redirect della maniglia: Seguire i reindirizzamenti HTTP naturalmente piuttosto che riproporre l'URL originale.

Gestione delle sessioni

  • Mantenere i cookie: Accettare e restituire i cookie all'interno di una sessione — scartare tutti i cookie è un segnale bot.
  • Lunghezza della sessione di limite: Dopo 50-100 richieste, avviare una nuova sessione con un IP fresco e cookie.
  • Limiti di tasso di rispetto: Se si ricevono 429 risposte, indietro esponenzialmente piuttosto che riprovare immediatamente.

Livello 6: Convalida della risposta

La rilevazione non comporta sempre un blocco. I siti possono servire contenuti diversi, iniettare dati fuorvianti, o restituire blocchi morbidi. Convalida sempre le tue risposte:

  • Controllare i codici di stato: 200 non significa sempre successo — alcuni siti restituiscono 200 con pagine CAPTCHA o contenuti vuoti.
  • Convalida struttura dei contenuti: Assicurare la risposta contiene elementi attesi (prezzo del prodotto, testo dell'articolo, ecc.).
  • Monitor per pentole: Link nascosti o campi di forma progettati per catturare crawler automatizzati.
  • Traccia i tassi di successo: Se il tasso di successo scende al di sotto del 90%, qualcosa è cambiato e ha bisogno di indagine.

Elenco completo di controllo anti-eliminazione

LivelloAzionePriorità
IPUtilizzare proxy residenziali con geo-targetingCritica
IPRuota IP per richiesta o sessioneCritica
IntestazioniInvio completo, set di intestazioni realisticiCritica
IntestazioniAbbinamento Accetta-Language alla posizione proxyAlto
TLSUtilizzare la libreria TLS di livello del browserCritica
TLSAbbina l'impronta TLS al browser rivendicatoCritica
BrowserUtilizzare plugin stealth per browser senza testaAlto
BrowserMantenere profili di impronte digitali coerentiAlto
ComportamentoAggiungi ritardi casuali tra le richiesteAlto
ComportamentoSeguire percorsi di navigazione naturaliMedia
ComportamentoMantenere i cookie nelle sessioniMedia
ValidazioneControlla il contenuto della risposta, non solo i codici di statoAlto

Esempio: Scraper anti-detezione completo

# Python: Complete anti-detection scraper setup
from curl_cffi import requests as curl_requests
import time
import random
class StealthScraper:
    def __init__(self, proxy_user, proxy_pass):
        self.proxy = f"http://{proxy_user}:{proxy_pass}@gate.proxyhat.com:8080"
        self.session = curl_requests.Session(impersonate="chrome")
        self.session.proxies = {
            "http": self.proxy,
            "https": self.proxy
        }
        self.request_count = 0
    def get(self, url, referer=None):
        headers = {}
        if referer:
            headers["Referer"] = referer
        response = self.session.get(url, headers=headers, timeout=30)
        self.request_count += 1
        # Rotate session every 50-80 requests
        if self.request_count >= random.randint(50, 80):
            self._rotate_session()
        # Natural delay
        time.sleep(max(0.5, random.gauss(2.0, 0.6)))
        return response
    def _rotate_session(self):
        self.session = curl_requests.Session(impersonate="chrome")
        self.session.proxies = {
            "http": self.proxy,
            "https": self.proxy
        }
        self.request_count = 0
# Usage
scraper = StealthScraper("USERNAME", "PASSWORD")
home = scraper.get("https://example.com")
listing = scraper.get("https://example.com/products", referer="https://example.com")
detail = scraper.get("https://example.com/products/123", referer="https://example.com/products")

Quando aumentare il vostro approccio

Inizia con l'approccio più semplice ed escalate solo quando necessario:

  1. Livello 1 — client HTTP + intestazioni + proxy: Funziona per la maggior parte dei siti. Uso curl_cffi o got-scraping con Prossidi di ProxyHat.
  2. Livello 2 — Aggiungi TLS di livello del browser: Richiesto quando il sito controlla le impronte JA3/JA4.
  3. Livello 3 — Browser senza testa + stealth: Necessario per il contenuto in JavaScript e sofisticati sistemi anti-bot.
  4. Livello 4 — Automazione completa del browser con mimica comportamentale: Riservato per i siti più protetti (Cloudflare Enterprise, PerimeterX, ecc.).

Per i modelli di implementazione in lingue specifiche, fare riferimento alle nostre guide: PythonNode.jse Vai..

Linee guida etiche

Le tecniche anti-detection sono strumenti: il loro uso etico dipende dal contesto. Sempre:

  • Rispettare robot.txt e termini di servizio
  • Scrape dati disponibili solo pubblicamente
  • Limitare i tassi di richiesta per evitare l'impatto del server
  • Conforme alle normative sulla protezione dei dati (GDPR, CCPA)
  • Uso pratiche di raschiamento etico come la vostra base
L'obiettivo dell'anti-detezione non è quello di bypassare la sicurezza legittima. È per garantire che l'accesso automatizzato ai dati pubblici non sia contrassegnato in modo errato come dannoso.

Domande frequenti

Pronto per iniziare?

Accedi a oltre 50M di IP residenziali in oltre 148 paesi con filtraggio AI.

Vedi i prezziProxy residenziali
← Torna al Blog