Wichtiger Hinweis: Dieser Artikel behandelt ausschließlich den Zugriff auf öffentliche Daten, die ohne Anmeldung auf Yelp sichtbar sind. Bevor Sie Yelp scrapen, prüfen Sie die Yelp Terms of Service, das US-Computer Fraud and Abuse Act (CFAA) sowie die DSGVO/GDPR in der EU. Das automatisierte Auslesen kann gegen Plattform-AGB verstoßen; personenbezogene Daten aus Reviews unterliegen zusätzlich dem Datenschutzrecht. Die hier gezeigten Techniken dienen Bildungszwecken und legitimem Public-Data-Zugang.
Yelp Scrapen im Jahr 2026: Was möglich ist und was nicht
Wer Yelp scrapen möchte, steht vor einem Paradox: Die Plattform zeigt Millionen von Geschäftsprofilen, Bewertungen und Kategorien frei zugänglich im Browser, wehrt sich aber massiv gegen automatisierte Abrufe. Für Entwickler, die lokale-Business-Datensätze oder Yelp Review Scraper-Pipelines aufbauen, ist es entscheidend zu wissen, welche Daten ohne Login erreichbar sind, wie Yelps Anti-Bot-System funktioniert und wie rotierende Residential-Proxys den Zugriff zuverlässig halten.
Öffentlich zugänglich ohne Anmeldung sind:
- Geschäftsprofile unter
/biz/<slug>mit Name, Adresse, Telefon, Öffnungszeiten, Kategorien und Preisbereich. - Die Gesamtbewertung (Sterne-Durchschnitt) und die Anzahl der Reviews.
- Einzelne Review-Texte, Autoren-Anzeige (Vorname + initial), Sterne und Datum — allerdings nur ein begrenzter Vorschau-Satz pro Seite.
Die offizielle Yelp Fusion API bietet zwar einen sauberen REST-Zugang, limitiert Reviews aber auf maximal drei Einträge pro Business. Wer umfassendere Review-Datensätze oder historische Bewertungen benötigt, muss auf Web-Scraping zurückgreifen — und dabei Yelps Verteidigungsschichten überwinden.
Technischer Kontext: Yelps Anti-Bot-Verteidigung
PerimeterX / HUMAN und das _px3-Cookie
Yelp nutzt PerimeterX (mittlerweile unter HUMAN Security firmierend) als primäre Bot-Defense-Schicht. Beim ersten Seitenaufruf wird ein JavaScript-Sensor geladen, der Browser-Eigenschaften sammelt — Canvas-Rendering, WebGL-Parameter, Schriftarten, Timing-Daten — und daraus ein _px3-Cookie berechnet. Fehlt dieses Cookie oder ist die Sensor-Signatur verdächtig, erscheint nach wenigen Requests eine CAPTCHA-Challenge oder ein HTTP-429-Status.
Reine Datacenter-IPs werden von PerimeterX besonders schnell blockiert. In der Praxis genügen oft 5 bis 15 Requests von einer Datacenter-IP, bevor die IP-Reputation-Score-Schwelle überschritten ist und die Blockade greift.
TLS-Fingerprinting
Über den reinen User-Agent hinaus prüft PerimeterX den TLS-Handshake-Fingerprint (JA3/JA4). Ein Python-requests-Client mit Standard-urllib3-Stack erzeugt einen anderen TLS-Fingerprint als Chrome oder Firefox. Diese Diskrepanz ist ein starkes Bot-Signal. Tools wie curl_cffi oder tls-client können Chrome-kompatible TLS-Fingerprints emulieren und reduzieren dieses Risiko erheblich.
CAPTCHA nach wenigen Datacenter-Requests
Wenn PerimeterX eine IP als suspekt einstuft, wird ein interstitielles CAPTCHA ausgeliefert. Ohne Headless-Browser-Lösung mit CAPTCHA-Solver ist dann kein Weiterkommen. Die effizientere Strategie: gar nicht erst blockiert werden — durch Residential-Proxys, realistische Header und moderate Request-Raten.
Warum rotierende Residential-Proxys mit US-Geo nötig sind
Yelp ist eine US-zentrierte Plattform; die meisten Geschäftsdaten stammen von US-Standorten. PerimeterX bewertet IP-Reputation nach ASN-Typ, geografischer Konsistenz und historischem Verhalten. Residential-IPs von echten ISPs haben eine deutlich höhere Vertrauenswürdigkeit als Datacenter-ASNs.
Für lokalisierte Ergebnisse — z. B. Restaurants in Austin, TX — ist die Geo-Konsistenz zusätzlich wichtig. Eine Anfrage aus einer frankfurter Datacenter-IP, die nach "Restaurants in Austin" sucht, ist ein sofortiges Bot-Signal. Mit ProxyHat können Sie die Geo-Targeting-Flags im Username setzen:
http://user-country-US-region-texas-city-austin:pass@gate.proxyhat.com:8080
Dadurch erhalten Sie eine US-Residential-IP, die geografisch zu Ihrer Suchanfrage passt — was die IP-Reputation-Score belastet und Blockaden minimiert. Weitere verfügbare Standorte finden Sie auf unserer Proxy-Locations-Seite.
Praktische Implementierung: Yelp scrapen mit Python und ProxyHat
Beispiel 1: Geschäftsprofil und Reviews via requests + ProxyHat
Das folgende Beispiel ruft ein Yelp-Geschäftsprofil über ProxyHat ab und extrahiert die eingebettete __INITIAL_STATE__-JSON-Struktur, die die Review-Vorschau enthält. Wir verwenden curl_cffi für einen Chrome-kompatiblen TLS-Fingerprint.
import re, json
from curl_cffi import requests
# ProxyHat Residential-Proxy mit US-Geo und Sticky Session
proxy_url = "http://user-country-US-region-texas-city-austin-sid-biz001:pass@gate.proxyhat.com:8080"
proxies = {"http": proxy_url, "https": proxy_url}
headers = {
"accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"accept-language": "en-US,en;q=0.9",
"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",
}
url = "https://www.yelp.com/biz/kerbey-lane-cafe-austin"
resp = requests.get(url, headers=headers, proxies=proxies, impersonate="chrome131", timeout=30)
if resp.status_code != 200:
print(f"Blockiert: HTTP {resp.status_code}")
exit()
# __INITIAL_STATE__ aus dem HTML extrahieren
match = re.search(r'window\.__INITIAL_STATE__\s*=\s*({.*?});', resp.text, re.DOTALL)
if match:
state = json.loads(match.group(1))
biz = state.get("biz", {})
reviews = biz.get("reviews", [])
# Erste (gekürzte) Review ausgeben
if reviews:
r = reviews[0]
print({
"author": r.get("author", {}).get("displayName", ""),
"rating": r.get("rating"),
"date": r.get("publishedDate", ""),
"text": r.get("comment", "")[:200] + "...",
})
Dieser Ansatz vermeidet HTML-Parsing-Fragilität, da Yelp die initialen Review-Daten als JSON in die Seite einbettet. Die __INITIAL_STATE__-Struktur enthält typischerweise die ersten 10 bis 20 Reviews pro Business — deutlich mehr als die drei der Fusion API.
Beispiel 2: Paginierte Reviews mit Sticky Session
Für Reviews jenseits der ersten Seite nutzt Yelp einen AJAX-Endpunkt /biz_async/<slug>/review_feed. Die Pagination erfordert eine konsistente Session, damit PerimeterX den _px3-Cookie nicht zurücksetzt.
import time
from curl_cffi import requests
session_id = "yelp-biz-001"
proxy = f"http://user-country-US-region-texas-city-austin-sid-{session_id}:pass@gate.proxyhat.com:8080"
proxies = {"http": proxy, "https": proxy}
headers = {
"accept": "application/json",
"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",
"referer": "https://www.yelp.com/biz/kerbey-lane-cafe-austin",
}
all_reviews = []
start = 0
for page in range(5):
feed_url = f"https://www.yelp.com/biz_async/kerbey-lane-cafe-austin/review_feed?start={start}"
resp = requests.get(feed_url, headers=headers, proxies=proxies, impersonate="chrome131", timeout=30)
if resp.status_code == 200:
data = resp.json()
reviews = data.get("reviews", [])
if not reviews:
break
all_reviews.extend(reviews)
start += len(reviews)
time.sleep(3) # Rate-Limit-Pacing
else:
print(f"Seite {page}: HTTP {resp.status_code} — Session rotieren")
break
print(f"Gesammelt: {len(all_reviews)} Reviews")
Beispiel 3: Node.js über SOCKS5 (Port 1080)
Für Node.js-Anwendungen kann ProxyHat über SOCKS5 auf Port 1080 angesprochen werden. Das folgende Beispiel verwendet socks-proxy-agent zusammen mit undici für moderne HTTP-Requests.
const { SocksProxyAgent } = require('socks-proxy-agent');
const fetch = require('undici').fetch;
const socksUrl = 'socks5://user-country-US-sid-node01:pass@gate.proxyhat.com:1080';
const agent = new SocksProxyAgent(socksUrl);
const headers = {
'accept': 'text/html,application/xhtml+xml',
'accept-language': 'en-US,en;q=0.9',
'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',
};
async function scrapeYelp(slug) {
const url = `https://www.yelp.com/biz/${slug}`;
const resp = await fetch(url, { headers, dispatcher: agent, signal: AbortSignal.timeout(30000) });
if (!resp.ok) {
console.error(`HTTP ${resp.status}`);
return null;
}
const html = await resp.text();
const match = html.match(/window\.__INITIAL_STATE__\s*=\s*({.*?});/s);
if (!match) return null;
const state = JSON.parse(match[1]);
const reviews = state?.biz?.reviews ?? [];
return reviews.slice(0, 3).map(r => ({
author: r?.author?.displayName ?? '',
rating: r?.rating,
text: (r?.comment ?? '').slice(0, 150) + '...',
}));
}
scrapeYelp('kerbey-lane-cafe-austin').then(console.log).catch(console.error);
Pagination, Rate-Limit-Pacing und Fingerprint-Minimierung
Request-Raten strategisch steuern
Yelp toleriert moderate Abrufgeschwindigkeiten, reagiert aber auf Burst-Requests empfindlich. Eine bewährte Rate liegt bei 1 Request alle 3 bis 5 Sekunden pro Session. Bei höheren Raten steigt die Block-Wahrscheinlichkeit exponentiell. Verteilen Sie Anfragen über mehrere Sessions, statt eine Session zu überlasten.
Sticky Sessions für Review-Pagination
Die Pagination des review_feed-Endpunkts erfordert Cookie-Konsistenz. ProxyHat Sticky Sessions halten dieselbe IP für die Dauer einer Logik-Einheit — z. B. alle Pages eines Business. Die Session-ID wird im Username übergeben:
http://user-sid-biz-001:pass@gate.proxyhat.com:8080
Wechseln Sie die Session-ID pro Business, nicht pro Page. So bleibt der _px3-Cookie gültig und PerimeterX sieht einen konsistenten Nutzer.
User-Agent-Rotation
Ein statischer User-Agent über hunderte Requests ist ein Fingerprint-Risiko. Rotieren Sie zwischen aktuellen, realistischen Chrome- und Firefox-User-Agents. Wichtig: Der User-Agent muss zum TLS-Fingerprint passen. Wenn Sie impersonate="chrome131" verwenden, sollte der User-Agent ebenfalls Chrome 131 widerspiegeln.
Header-Hygiene
Vergessen Sie nicht sec-ch-ua, sec-fetch-* und accept-language-Header. Ein Browser sendet all diese; ein nackter Python-Client nicht. Die Abwesenheit ist ein starkes Bot-Signal.
Häufige Fehler und Edge Cases
| Problem | Ursache | Lösung |
|---|---|---|
| HTTP 429 nach wenigen Requests | Datacenter-IP mit schlechter Reputation | Auf Residential-Proxys wechseln, US-Geo setzen |
| CAPTCHA-Seite statt Profil | PerimeterX-Sensor fehlt oder TLS-Fingerprint verdächtig | curl_cffi mit impersonate verwenden |
Leere __INITIAL_STATE__ | Yelp ändert JSON-Struktur oder liefert Lite-Version | HTML-Parsing als Fallback, Struktur regelmäßig validieren |
| Review-Pagination bricht ab | Session-Cookie verloren durch IP-Wechsel | Sticky Session für gesamte Pagination verwenden |
| Lokalisierte Ergebnisse fehlen | Geo-Mismatch zwischen IP und Suchort | -country-US-region-texas-city-austin für konsistente Geo-Targeting |
ProxyHat-spezifisches Setup
ProxyHat bietet Residential-, Mobile- und Datacenter-Proxys über einen zentralen Gateway. Für Yelp Geschäftsdaten und Reviews empfehlen wir ausschließlich Residential-Proxys mit US-Geo-Targeting. Die Einrichtung erfolgt über das ProxyHat-Dashboard oder direkt über die Gateway-Parameter.
Weitere Ressourcen:
- Preise und Pakete — Residential-Proxys ab flexiblen Kontingenten.
- Use Case: Web Scraping — Best Practices für Proxy-gestütztes Scraping.
- Use Case: SERP-Tracking — Für Suchmaschinen- und Ranking-Daten.
Ethisches Scraping und wann die Fusion API reicht
Bevor Sie Yelp scrapen, prüfen Sie, ob die Yelp Fusion API Ihre Anforderungen bereits erfüllt. Für viele Anwendungsfälle — Business-Suche, Basis-Profile, bis zu drei Reviews — ist die API der saubere, legale und zuverlässigere Weg. Sie erfordert einen API-Key, hält sich an Yelps Rate-Limits und vermeidet jegliche Anti-Bot-Konflikte.
Wenn Sie mehr als drei Reviews pro Business benötigen, gelten folgende ethische Richtlinien:
- Respektieren Sie
robots.txt: Prüfen Sie Yelpsrobots.txtund respektieren Sie Disallow-Anweisungen. - Keine personenbezogenen Daten: Review-Autoren-Namen sind Pseudonyme; vermeiden Sie die Verknüpfung mit anderen Datensätzen zur Identifizierung.
- Kein Login-walled Content: Greifen Sie nicht auf Inhalte zu, die eine Anmeldung erfordern. Das überschreitet die Grenze von öffentlich zu privat.
- Rate-Limits respektieren: Überlasten Sie Yelps Server nicht. 1 Request pro 3–5 Sekunden ist ein vernünftiges Maximum.
- DSGVO-Konformität: Wenn Sie EU-Bürger betreffende Daten verarbeiten, stellen Sie eine Rechtsgrundlage sicher und beachten Sie Löschpflichten.
Faustregel: Wenn die Fusion API 80% Ihres Bedarfs deckt, nutzen Sie die API für diese 80% und scrapen Sie nur die verbleibenden 20% — Reviews über den Cap hinaus — mit ProxyHat-Residential-Proxys.






