Disclaimer legale: questo articolo copre esclusivamente l'accesso a dati pubblici su Yelp, senza autenticazione. Prima di raccogliere qualsiasi dato, leggi i Termini di Servizio di Yelp e rispetta il file robots.txt. Negli Stati Uniti, il Computer Fraud and Abuse Act (CFAA) disciplina l'accesso non autorizzato a sistemi informatici; nell'UE, il GDPR regolamenta il trattamento di dati personali, incluse le recensioni identificabili. Quando un'API ufficiale copre il tuo caso d'uso, usala: è più stabile, più etica e meno rischiosa.
Costruire dataset di aziende locali e recensioni è una necessità concreta per analisi competitiva, ricerca di mercato e arricchimento dati. Ma fare scraping di Yelp nel 2026 significa confrontarsi con difese anti-bot evolute, fingerprinting TLS e sistemi come PerimeterX (ora HUMAN) che bloccheranno un datacenter IP dopo poche richieste. Questa guida mostra cosa è effettivamente accessibile, come sopravvivere alle difese di Yelp con proxy residenziali rotanti e come strutturare un Yelp review scraper robusto e rispettoso dei limiti.
Perché fare scraping di schede aziendali e recensioni Yelp nel 2026 è difficile
Yelp espone pubblicamente profili aziendali, valutazioni, categorie, orari e testi delle recensioni senza richiedere login. Tuttutto ciò è accessibile all'utente anonimo, ma non è accessibile in modo stabile a uno scraper ingenuo. Il motivo è duplice.
Prima di tutto, Yelp protegge le pagine con PerimeterX/HUMAN, un sistema anti-bot che combina fingerprinting del browser, sfide JavaScript (il noto cookie _px3 e il payload sensor), scoring della reputazione IP e CAPTCHA se il punteggio di rischio supera una soglia. Un indirizzo datacenter viene solitamente bloccato entro 5–20 richieste; un IP residenziale con header coerenti può resistere molto più a lungo.
In secondo luogo, il fingerprinting TLS (JA3/JA4) distingue un client HTTP come requests o node-fetch da un browser reale. Anche con un User-Agent credibile, la signature TLS di Python urllib3 è riconoscibile. Per superare questo livello servono librerie che emulano il fingerprint del browser (es. curl_cffi o tls-client) o un browser headless.
Regola pratica: se il tuo scraper riceve status403con corpo HTML contenentepx-captchaochallenge, sei stato classificato come bot da PerimeterX. Fermati, cambia approccio, non riprovare con lo stesso IP.
Cosa è pubblico senza login vs. limite della Fusion API
Su https://www.yelp.com/biz/<slug> trovi senza autenticazione: nome azienda, valutazione media (1–5 stelle), numero di recensioni, categorie, indirizzo, orari di apertura, foto e testi delle recensioni più recenti. La pagina incorpora inoltre un blob JSON in window.__INITIAL_STATE__ o nel feed /review_feed che contiene oggetti strutturati con testo, autore (nickname pubblico), data e valutazione.
Yelp offre anche un'API ufficiale, la Fusion API, ma con limiti importanti: l'endpoint /reviews restituisce al massimo 3 recensioni per azienda e richiede una chiave API registrata. Per chi ha bisogno dell'intero storico delle recensioni o di campionamenti geografici densi, l'API non basta; per chi ha bisogno di metadati aziendali (nome, indirizzo, valutazione), invece, l'API è la scelta corretta ed eticamente preferibile.
Difese anti-bot di Yelp: PerimeterX, TLS e CAPTCHA
Per costruire un Yelp business data scraper affidabile devi capire cosa ti blocca. Ecco le tre difese principali.
- PerimeterX _px3 e sensor challenge: il sistema carica JavaScript che genera un token
_px3basato su fingerprint del browser, eventi mouse/touch e timing. Senza un browser reale (o un emulatore molto accurato), il token non viene generato e la richiesta viene sfidata. - Reputazione IP: PerimeterX assegna un punteggio all'IP. Datacenter e VPN note hanno punteggio alto = blocco quasi immediato. IP residenziali reali hanno punteggio basso, soprattutto se geolocalizzati coerentemente con l'azienda cercata.
- Fingerprint TLS: il server può confrontare la signature JA3/JA4 del handshake TLS con quella attesa per il User-Agent dichiarato. Mismatch = flag di rischio.
| Tipo di IP | Resistenza a PerimeterX | Coerenza geo | Costo indicativo |
|---|---|---|---|
| Datacenter | Bassa (blocco in 5–20 req) | Nulla | Basso |
| Residenziale rotante | Alta | Paese/città selezionabili | Medio |
| Mobile | Molto alta | Paese (carrier NAT) | Alto |
Perché servono proxy residenziali rotanti con geo US
Le ricerche locali su Yelp sono geolocalizzate: un'azienda a Austin, Texas appare con priorità diversa a seconda dell'IP del richiedente. Se raccogli dati di aziende in Stati Uniti diversi, usare un IP italiano produce risultati distorti o vuoti. Un proxy residenziale rotante con targeting -country-US (e opzionalmente -city-austin) risolve due problemi contemporaneamente: fornisce un IP con buona reputazione PerimeterX e garantisce coerenza geografica con i risultati attesi.
La rotazione per-request è utile per distribuire il carico, ma se devi mantenere una sessione (ad esempio per completare la sfida _px3 e poi richiedere più pagine dello stesso profilo), conviene usare una sessione sticky che mantiene lo stesso IP per un periodo. Con ProxyHat puoi controllare questo comportamento direttamente nel username.
Consulta la pagina delle locazioni ProxyHat per verificare la copertura geografica disponibile prima di progettare il tuo campionamento.
Implementazione: Python con ProxyHat e gate.proxyhat.com
L'esempio seguente usa curl_cffi per emulare il fingerprint TLS di Chrome, invia la richiesta attraverso il gateway HTTP di ProxyHat sulla porta 8080 con targeting US e una sessione sticky. L'obiettivo è estrarre il blob __INITIAL_STATE__ dalla pagina aziendale e parsare una recensione truncata.
import re, json
from curl_cffi import requests
# Credenziali ProxyHat: user e pass dal dashboard
PROXY = "http://user-country-US-session-sess01:PASSWORD@gate.proxyhat.com:8080"
HEADERS = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/124.0.0.0 Safari/537.36",
"Accept-Language": "en-US,en;q=0.9",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
}
url = "https://www.yelp.com/biz/taqueria-el-patr%C3%B3n-austin"
resp = requests.get(url, headers=HEADERS, proxies={"http": PROXY, "https": PROXY},
impersonate="chrome124", timeout=30)
if resp.status_code != 200:
raise SystemExit(f"Bloccato o errore: HTTP {resp.status_code}")
# Estrai __INITIAL_STATE__
m = re.search(r"window.__INITIAL_STATE__\s*=\s*({.*?});", resp.text, re.S)
if not m:
raise SystemExit("Blob non trovato: pagina可能是 una challenge PerimeterX.")
state = json.loads(m.group(1))
reviews = state.get("review", {}).get("reviews", [])
for r in reviews[:1]: # una sola recensione, troncata
print({
"author": r.get("author", {}).get("name"),
"rating": r.get("rating"),
"date": r.get("localizedDate"),
"text": (r.get("comment", {}).get("text", "") or "")[:120],
})
Output atteso (forma, non contenuti reali): un oggetto con author, rating (1–5), date e text troncato a 120 caratteri. Se ottieni un HTML con px-captcha, significa che PerimeterX ha sfidato la richiesta: riduci la frequenza, ruota sessione e verifica il fingerprint.
Node.js su SOCKS5 porta 1080
Per chi lavora in JavaScript/TypeScript, ProxyHat espone anche un endpoint SOCKS5 sulla porta 1080. L'esempio usa socks-proxy-agent e undici con un fingerprint browser-like via header.
import { SocksProxyAgent } from 'socks-proxy-agent';
import { fetch } from 'undici';
const agent = new SocksProxyAgent(
'socks5://user-country-US-session-sess02:PASSWORD@gate.proxyhat.com:1080'
);
const res = await fetch('https://www.yelp.com/biz/taqueria-el-patron-austin', {
agent,
headers: {
'User-Agent':
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) ' +
'AppleWebKit/537.36 (KHTML, like Gecko) ' +
'Chrome/124.0.0.0 Safari/537.36',
'Accept-Language': 'en-US,en;q=0.9',
},
});
const html = await res.text();
const m = html.match(/window\.__INITIAL_STATE__\s*=\s*({[\s\S]*?});/);
if (!m) throw new Error('Nessun blob: possibile challenge PerimeterX');
const state = JSON.parse(m[1]);
const reviews = state?.review?.reviews ?? [];
console.log(reviews[0]?.comment?.text?.slice(0, 120));
Nota: undici non emula il fingerprint TLS di Chrome. Per carichi pesanti su Yelp, valuta un browser headless (Playwright) con il proxy configurato, così il fingerprint TLS e l'esecuzione JavaScript sono gestiti dal browser reale.
Paginazione, rate limiting, sessioni sticky e rotazione User-Agent
La raccolta di un dataset completo richiede paginazione e disciplina. Ecco le pratiche che riducono i blocchi.
- Pacing: mantieni 1 richiesta ogni 3–5 secondi per sessione. Sotto i 200 ms tra richieste consecutive, PerimeterX alza il punteggio di rischio quasi certamente.
- Sessione sticky per profilo: usa
-session-sess01per completare la sfida e leggere più pagine dello stesso profilo con lo stesso IP, poi ruota-session-sess02per il profilo successivo. - Rotazione User-Agent coerente: cambia UA tra profili diversi, ma mantieni lo stesso UA per tutta la durata di una sessione. Un UA che cambia a ogni richiesta è un segnale di bot ovvio.
- Paginazione del review feed: il feed
/review_feedaccetta parametri di offset/limit (ostart); leggi la struttura HTML della pagina per determinare l'URL esatto, che può variare tra categorie. - Retry con backoff: su
429o403con corpopx-captcha, fai backoff esponenziale (2s, 4s, 8s) e cambia sessione/IP prima di riprovare.
Per dettagli su configurazione avanzata e parametri di sessione, consulta la documentazione ProxyHat.
ProxyHat: configurazione e note operative
ProxyHat fornisce un gateway unificato: HTTP su gate.proxyhat.com:8080, SOCKS5 su gate.proxyhat.com:1080. Il targeting geografico e la sessione si impostano nel username, senza URL aggiuntivi.
user-country-US— IP residenziale negli Stati Uniti.user-country-US-city-austin— targeting cittadino per ricerche locali coerenti.user-session-abc123— sessione sticky: stesso IP finché la sessione è attiva.
Per confrontare i piani in base al volume di richieste previsto, vedi la pagina prezzi ProxyHat; per casi d'uso di raccolta dati strutturati, vedi web scraping e SERP tracking.
Errori comuni e edge case
- Usare IP datacenter per Yelp: blocco quasi certo entro poche richieste. Usa residenziali.
- Ignorare il fingerprint TLS:
requestspuro viene identificato. Usacurl_cfficonimpersonateo un browser headless. - Estrarre dati personali identificativi: il nickname pubblico è un dato personale sotto GDPR se associabile a una persona. Minimizza o anonimizza.
- Supporre struttura HTML stabile: Yelp cambia markup e nomi chiave del blob
__INITIAL_STATE__nel tempo. Aggiungi test di regressione sul parser. - Login-walled content: non tentare di accedere a contenuti riservati agli utenti autenticati. Restringi il campo ai dati pubblici.
Scraping etico e quando usare l'API ufficiale
Lo scraping non è un diritto: è un accesso a un sistema di terzi soggetto a termini e legge. Prima di raccogliere, chiediti se l'Fusion API copre il tuo bisogno. Per metadati aziendali (nome, indirizzo, categorie, valutazione, 3 recensioni) l'API è sufficiente, stabile e legalmente più sicura.
Quando l'API non basta (es. storico completo di recensioni pubbliche), applica principi etici: rispetta robots.txt, mantieni frequenze basse, non ripubblicare dati personali senza base legale, e considera che le recensioni sono opinioni di persone reali protette da GDPR. Se costruisci un dataset per ricerca, anonimizza gli autori e aggrega a livello aziendale quando possibile.
Se il tuo caso d'uso è "conoscere la valutazione media e le categorie di 500 ristoranti", usa la Fusion API. Se è "analizzare 50.000 recensioni pubbliche per sentiment analysis", allora lo scraping ha una giustificazione tecnica, ma resta entro i limiti legali ed etici.
Key Takeaways
- Yelp espone pubblicamente profili, valutazioni, categorie, orari e testi recensioni senza login, ma la Fusion API limita a 3 recensioni per azienda.
- PerimeterX (HUMAN), fingerprint TLS e reputazione IP sono le tre difese principali; i datacenter IP vengono bloccati in 5–20 richieste.
- Proxy residenziali rotanti con geo US (es.
-country-US-city-austin) migliorano reputazione IP e coerenza dei risultati locali. - Usa
curl_cfficonimpersonateo un browser headless per superare il fingerprint TLS; mantieni sessioni sticky per profilo. - Pacing 1 req / 3–5 s, rotazione User-Agent coerente e backoff su 429/403 riducono i blocchi.
- Etica: preferisci l'API ufficiale quando possibile, rispetta robots.txt e GDPR, evita contenuti login-walled.
FAQ
Come fare scraping di schede aziendali e recensioni Yelp nel 2026?
Accedi alle pagine pubbliche /biz/<slug> con un browser headless o curl_cffi che emula il fingerprint TLS di Chrome, instrada il traffico attraverso un proxy residenziale rotante con geo US (es. ProxyHat gate.proxyhat.com:8080 con -country-US), estrai il blob window.__INITIAL_STATE__ e parsa le recensioni strutturate. Mantieni pacing basso (1 req / 3–5 s) e usa sessioni sticky per profilo.
Perché i proxy sono necessari per lo scraping di Yelp?
PerimeterX assegna un punteggio di rischio all'IP: i datacenter e le VPN note vengono bloccati dopo poche richieste. I proxy residenziali reali hanno reputazione alta e, con il targeting geografico, garantiscono risultati locali coerenti (un'azienda a Austin appare correttamente solo con IP US). Senza proxy, uno scraper viene sfidato o bloccato quasi subito.
Quale tipo di proxy funziona meglio per Yelp?
Proxy residenziali rotanti con targeting paese/città sono la scelta migliore: combinano alta reputazione IP (necessaria per superare PerimeterX) e coerenza geografica (necessaria per risultati locali corretti). I proxy mobile offrono resistenza ancora maggiore ma costano di più; i datacenter sono sconsigliati perché bloccati rapidamente.
Come evitare i blocchi quando si fa scraping di Yelp?
Usa IP residenziali rotanti con sessioni sticky per profilo, emula il fingerprint TLS del browser (curl_cffi o Playwright), mantieni un pacing di 1 richiesta ogni 3–5 secondi, ruota User-Agent coerentemente (stesso UA per sessione) e implementa backoff esponenziale su 429/403. Evita contenuti login-walled e rispetta robots.txt e GDPR per i dati personali.
Quali dati di Yelp sono pubblici senza login?
Senza autenticazione sono accessibili: nome azienda, valutazione media, numero di recensioni, categorie, indirizzo, orari di apertura, foto e testi delle recensioni più recenti, incorporati nel blob __INITIAL_STATE__ o nel feed /review_feed. La Fusion API ufficiale, invece, limita le recensioni a 3 per azienda.






