PerimeterX Detection: Perché i Tuoi Scraping Falliscono
Se hai provato a raccogliere dati da siti come United Airlines, Neiman Marcus o Saks Fifth Avenue, probabilmente hai incontrato la pagina di interruzione di PerimeterX — ora ribattezzato HUMAN Security. Il messaggio è sempre lo stesso: "We detected unusual behavior from your network." E improvvisamente, la tua pipeline di dati si ferma.
PerimeterX è uno dei sistemi anti-bot più sofisticati sul mercato. A differenza di soluzioni più semplici che si basano principalmente su IP reputation e challenge CAPTCHA, PerimeterX costruisce un profilo multidimensionale del visitatore — combinando fingerprinting del dispositivo, analisi comportamentale in tempo reale, e reputazione IP in un modello di machine learning che evolve continuamente.
In questo articolo, esploreremo in dettaglio come funziona la rilevazione PerimeterX, come differisce da DataDome e Akamai, e — soprattutto per team di scraping legittimo — come configurare correttamente proxy residenziali e browser stealth per operare nel rispetto dei termini di servizio.
Architettura di PerimeterX: Il Flusso JS Challenge
PerimeterX opera come un reverse proxy che si interpone tra il client e il server di origine. Il flusso di challenge si sviluppa in diverse fasi:
Fase 1: Richiesta Iniziale e Seed JavaScript
Quando un browser carica una pagina protetta, PerimeterX inietta uno script JavaScript offuscato — tipicamente referenziato come _pxVidAsset o simile. Questo script:
- Raccoglie centinaia di segnali dal browser (canvas, WebGL, font, schermo, fuso orario)
- Registra eventi comportamentali (movimento mouse, scroll, pressione tasti, timing tra eventi)
- Genera un payload crittografato che viene inviato al server PerimeterX
Fase 2: Cookie _px3 e _pxhd
Il risultato della valutazione lato server produce due cookie fondamentali:
_px3— Cookie di sessione che contiene un token cifrato rappresentante il verdetto di rischio. Questo cookie ha una durata limitata e viene validato ad ogni richiesta successiva._pxhd— Cookie HTTP-only che funge da identificatore persistente del dispositivo. Viene rinnovato periodicamente e legato al fingerprint del browser.
Se la valutazione iniziale restituisce un punteggio di rischio elevato, il server può:
- Servire una pagina di blocco immediata (hard block)
- Iniettare un CAPTCHA interattivo (hCaptcha o reCAPTCHA)
- Permettere l'accesso ma marcare la sessione per monitoraggio intensivo (soft challenge)
Fase 3: Verifica Continua
Anche dopo il passaggio iniziale, PerimeterX continua a raccogliere segnali comportamentali. Richieste successive che presentano pattern anomali — navigazione troppo rapida, assenza di interazione umana, pattern di accesso ripetitivi — possono innescare un challenge aggiuntivo o la revoca del cookie _px3.
Il punto chiave: PerimeterX non è un controllo one-shot. È un sistema di valutazione continua che rivaluta il rischio ad ogni interazione.
Segnali di Rilevamento: Il Modello Multidimensionale
PerimeterX combina segnali provenienti da diverse categorie per costruire un punteggio di rischio composito. Ecco l'analisi dettagliata di ogni categoria.
Device Fingerprinting
Il fingerprinting del dispositivo è il primo segnale raccolto. PerimeterX esegue un canvas rendering test, estraendo un hash dell'immagine renderizzata. Ogni combinazione di GPU, driver e sistema operativo produce un risultato leggermente diverso. I browser headless spesso producono canvas hash noti o risultati anomali.
WebGL viene utilizzato per estrarre informazioni su renderer e vendor della GPU. Un browser headless su un server Linux senza GPU reale restituirà valori come Mesa o SwiftShader — segnali inequivocabili di ambiente non-umano.
Screen metrics — risoluzione, colorDepth, pixelRatio, availHeight — vengono confrontati con la coorte di utenti legittimi. Valori come screen.width = 0 o colorDepth = 0 sono indicatori immediati di headless browser.
Altri segnali includono: elenco dei font installati (tramite measureText), timezone, lingua, platform, hardwareConcurrency, deviceMemory, e la presenza di proprietà specifiche come window.chrome o navigator.plugins.
TLS Fingerprinting (JA3/JA4)
Il fingerprinting TLS è uno dei segnali più potenti e meno compresi. Quando un client stabilisce una connessione TLS, il suo Client Hello contiene un insieme ordinato di cipher suites, extensions, e elliptic curves. Questo insieme forma il JA3 fingerprint.
PerimeterX mantiene un database di JA3 fingerprints associati a browser legittimi. Un Chrome 120 su Windows ha un JA3 specifico. Un Playwright headless su Linux ne ha un altro — e quest'ultimo è spesso già flaggato come sospetto.
Il nuovo standard JA4 aggiunge ulteriori dimensioni, incorporando il ALPN protocol, il SNI, e i signature algorithms. Questo rende ancora più difficile mascherare un client automatizzato come browser legittimo.
IP Reputation
PerimeterX classifica gli indirizzi IP in categorie di rischio:
- Datacenter IP — ASNs di AWS, GCP, Azure, OVH, Hetzner, ecc. vengono automaticamente penalizzati.
- VPN/Proxy IP — Indirizzi associati a servizi VPN commerciali ricevono un punteggio di rischio elevato.
- Residential IP — Indirizzi associati a ISP residenziali ricevono un punteggio neutrale o basso.
- Mobile IP — Indirizzi associati a operatori mobili ricevono il punteggio più basso, dato che il traffico mobile è intrinsecamente variabile.
L'IP reputation non è solo basato sulla classe dell'indirizzo, ma anche su comportamento storico — se un blocco IP è stato recentemente utilizzato per attacchi, l'intero range viene declassato.
Segnali Comportamentali
Questa è l'area dove PerimeterX differenzia maggiormente dalla concorrenza. I segnali comportamentali includono:
- Mouse movement — PerimeterX analizza la curva di Bezier del movimento del mouse. I movimenti umani hanno accelerazione e decelerazione naturale; i movimenti simulati tendono ad essere lineari o con pattern ripetitivi.
- Timing — Il tempo tra il caricamento della pagina e il primo click, il tempo tra click successivi, e il ritmo di interazione vengono tutti analizzati. Un utente che carica una pagina e clicca un link dopo 50ms esatti è chiaramente automatizzato.
- Scroll behavior — Lo scroll umano ha pattern di velocità variabile con pause di lettura. Lo scroll automatizzato è spesso uniforme o assente.
- Touch events — Su dispositivi mobili, la pressione, dimensione del tocco, e la traiettoria del dito vengono analizzati.
- Keyboard dynamics — Il ritmo di digitazione, il tempo tra keydown e keyup, e la correzione degli errori.
PerimeterX assegna un peso significativo ai segnali comportamentali. Un IP residenziale con fingerprint pulito può ancora essere bloccato se il comportamento è chiaramente automatizzato.
PerimeterX vs DataDome vs Akamai: Confronto Tecnico
Sebbene tutti e tre i sistemi siano anti-bot di fascia alta, le loro architetture e priorità di segnale differiscono significativamente:
| Dimensione | PerimeterX (HUMAN) | DataDome | Akamai Bot Manager |
|---|---|---|---|
| Segnale primario | Comportamentale (mouse, timing) | Device fingerprint + IP | TLS fingerprint + sensor data |
| Cookie di sessione | _px3, _pxhd | datadome | ak_bmsc |
| JA3 enforcement | Alta — confronto con database browser legittimi | Moderata | Molto alta — JA3 + JA4 + Sensornet |
| Canvas/WebGL depth | Alta — hash comparison + anomaly detection | Molto alta — primo segnale di rilevamento | Alta — integrato in sensor data payload |
| Behavioral analysis | Molto alta — peso dominante nel modello | Moderata — presente ma non primario | Alta — tramite Sensornet |
| Challenge type | Soft block + CAPTCHA + hard block | CAPTCHA (hCaptcha) + block | CAPTCHA + silent challenge + block |
| Machine learning | Online learning — modello si adatta in tempo reale | Batch + online | Ensemble di modelli specializzati |
La differenza cruciale: PerimeterX è più pesantemente orientato ai segnali comportamentali. Questo significa che anche con un IP residenziale perfetto e un fingerprint del browser impeccabile, se il tuo bot non simula comportamento umano realistico, verrà rilevato.
Mitigazione Concreta: Proxy Residenziali + Playwright Stealth
Ora passiamo alla parte pratica. Come configurare un setup che possa operare legittimamente su siti protetti da PerimeterX, nel rispetto dei termini di servizio.
1. Proxy Residenziali con Geo-Targeting
Il primo passo è utilizzare proxy residenziali con rotazione IP intelligente. L'IP deve provenire da un ISP residenziale nella stessa area geografica del sito target — un IP di Francoforte che accede a un sito aereolico americano è un segnale di anomalia.
# Esempio con curl e proxy residenziale ProxyHat
# Geo-targeting USA per siti aerei americani
curl -x http://user-country-US:PASSWORD@gate.proxyhat.com:8080 \
"https://www.united.com/" \
-H "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" \
-H "Accept: text/html,application/xhtml+xml" \
-H "Accept-Language: en-US,en;q=0.9"
Per sessioni sticky — necessarie per mantenere i cookie _px3 e _pxhd attraverso richieste multiple — usare il flag di sessione:
# Sessione sticky di 30 minuti con IP residenziale USA
# Il flag session- mantiene lo stesso IP per tutta la durata
curl -x http://user-country-US-session-myflight01:PASSWORD@gate.proxyhat.com:8080 \
"https://www.united.com/en/us/flights" \
-H "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"
2. Playwright con Stealth Plugin e Contesto Realistico
Il solo proxy non basta. PerimeterX analizza il fingerprint del browser e il comportamento. Serve un browser che sembri reale a tutti i livelli.
import asyncio
from playwright.async_api import async_playwright
from playwright_stealth import stealth_async
import random
import time
PROXY_URL = "http://user-country-US-session-flight01:PASSWORD@gate.proxyhat.com:8080"
async def scrape_with_perimeterx_bypass(url: str):
async with async_playwright() as p:
# Avvia browser con contesto realistico
browser = await p.chromium.launch(
headless=True,
proxy={"server": PROXY_URL},
args=[
"--disable-blink-features=AutomationControlled",
"--disable-features=IsolateOrigins,site-per-process",
"--disable-infobars",
"--window-size=1920,1080",
]
)
context = await browser.new_context(
viewport={"width": 1920, "height": 1080},
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",
locale="en-US",
timezone_id="America/New_York",
geolocation={"latitude": 40.7128, "longitude": -74.0060},
permissions=["geolocation"],
color_scheme="light",
device_scale_factor=1,
)
page = await context.new_page()
# Applica stealth patches
await stealth_async(page)
# Simula comportamento umano prima della navigazione
await page.goto(url, wait_until="domcontentloaded")
# Movimento mouse realistico verso un punto della pagina
await page.mouse.move(
random.randint(200, 800),
random.randint(200, 600),
steps=random.randint(20, 40)
)
# Pausa realistica — un umano legge prima di interagire
await asyncio.sleep(random.uniform(2.5, 5.0))
# Scroll graduale
await page.evaluate("""
async () => {
const delay = ms => new Promise(r => setTimeout(r, ms));
for (let i = 0; i < 5; i++) {
window.scrollBy(0, 150 + Math.random() * 100);
await delay(300 + Math.random() * 500);
}
}
""")
# Attendi che i cookie _px3/_pxhd siano settati
cookies = await context.cookies()
px_cookies = [c for c in cookies if "_px" in c["name"]]
print(f"PerimeterX cookies ottenuti: {px_cookies}")
# Ora puoi estrarre i dati
content = await page.content()
await browser.close()
return content, px_cookies
# Esecuzione
result, cookies = asyncio.run(
scrape_with_perimeterx_bypass("https://www.united.com/en/us/flights")
)
3. Pacing e Rate Limiting
Il behavioral analysis di PerimeterX è sensibile al ritmo delle richieste. Un utente umano non effettua 200 richieste al minuto. Implementa un pacing realistico:
- Richieste per sessione: massimo 30-50 richieste per sessione IP
- Intervallo tra richieste: 3-8 secondi con jitter casuale
- Sessioni per IP: massimo 3-5 sessioni per IP residenziale prima della rotazione
- Cooldown tra sessioni: almeno 10-15 minuti tra sessioni consecutive sullo stesso sito
import random
import time
import requests
SESSION = requests.Session()
PROXY = "http://user-country-US-session-flight02:PASSWORD@gate.proxyhat.com:8080"
SESSION.proxies = {"http": PROXY, "https": PROXY}
SESSION.headers.update({
"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-Language": "en-US,en;q=0.9",
})
def human_delay(min_s=3.0, max_s=8.0):
"""Pausa con distribuzione non uniforme — più probabile verso il centro."""
delay = random.gauss((min_s + max_s) / 2, (max_s - min_s) / 6)
delay = max(min_s, min(delay, max_s))
time.sleep(delay)
def scrape_flight_page(url: str):
"""Richiesta con pacing realistico."""
human_delay()
resp = SESSION.get(url, timeout=30)
if "px-captcha" in resp.text.lower() or "unusual activity" in resp.text.lower():
print("PerimeterX challenge rilevato — pausa lunga")
time.sleep(random.uniform(120, 300))
return None
return resp
# Ciclo di scraping con pacing
urls = [
"https://www.united.com/en/us/flights/status/UA001",
"https://www.united.com/en/us/flights/status/UA002",
"https://www.united.com/en/us/flights/status/UA003",
]
for url in urls:
result = scrape_flight_page(url)
if result is None:
# Cambia IP e sessione
break
# Elabora risultato...</n
4. Gestione dei Cookie e Sessioni Persistenti
I cookie _px3 e _pxhd sono essenziali per mantenere lo stato di "utente verificato". Una volta ottenuti attraverso un browser stealth, puoi riutilizzarli in richieste successive:
- Salva i cookie dopo il passaggio iniziale del challenge
- Riutilizza gli stessi cookie con lo stesso IP (sessione sticky) per richieste successive
- Se il cookie
_px3viene revocato, torna al browser stealth per rigenerarlo - Non condividere cookie tra IP diversi — PerimeterX lega i cookie all'IP di origine
Siti che Utilizzano PerimeterX
PerimeterX è particolarmente diffuso in settori con alto valore per singola transazione e dove la competizione sui dati è intensa:
Compagnie Aeree
- United Airlines — Protezione aggressiva su pagine di ricerca voli e pricing
- American Airlines — PerimeterX su ricerca voli, con behavioral analysis intensiva
- Delta Air Lines — Implementazione PerimeterX su booking flow e status volo
E-commerce di Lusso
- Neiman Marcus — Protezione su catalogo prodotti e pricing
- Saks Fifth Avenue — PerimeterX su product pages e inventory check
Altri Settori
- Piattaforme di ticketing (eventi, concerti)
- Siti di immobili e real estate
- Alcune piattaforme di social media
La conoscenza di quali siti usano PerimeterX è importante per calibrare la strategia. Un approccio che funziona su un sito DataDome potrebbe non funzionare su PerimeterX, e viceversa.
Considerazioni Etiche e Legali
È fondamentale inquadrare queste tecniche in un contesto etico e legale:
- Rispetta i termini di servizio — Se un sito proibisce esplicitamente lo scraping nei suoi ToS, considera alternative come API ufficiali o partnership di dati.
- Verifica robots.txt — Anche se non è vincolante dal punto di vista legale, è una buona pratica rispettare le direttive di crawling.
- Limita il volume — Non sovraccaricare i server del sito. Usa pacing realistico e limita il traffico a livelli che non impattano le performance.
- GDPR e CCPA — Se raccogli dati personali, assicurati di essere in conformità con le normative sulla privacy applicabili.
- Scraping legittimo — Ricerca di mercato autorizzata, monitoraggio di prezzi pubblici, verifica di disponibilità di prodotti — questi sono use case legittimi che possono essere condotti in modo responsabile.
Lo scraping responsabile non è un attacco — è una forma legittima di accesso a dati pubblici. La chiave è farlo con rispetto per l'infrastruttura altrui e nel rispetto dei termini di servizio.
Per approfondire le best practice per lo scraping etico, consulta la nostra guida al web scraping con proxy residenziali.
Strategia Avanzata: Rotazione IP e Session Management
Per operazioni di raccolta dati su larga scala, la strategia di rotazione IP è critica. ProxyHat offre proxy residenziali con rotazione per richiesta o sessioni sticky:
Rotazione per Richiesta (Per-Request)
Ideale per richieste indipendenti dove non serve mantenere lo stato della sessione:
# Rotazione IP ad ogni richiesta — senza flag session-
curl -x http://user-country-US:PASSWORD@gate.proxyhat.com:8080 \
"https://www.example.com/api/data"
Sessioni Sticky
Necessarie per PerimeterX — i cookie _px3 e _pxhd devono essere mantenuti con lo stesso IP:
# Sessione sticky — stesso IP per 30 minuti
curl -x http://user-country-US-session-mysession123:PASSWORD@gate.proxyhat.com:8080 \
"https://www.united.com/en/us/flights"
Geo-Targeting a Livello Città
Per siti che verificano la coerenza geografica tra IP e contenuto richiesto:
# IP residenziale da Chicago per un sito aereolico americano
curl -x http://user-country-US-city-chicago-session-flight456:PASSWORD@gate.proxyhat.com:8080 \
"https://www.united.com/en/us/flights"
Consulta la pagina delle location per verificare le città e i paesi disponibili.
Key Takeaways
- PerimeterX è behavioral-heavy — A differenza di DataDome (fingerprint-centric) e Akamai (TLS-centric), PerimeterX dà peso dominante ai segnali comportamentali. Simulare movimento mouse e timing realistici è essenziale.
- I cookie _px3 e _pxhd sono il tuo stato — Proteggili, riutilizzali con lo stesso IP, e rigenerarli con un browser stealth quando scadono.
- IP residenziale è necessario ma non sufficiente — Un IP datacenter verrà bloccato immediatamente, ma un IP residenziale senza browser stealth e comportamento realistico verrà comunque rilevato.
- JA3/JA4 fingerprint conta — Il tuo client TLS deve corrispondere al browser che claim di essere. Usa Playwright o browser reali, non librerie HTTP pure.
- Pacing è critico — Richieste troppo rapide o troppo regolari innescano il behavioral model. Implementa jitter e pause realistiche.
- Operare eticamente — Rispetta i ToS, usa il volume minimo necessario, e considera API ufficiali quando disponibili.
Per configurare i tuoi proxy residenziali con ProxyHat e iniziare a costruire pipeline di dati robuste, visita il dashboard ProxyHat.






