Yelp scrapen 2026: Öffentliche Geschäftsdaten und Bewertungen extrahieren
Wer Yelp scrapen will, steht vor einer Mauer aus Anti-Bot-Systemen, TLS-Fingerprinting und IP-Reputation-Scores. Dabei sind die meisten Geschäftsdaten — Name, Adresse, Bewertungen, Kategorien, Öffnungszeiten — öffentlich und ohne Login zugänglich. Dieser Leitfaden zeigt Entwicklern, wie sie Yelp Geschäftsdaten und Yelp Bewertungen mit rotierenden Residential Proxies zuverlässig extrahieren, ohne von PerimeterX blockiert zu werden.
Rechtlicher Hinweis: Das Scraping von Yelp kann gegen die Nutzungsbedingungen (Terms of Service) von Yelp verstoßen. In den USA kann unbefugter Zugriff nach dem Computer Fraud and Abuse Act (CFAA) strafbar sein. In der EU fällt die Verarbeitung personenbezogener Daten (z. B. Namen von Review-Autoren) unter die DSGVO (GDPR). Dieser Artikel behandelt ausschließlich den Zugriff auf öffentliche, nicht login-geschützte Daten zu Bildungszwecken. Prüfen Sie stets die robots.txt und die ToS von Yelp, bevor Sie scrapen, und konsultieren Sie einen Rechtsbeistand.
Was ist ohne Login öffentlich zugänglich?
Yelp-Geschäftsprofile unter /biz/<slug> sind ohne Anmeldung vollständig sichtbar. Folgende Datenfelder sind öffentlich verfügbar:
- Geschäftsname, Adresse, Telefonnummer — direkt im Profil-Header
- Gesamtbewertung (1–5 Sterne) und Anzahl der Bewertungen
- Kategorien (z. B. Restaurants, Italian, Pizza)
- Öffnungszeiten — wöchentlich strukturiert
- Bewertungstexte — vollständiger Text, Autor-Name (Vorname + Initial), Datum
- Fotos — URLs zu Benutzer- und Geschäftsfotos
Yelp bietet zudem eine offizielle Fusion API, die jedoch stark limitiert ist: Sie liefert maximal 3 Bewertungen pro Geschäft und erfordert einen API-Key mit einem Rate-Limit von 5.000 Calls/Tag. Für den Aufbau umfassender lokaler Geschäftsdatasets reicht das nicht aus. Web-Scraping der öffentlichen Profilseiten ist daher oft die einzige praktikable Methode, um an die vollständigen Bewertungstexte zu gelangen.
| Kriterium | Fusion API | Web-Scraping |
|---|---|---|
| Bewertungen pro Geschäft | Max. 3 | Alle verfügbaren |
| Rate-Limit | 5.000 Calls/Tag | Abhängig von Proxy-Infrastruktur |
| Authentifizierung | API-Key nötig | Kein Login nötig |
| Kosten | Kostenlos (mit Limits) | Proxy-Kosten (ab ~$10/Monat) |
| Anti-Bot-Risiko | Keines | PerimeterX/HUMAN |
Yelps Anti-Bot-Verteidigung: PerimeterX/HUMAN und TLS-Fingerprinting
Yelp setzt HUMAN Security (ehemals PerimeterX) als primären Bot-Schutz ein. Das System funktioniert in mehreren Schichten, die ein einfaches requests.get() schnell scheitern lassen.
Die _px3-Cookie und Sensor-Challenge
PerimeterX injiziert ein _px3-Cookie, das einen kryptografischen Token enthält, der aus Browser-Sensordaten (Mausbewegungen, Touch-Events, Tastatur-Timing) berechnet wird. Bei der ersten Seitenladung wird ein JavaScript-Challenge ausgelöst, der den Sensor-Token generiert. Ohne gültiges _px3-Cookie werden nach wenigen Requests CAPTCHAs oder HTTP 403-Antworten zurückgegeben.
TLS-Fingerprinting (JA3-Hash)
Yelp inspiziert den TLS-Client-Hello-Handshake, um nicht-browser HTTP-Clients zu identifizieren. Ein python-requests-Client hat einen deutlich anderen JA3-Hash als ein echter Chrome-Browser. Anti-Bot-Systeme wie PerimeterX nutzen diese Fingerabdrücke, um automatisierte Clients bereits auf TCP-Ebene zu klassifizieren — noch bevor der HTTP-Body gesendet wird.
CAPTCHAs nach Datacenter-Requests
Datacenter-IPs (z. B. AWS, DigitalOcean, Hetzner) haben bei PerimeterX eine sehr niedrige IP-Reputation. Typischerweise genügen 3–5 Requests von einer Datacenter-IP, bevor ein CAPTCHA ausgelöst wird. Residential IPs aus dem US-Raum haben eine deutlich höhere Reputation und überleben deutlich mehr Requests pro IP, bevor Blockaden auftreten.
Warum rotierende Residential Proxies mit US-Geo nötig sind
Yelp personalisiert Suchergebnisse nach Standort. Eine Suche nach „Pizza“ von einer IP in Austin, TX liefert andere Ergebnisse als dieselbe Suche von einer IP in Berlin. Um realistische lokale Geschäftsergebnisse zu erhalten, müssen Sie US-basierte Residential IPs verwenden.
Mit ProxyHat können Sie Geo-Targeting direkt im Benutzernamen spezifizieren:
# US-weite Rotation
http://user-country-US:pass@gate.proxyhat.com:8080
# Stadt-level Targeting (Austin, Texas)
http://user-country-US-city-austin:pass@gate.proxyhat.com:8080
# Sticky Session für Pagination-Kontinuität
http://user-country-US-session-abc123:pass@gate.proxyhat.com:8080Rotierende Residential Proxies bieten drei entscheidende Vorteile für Yelp-Scraping:
- Hohe IP-Reputation: Residential IPs stammen von echten ISPs und werden von PerimeterX als legitime Nutzer eingestuft — im Gegensatz zu Datacenter-IPs, die sofort markiert werden.
- Geo-Targeting: Sie können Stadt-level-Targeting nutzen, um lokal relevante Geschäftsergebnisse zu erhalten, die mit der jeweiligen Region übereinstimmen.
- Rotation: Bei jedem Request wird eine neue IP verwendet, sodass einzelne IPs nicht durch häufige Anfragen auffallen und keine Reputation aufbauen müssen.
ProxyHat bietet Residential Proxies in über 90 Ländern mit Stadt-level-Geo-Targeting. Die verfügbaren Standorte umfassen alle großen US-Metropolregionen.
Praktische Implementierung: Yelp scrapen mit Python
Das folgende Beispiel zeigt, wie Sie eine Yelp-Geschäftsseite über ProxyHat abrufen und das eingebettete __INITIAL_STATE__-JSON extrahieren. Yelp bettet einen großen JSON-Blob in die Seite ein, der die meisten Geschäftsdaten und die ersten Bewertungen enthält.
import requests
import json
import re
import time
import random
# ProxyHat HTTP Proxy mit US-Geo und Sticky Session
proxy_url = "http://user-country-US-city-austin:pass@gate.proxyhat.com:8080"
proxies = {
"http": proxy_url,
"https": proxy_url,
}
headers = {
"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": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language": "en-US,en;q=0.9",
"Accept-Encoding": "gzip, deflate, br",
"Connection": "keep-alive",
}
def scrape_yelp_business(slug):
url = f"https://www.yelp.com/biz/{slug}"
try:
response = requests.get(url, headers=headers, proxies=proxies, timeout=30)
response.raise_for_status()
except requests.RequestException as e:
print(f"Request failed: {e}")
return None
# __INITIAL_STATE__ aus dem HTML extrahieren
match = re.search(
r'window\.__INITIAL_STATE__\s*=\s*({.+?});',
response.text,
re.DOTALL
)
if not match:
print("__INITIAL_STATE__ not found — possible CAPTCHA or block")
return None
try:
state = json.loads(match.group(1))
except json.JSONDecodeError:
print("Failed to parse __INITIAL_STATE__ JSON")
return None
# Geschäftsdaten extrahieren (Struktur kann variieren)
biz_data = state.get("bizDetailsPageProps", {}).get("bizCardInfoProps", {})
reviews = state.get("bizDetailsPageProps", {}).get("reviewListFeedProps", {}).get("reviews", [])
# Erste Bewertung (gekürzt)
if reviews:
review = reviews[0]
print(f"Business: {biz_data.get('name', 'N/A')}")
print(f"Rating: {biz_data.get('rating', 'N/A')}")
print(f"Review by {review.get('author', {}).get('name', 'N/A')}:")
print(f" {review.get('comment', {}).get('text', '')[:200]}...")
return state
# Beispiel-Aufruf
scrape_yelp_business("tartine-bakery-san-francisco")
# Rate-Limit-Pacing: 5-10 Sekunden zwischen Requests
time.sleep(random.uniform(5, 10))Hinweis: Die Struktur von __INITIAL_STATE__ ändert sich regelmäßig. Verwenden Sie defensive Parsing-Logik mit .get() und Fallback-Werten, anstatt feste Pfade anzunehmen. Die obige Pfad-Struktur (bizDetailsPageProps → reviewListFeedProps) ist ein typisches Beispiel, kann aber variieren.
Node.js-Beispiel über SOCKS5 (Port 1080)
Für Node.js-Anwendungen können Sie den SOCKS5-Endpoint von ProxyHat auf Port 1080 nutzen. SOCKS5 ist besonders nützlich, wenn Sie niedrigere Latenz oder eine andere Transport-Ebene benötigen als HTTP CONNECT.
const { SocksProxyAgent } = require('socks-proxy-agent');
const fetch = require('node-fetch');
// ProxyHat SOCKS5 mit US-Geo und Rotation
const socksUrl = 'socks5://user-country-US:pass@gate.proxyhat.com:1080';
const agent = new SocksProxyAgent(socksUrl);
const headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en-US,en;q=0.9',
};
async function scrapeYelpBusiness(slug) {
const url = `https://www.yelp.com/biz/${slug}`;
try {
const response = await fetch(url, {
agent,
headers,
timeout: 30000,
});
if (!response.ok) {
throw new Error(`HTTP ${response.status}`);
}
const html = await response.text();
// __INITIAL_STATE__ extrahieren
const match = html.match(/window\.__INITIAL_STATE__\s*=\s*({.+?});/s);
if (!match) {
console.error('__INITIAL_STATE__ not found');
return null;
}
const state = JSON.parse(match[1]);
const reviews = state?.bizDetailsPageProps?.reviewListFeedProps?.reviews || [];
if (reviews.length > 0) {
console.log(`Found ${reviews.length} reviews`);
console.log(`First review: ${reviews[0]?.comment?.text?.substring(0, 200)}...`);
}
return state;
} catch (error) {
console.error('Scrape failed:', error.message);
return null;
}
}
// Beispiel-Aufruf mit Rate-Limit-Pacing
(async () => {
await scrapeYelpBusiness('tartine-bakery-san-francisco');
await new Promise(r => setTimeout(r, 5000 + Math.random() * 5000));
})();Pagination, Rate-Limit-Pacing und Sticky Sessions
Pagination über den review_feed-Endpoint
Yelp lädt weitere Bewertungen per AJAX nach. Der Endpoint /biz/<slug>/review_feed akzeptiert einen start-Parameter für die Pagination. Bei 10 Bewertungen pro Seite bedeutet das:
# Review-Feed mit Pagination
review_feed_url = f"https://www.yelp.com/biz/{slug}/review_feed?start={offset}"
# Bei 10 Reviews pro Seite:
# start=0 → Seite 1
# start=10 → Seite 2
# start=20 → Seite 3Rate-Limit-Pacing
Aggressives Scraping führt schnell zu Blockaden. Die folgende Pacing-Strategie hat sich in der Praxis bewährt:
- 5–10 Sekunden Wartezeit zwischen Requests von derselben IP
- Maximal 100 Requests pro Stunde pro Session-ID
- Zufällige Jitter-Zeiten (
random.uniform(5, 10)), um deterministische Muster zu vermeiden - Backoff bei HTTP 429 oder 403: 60 Sekunden Pause, dann neue Session-ID und neuer User-Agent
Sticky Sessions für Pagination-Kontinuität
Bei der Pagination über review_feed ist es wichtig, dieselbe IP zu verwenden, da PerimeterX Session-Konsistenz prüft. Verwenden Sie die -session--Flag in ProxyHat, um eine IP über mehrere Requests hinweg zu halten:
# Sticky Session — dieselbe IP für alle Pagination-Requests
session_id = "yelp-tartine-001"
proxy_url = f"http://user-country-US-session-{session_id}:pass@gate.proxyhat.com:8080"Wechseln Sie die Session-ID nach jedem Geschäft oder nach 20–30 Requests, um die IP-Rotation zu erzwingen und die Belastung einzelner IPs zu minimieren.
Rotierende User-Agents zur Fingerprint-Reduktion
Ein einzelner User-Agent ist ein leicht erkennbares Muster. Rotieren Sie zwischen 5–10 aktuellen Browser-User-Agents, um das Fingerprint-Risiko zu senken:
import random
user_agents = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2 Safari/605.1.15",
]
headers["User-Agent"] = random.choice(user_agents)Kombinieren Sie User-Agent-Rotation mit passenden Accept- und Sec-CH-UA-Headern, um ein konsistentes Browser-Profil zu erzeugen. Inkonsistenzen (z. B. Chrome UA mit Firefox Accept-Headern) sind ein weiterer Fingerprinting-Vektor, den Anti-Bot-Systeme leicht erkennen.
ProxyHat-spezifische Einrichtung
ProxyHat bietet drei Proxy-Typen, die für Yelp-Scraping unterschiedlich geeignet sind:
| Proxy-Typ | Eignung für Yelp | Vorteile | Nachteile |
|---|---|---|---|
| Residential | ★★★★★ Bestens geeignet | Hohe IP-Reputation, Geo-Targeting, PerimeterX-tauglich | Höhere Kosten als Datacenter |
| Mobile | ★★★★☆ Sehr gut | Höchste IP-Reputation, Carrier-IPs | Teuer, begrenzte Verfügbarkeit |
| Datacenter | ★☆☆☆☆ Nicht empfohlen | Günstig, schnell | Niedrige IP-Reputation, CAPTCHAs nach 3–5 Requests |
Für Yelp-Scraping empfehlen wir Residential Proxies mit US-Geo-Targeting. Die Preise starten bei $10/Monat für Pay-as-you-go-Tarife. Detaillierte technische Dokumentation finden Sie in den ProxyHat Docs.
Ethisches Scraping: Wann man die offizielle API nutzen sollte
Web-Scraping ist ein mächtiges Werkzeug, aber nicht immer die beste Wahl. Bevor Sie Yelp scrapen, prüfen Sie, ob die Fusion API Ihre Anforderungen abdeckt. Die Entscheidung sollte auf dem konkreten Datenbedarf basieren, nicht auf Bequemlichkeit.
Wann die Fusion API ausreicht
- Sie benötigen nur grundlegende Geschäftsdaten (Name, Adresse, Telefon, Rating)
- Sie benötigen maximal 3 Bewertungen pro Geschäft
- Sie benötigen strukturierte, stabile JSON-Antworten ohne HTML-Parsing
- Ihr Datenvolumen liegt unter 5.000 Requests/Tag
Wann Web-Scraping gerechtfertigt ist
- Sie benötigen alle Bewertungen eines Geschäfts (nicht nur 3)
- Sie benötigen Bewertungstexte für NLP- oder Sentiment-Analyse
- Sie bauen ein umfassendes lokales Geschäftsdirectory auf
- Sie analysieren historische Bewertungstrends über viele Geschäfte hinweg
Ethische Richtlinien
- Respektieren Sie
robots.txt: Prüfen Sie https://www.yelp.com/robots.txt vor dem Scraping und halten Sie sich an die Disallow-Regeln. - Vermeiden Sie login-geschützte Inhalte: Scrapen Sie keine Daten, die eine Anmeldung erfordern — dies verstößt gegen die ToS und kann den CFAA verletzen.
- Personenbezogene Daten minimieren: Review-Autoren-Namen sind personenbezogene Daten unter der DSGVO. Speichern Sie nur das notwendige Minimum und anonymisieren Sie, wo möglich.
- Rate-Limits respektieren: Überlasten Sie die Server nicht. Halten Sie sich an vernünftige Pacing-Intervalle von 5–10 Sekunden.
- Daten nicht weiterverkaufen: Die kommerzielle Weitergabe von Yelp-Daten kann gegen die ToS verstoßen und rechtliche Konsequenzen nach sich ziehen.
Empfehlung: Wenn die Fusion API 80 % Ihrer Anforderungen abdeckt, nutzen Sie sie. Scraping sollte die Ausnahme sein, nicht die Regel. Weitere Informationen zu bewährten Scraping-Praktiken finden Sie in unserem Web-Scraping-Leitfaden.
Key Takeaways
- Öffentliche Yelp-Daten (Geschäftsprofile, Bewertungen, Kategorien) sind ohne Login zugänglich — die Fusion API liefert jedoch nur max. 3 Bewertungen pro Geschäft bei 5.000 Calls/Tag.
- PerimeterX/HUMAN ist die primäre Hürde:
_px3-Cookie, TLS-Fingerprinting (JA3-Hash) und CAPTCHAs nach 3–5 Datacenter-Requests. - Rotierende Residential Proxies mit US-Geo-Targeting (
-country-US-city-austin) sind unerlässlich für hohe IP-Reputation und lokal relevante Ergebnisse. - Sticky Sessions (
-session-abc123) sichern die Pagination-Kontinuität überreview_feed— wechseln Sie die Session-ID alle 20–30 Requests. - Rate-Limit-Pacing mit 5–10 Sekunden Jitter und rotierenden User-Agents minimiert Blockaden und Fingerprint-Risiko.
- Ethisches Scraping: Respektieren Sie
robots.txt, ToS und DSGVO. Bevorzugen Sie die Fusion API, wo möglich.
Bereit, Yelp-Daten zu extrahieren? Starten Sie mit ProxyHat Residential Proxies und testen Sie die Beispiele aus diesem Artikel. Für SERP-Tracking und andere Scraping-Anwendungsfälle siehe auch unsere SERP-Tracking-Lösungen.






