Yelp má napříč 8,4 milionu aktivních firemních profilů už 330 milionů nasbíraných recenzí — a dostat tahle data do použitelné podoby je dnes těžší než dřív. Tvrdý zásah Yelpu proti botům v letech 2024–2025 potichu rozbil většinu dosavadních Python návodů na scraping.
Pokud jste se v poslední době pokusili spustit Yelp scraper a narazili na zeď chyb 403, prázdných HTML odpovědí nebo CAPTCHA, které tam před půl rokem nebyly, není to jen váš pocit. Yelp dnes používá TLS/JA3 fingerprinting, rotující záměrně zamaskované CSS třídy a agresivní hodnocení reputace IP adres — takže starý přístup requests + BeautifulSoup, který pořád doporučuje každý druhý tutoriál, padne hned na první request. Strávil jsem týdny testováním různých postupů proti aktuální infrastruktuře Yelpu a tenhle průvodce pokrývá všechno, co v roce 2025 opravdu funguje: oficiální Fusion API (a proč samo o sobě pravděpodobně nestačí), kompletní Python workflow s vícevrstvou ochranou proti blokaci a také 2klikové no-code řešení s Thunderbit pro všechny, kdo chtějí data bez maratonu debugování.
Vyzkoušet Thunderbit pro scraping Yelpu
Proč scrapovat Yelp v Pythonu a kdo z toho opravdu těží
Než napíšete jediný řádek kódu, je dobré si ujasnit skutečný byznysový důvod. Yelp není jen recenzní web pro restaurace — je to v podstatě živá databáze místních firem se strukturovanými kontaktními údaji, hodnocením, kategoriemi, otevírací dobou a stovkami milionů zákaznických recenzí.

Nejvíc z toho těží tyto scénáře a datová pole:
| Případ použití | Klíčová data | Proč je to důležité |
|---|---|---|
| Prodej a lead generation | Název firmy, telefon, web, adresa, kategorie, hodnocení | Vytváření cílených seznamů lokálních SMB — 4 z 5 uživatelů Yelpu jsou připraveni nakupovat už při příchodu |
| Konkurence a intel | Recenze, hvězdičkové hodnocení, počet recenzí, sentiment | Sledování reputace konkurence, odhalování mezer ve službách, tracking trendů |
| Průzkum trhu a NLP | Plný text recenzí, data, metadata recenzentů | Sentiment analysis, topic modeling — recenze Yelpu patří mezi nejpoužívanější NLP korpusy ve výzkumu |
| Reality a výběr lokality | Hustota firem, mix kategorií, kvalita recenzí podle oblasti | Výběr lokality pro franšízy a retail — Yelp přesně pro to prodává Location Intelligence jako licencovaný B2B produkt |
| Ecommerce a provoz | Cenové signály, stížnosti zákazníků, provozní doba | Sledování, jak jsou konkurenti hodnoceni, a odhalování provozních vzorců |
Společný jmenovatel je jednoduchý: cílem jsou strukturovaná data a Python je jen jeden z prostředků, jak se k nim dostat. Někdo chce plnou programovou kontrolu. Jinému stačí tabulka s kontakty na instalatéry v Austinu. V tomhle článku najdete obě cesty.
Yelp Fusion API vs. Python web scraping: co je pro vás lepší?
Většina návodů tenhle krok úplně přeskočí a skočí rovnou do kódu, aniž by vůbec řešila, jestli by oficiální Yelp Fusion API (dnes přejmenované na "Yelp Places API") nestačilo. Podle mých zkušeností právě tahle úvaha ušetří hodiny zbytečné práce — protože API je skvělé na některé úlohy, ale na jiné je naprosto nedostatečné.
Co Fusion API skutečně nabízí
Fusion API poskytuje strukturované vyhledávání firem, detaily firem, autocomplete a endpoint pro recenze. Je autorizované, dobře zdokumentované a nevyžaduje anti-bot obezličky.
Jenže právě u recenzního endpointu se to láme. Tohle potvrdili sami zaměstnanci Yelpu na GitHubu:
"Yelp API nevrací plný text recenzí. Ve výchozím stavu jsou k dispozici tři úryvky recenzí po 160 znacích." — odpověď zaměstnance Yelpu, GitHub Issue #163
To není chyba — je to záměr. API je omezené na 3 úryvky recenzí (7 u Premium), každý přibližně na 160 znaků. Žádná metadata recenzí (užitečné/veselé/cool hlasy), žádná historie autora, žádné odpovědi provozovatele. A denní limit pro nové klienty po květnu 2023 klesl na 300–500 volání/den — z původních 5 000. Ceny začínají na $29/měsíc.
Rozhodovací rámec
| Faktor | Yelp Fusion API | Python scraping | Thunderbit (no-code) |
|---|---|---|---|
| Plné recenze | ❌ Jen 3 úryvky (~160 znaků každý) | ✅ Všechny recenze přes GraphQL | ✅ Všechny viditelné recenze |
| Limity | 300–500/den (nové); 5 000 (legacy) | Pod vaší správou (rozpočet na proxy) | Na kredity |
| Náročnost nastavení | ~15 min (API klíč + SDK) | Hodiny až dny | ~2 minuty |
| Firemní pole | ~20 strukturovaných polí | Neomezeně (HTML/JSON parsing) | Pole navržená AI |
| Anti-bot ochrana | N/A (autorizované) | Musíte vyřešit sami | Řešeno automaticky |
| Právní riziko | ✅ Autorizované | ⚠️ Šedá zóna ToS | ⚠️ Stejné jako scraping |
| Cena | od $29/měsíc | Zdarma (+ proxy náklady $0.75–$4/GB) | K dispozici free tier |
| Údržba | Nízká (API stabilní) | Vysoká (selectors se rozbíjejí, anti-bot sílí) | Nízká (AI se přizpůsobí) |
Použijte Fusion API, pokud: potřebujete základní firemní údaje, malé množství dotazů nebo autorizovanou integraci — a stačí vám 3 úryvky recenzí na firmu.
Použijte Python scraping, pokud: potřebujete plný text recenzí, všechny recenze k dané firmě, metadata recenzí, více než 240 výsledků na vyhledávání nebo máte rozpočet pod $29/měsíc.
Použijte Thunderbit, pokud: chcete data rychle bez psaní a správy kódu. Více o tom v no-code části níže.
No-code zkratka: scrapeujte Yelp s Thunderbit (bez Pythonu)
Než se pustíme do Pythonu, tady je nejrychlejší cesta pro každého, jehož skutečným cílem jsou data, ne programování. Každý konkurenční článek předpokládá, že umíte Python, ale z mé práce v Thunderbit vím, že velká část lidí hledajících „scrape Yelp“ jsou obchodníci, operations manažeři a majitelé malých firem, kteří prostě chtějí tabulku místních podniků — ne kurz TLS fingerprintingu.
Thunderbit už má připravené Yelp šablony:
- Yelp Business Web Scraper — extrahuje název firmy, hodnocení, kontaktní údaje, adresu, otevírací dobu a kategorii
- Yelp Review Scraper — extrahuje uživatelské jméno recenzenta, obsah recenze, hodnocení, datum a lokaci recenzenta
Jak to funguje v praxi
- Otevřete stránku s výsledky hledání na Yelp nebo stránku konkrétní firmy v Chromu
- Klikněte na AI Suggest Fields v rozšíření Thunderbit — AI si přečte stránku a navrhne sloupce (název firmy, hodnocení, počet recenzí, cenová úroveň, kategorie, adresa, telefon, URL)
- Klikněte na Scrape — hotovo
U předpřipravených Yelp šablon je to ještě jednodušší: otevřete šablonu a klikněte na Scrape.
Scraping podstránek zvládá enrichment automaticky — začnete na stránce výsledků Yelp, zapnete subpage scraping a Thunderbit postupně navštíví každou stránku firmy, aby vytáhl otevírací dobu, plné recenze, web, fotky i vybavení. Bez další konfigurace.
Stránkování je automatické — ať už jde o klikací nebo scrollovací variantu, vše funguje rovnou po instalaci. (Více o tom, jak to funguje, najdete v našem průvodci stránkováním.)
Exporty jsou zdarma ve všech tarifech — Excel, Google Sheets, Airtable, Notion, CSV, JSON. Žádný pandas, žádný kód na zápis CSV.
Porovnání času
| Čas | Python scraper | Thunderbit |
|---|---|---|
| První spuštění | Hodiny až dny (selectors, stránkování, proxy, retry logika) | ~30 sekund s připravenou Yelp šablonou |
| Když Yelp změní markup | Ručně přepsat selektory | Znovu kliknout na AI Suggest Fields — automatická adaptace |
| Když vám zablokují IP | Debug, rotace proxy poolů, znovutestování | Cloud režim řeší rotaci IP za vás |
| Export do Google Sheets | Napsat OAuth + pandas propojení | Jedno kliknutí, zdarma |
Když Thunderbit vyzkoušíte nejdřív a zjistíte, že vám stačí, můžete zbytek článku přeskočit. Pokud potřebujete plnou programovou kontrolu, vlastní pole nebo škálování nad několik tisíc záznamů měsíčně — čtěte dál.
Python knihovny pro scraping Yelpu: kterou vybrat
"Mám použít Scrapy, BS4+requests, nebo Selenium?" je jedna z nejčastějších otázek v diskusích na r/webscraping kolem Yelpu. A přesto si každý tutoriál vybere svou oblíbenou knihovnu a jde dál, aniž by vysvětlil proč. Tady je poctivé rozebrání.
Realita roku 2025: requests + BeautifulSoup je na Yelp rozbitý
Stack, který doporučuje každý klasický návod na Yelp — pip install requests beautifulsoup4 — vás v roce 2025 zablokuje už při prvním requestu. Ne při padesátém. Při prvním.
Důvod: knihovna requests v Pythonu posílá TLS/JA3 fingerprint, který neodpovídá žádnému skutečnému prohlížeči. Yelpova anti-bot vrstva to odhalí už na úrovni TLS handshaku, ještě než se vůbec přečte User-Agent header. Testoval jsem to opakovaně — nová IP, realistické hlavičky, náhodné prodlevy — a stejně jsem hned dostal 403 Forbidden s obyčejným requests.
Matice rozhodnutí mezi knihovnami
| Knihovna | Nejlepší pro | Zvládá JS? | Anti-bot? | Náročnost učení | Rychlost |
|---|---|---|---|---|---|
requests + BeautifulSoup | ❌ | ❌ | Velmi nízká | Rychlá (dokud nejste zablokováni) | |
httpx async + parsel | Velkoplošný async scraping | ❌ | ❌ | Nízká | Velmi rychlá |
curl_cffi + parsel | Specificky pro Yelp: TLS impersonation | ❌ | ✅ TLS/JA3/HTTP2 | Nízká | Velmi rychlá |
Scrapy 2.14 | Kompletní crawl pipeline se stránkováním | Částečně (přes scrapy-playwright) | AutoThrottle, retry middleware | Střední až vysoká | Rychlá |
Selenium 4.43 / Playwright 1.58 | Stránky náročné na JS, obejití CAPTCHA | ✅ | Částečně | Střední | Pomalá (~10–30 stránek/min) |
| Thunderbit | Pro neprogramátory, rychlá extrakce | ✅ (v prohlížeči) | Vestavěné (Cloud režim) | Velmi nízká | Rychlá |
Zlomový objev: curl_cffi
Knihovna, která mi úplně změnila workflow pro scraping Yelpu, je curl_cffi — Python binding pro curl-impersonate. Vytváří naprosto stejný TLS/JA3 + HTTP/2 fingerprint jako skutečný Chrome, a její API je prakticky drop-in náhradou za requests:
from curl_cffi import requests
r = requests.get(
"https://www.yelp.com/biz/some-restaurant",
impersonate="chrome131",
)
print(r.status_code, len(r.text))
Tahleta jediná změna — from curl_cffi import requests plus impersonate="chrome131" — obejde největší anti-bot vrstvu Yelpu bez nutnosti spouštět prohlížeč. V mých testech je to rozdíl mezi okamžitou 403 a čistou odpovědí 200.
Doporučený stack pro Yelp v roce 2025: curl_cffi + parsel + jmespath + rezidenční proxy. Pokud potřebujete kompletní crawl pipeline se schedulingem, zabalte to do Scrapy 2.14 s downloader middleware postaveným na curl_cffi.
Nastavení Python prostředí pro scraping Yelpu
- Obtížnost: střední
- Časová náročnost: ~15 minut na setup, 1–2 hodiny na funkční scraper
- Co budete potřebovat: Python 3.10+ (doporučeno 3.12), terminál a volitelně poskytovatele rezidenčních proxy
Krok 1: Vytvořte virtuální prostředí a nainstalujte balíčky
python3.12 -m venv .venv
source .venv/bin/activate # Ve Windows: .venv\Scripts\activate
pip install "curl_cffi>=0.11" "parsel>=1.9" "jmespath>=1.0" pandas
Co jednotlivé balíčky dělají:
curl_cffi— posílá HTTP requesty s Chrome TLS fingerprintem (obejití anti-botu)parsel— CSS/XPath selektory pro parsing HTML (stejný engine jako Scrapy, ale lehčí)jmespath— deklarativní dotazování nad JSON (čistší než vnořené přístupy do dictů u embedded JSON od Yelpu)pandas— export dat do CSV/Excelu
Volitelné, ale užitečné:
pip install fake-useragent # Pozn.: repozitář byl archivován v dubnu 2026, ale stále jde nainstalovat
Krok za krokem: jak scrapovat Yelp v Pythonu
Tady začíná hlavní tutoriál. Klíčová myšlenka, která celé řešení dělá mnohem odolnějším: vynechte CSS selektory a vytahujte skrytý JSON. Yelp náhodně mění názvy CSS tříd při každém buildu (y-css-14xwok2 jeden týden, y-css-hcq7b9 další), takže scraper připoutaný k těmto selektorům se během pár týdnů rozpadne. Embedded JSON payloady — application/ld+json schema i react-root-props — jsou stabilní.
Krok 2: Scrapujte výsledky vyhledávání na Yelpu
URL výsledků hledání na Yelpu mají předvídatelný tvar: https://www.yelp.com/search?find_desc={term}&find_loc={location}. Data z výsledků jsou vložená v tagu <script data-id="react-root-props"> jako JSON — ne jako něco vykresleného v moři CSS tříd.
import re, json, jmespath
from curl_cffi import requests
from parsel import Selector
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": "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",
"cookie": "intl_splash=false",
}
def scrape_search(term: str, location: str, max_pages: int = 3):
results = []
for page in range(max_pages):
url = (f"https://www.yelp.com/search?"
f"find_desc={term}&find_loc={location}&start={page * 10}")
r = requests.get(url, headers=HEADERS, impersonate="chrome131")
if r.status_code != 200:
print(f"Blokováno na stránce {page}: {r.status_code}")
break
sel = Selector(text=r.text)
script = sel.xpath(
"//script[@data-id='react-root-props']/text()"
).get() or ""
m = re.search(r"react_root_props\s*=\s*(\{.*?\});", script, re.S)
if not m:
print(f"Na stránce {page} se nenašlo react-root-props — možný soft block")
break
data = json.loads(m.group(1))
businesses = jmespath.search(
"legacyProps.searchAppProps.searchPageProps"
".mainContentComponentsListProps"
"[?searchResultBusiness].searchResultBusiness.{"
"name: name, url: businessUrl, rating: rating, "
"reviews: reviewCount, phone: phone, "
"neighborhoods: neighborhoods}",
data,
) or []
results.extend(businesses)
import time, random
time.sleep(random.uniform(3, 7))
return results
Měli byste dostat seznam dictů s názvy firem, URL, hodnocením a počtem recenzí. Pokud react-root-props v odpovědi chybí, dostali jste blokovací shell — otočte IP a zkuste to znovu.
Header Cookie: intl_splash=false je běžný workaround pro country-splash redirect Yelpu. Bez něj neamerické IP adresy často narazí na splash stránku, která vypadá jako soft block, ale ve skutečnosti jím není.
Krok 3: Scrapujte stránky firem na Yelpu
Každé URL firmy z výsledků vede na detailní stránku s bohatšími daty. Nejstabilnější cíl pro extrakci je blok <script type="application/ld+json"> — obsahuje strukturovaná data schema.org, která Yelp drží kvůli SEO a neobfuská.
def scrape_business(biz_url: str) -> dict:
url = f"https://www.yelp.com{biz_url}" if biz_url.startswith("/") else biz_url
r = requests.get(url, headers=HEADERS, impersonate="chrome131")
if r.status_code != 200:
return {"url": url, "error": r.status_code}
sel = Selector(text=r.text)
biz_id = sel.css('meta[name="yelp-biz-id"]::attr(content)').get()
for raw in sel.css('script[type="application/ld+json"]::text').getall():
try:
data = json.loads(raw)
except json.JSONDecodeError:
continue
for node in (data if isinstance(data, list) else [data]):
if node.get("@type") in (
"Restaurant", "LocalBusiness", "FoodEstablishment",
"HealthAndBeautyBusiness", "HomeAndConstructionBusiness",
):
return {
"biz_id": biz_id,
"name": node.get("name"),
"rating": (node.get("aggregateRating") or {}).get("ratingValue"),
"review_count": (node.get("aggregateRating") or {}).get("reviewCount"),
"address": node.get("address"),
"telephone": node.get("telephone"),
"price_range": node.get("priceRange"),
"hours": node.get("openingHours"),
"url": url,
}
return {"biz_id": biz_id, "url": url}
Hodnota meta[name="yelp-biz-id"] je zakódované ID firmy, které budete potřebovat pro endpoint s recenzemi. Získejte ji tady — v dalším kroku se vám bude hodit.
Krok 4: Scrapujte recenze Yelpu se stránkováním
Tady Fusion API zaostává a scraping naopak vyniká. Yelpův interní GraphQL batch endpoint vrací plný text recenzí, informace o recenzentech, data, hodnocení a počty hlasů — všechno, co API zadržuje.
Endpoint je https://www.yelp.com/gql/batch a používá statický documentId pro operaci GetBusinessReviewFeed. Stránkování funguje přes cursor zakódovaný v base64.
import base64
GQL_URL = "https://www.yelp.com/gql/batch"
DOC_ID = "ef51f33d1b0eccc958dddbf6cde15739c48b34637a00ebe316441031d4bf7681"
def fetch_reviews(enc_biz_id: str, num_pages: int = 5):
all_reviews = []
for page in range(num_pages):
offset = page * 10
cursor = base64.b64encode(
json.dumps({"version": 1, "offset": offset}).encode()
).decode()
payload = [{
"operationName": "GetBusinessReviewFeed",
"variables": {
"encBizId": enc_biz_id,
"reviewsPerPage": 10,
"after": cursor,
"sortBy": "DATE_DESC",
"language": "en",
},
"extensions": {
"operationType": "query",
"documentId": DOC_ID,
},
}]
r = requests.post(
GQL_URL,
json=payload,
headers={
**HEADERS,
"content-type": "application/json",
"x-apollo-operation-name": "GetBusinessReviewFeed",
"apollographql-client-name": "yelp-main-frontend",
},
impersonate="chrome131",
)
if r.status_code != 200:
print(f"Na offsetu {offset} selhalo načtení recenzí: {r.status_code}")
break
data = r.json()
# Navigace strukturou odpovědi pro získání recenzí
try:
reviews = data[0]["data"]["business"]["reviews"]["edges"]
for edge in reviews:
node = edge.get("node", {})
all_reviews.append({
"reviewer": node.get("author", {}).get("displayName"),
"rating": node.get("rating"),
"date": node.get("localizedDate"),
"text": node.get("text", {}).get("full"),
})
except (KeyError, IndexError, TypeError):
break
import time, random
time.sleep(random.uniform(3, 7))
return all_reviews
Každá stránka vrací 10 recenzí. Pro stránkování zvyšujte offset v base64 cursoru. Parametr sortBy přijímá DATE_DESC (nejnovější první), RATING_ASC, RATING_DESC a další.
Krok 5: Exportujte data z Yelpu
import pandas as pd
# Předpokládejme, že už máte businesses a reviews
df_businesses = pd.DataFrame(businesses)
df_businesses.to_csv("yelp_businesses.csv", index=False)
df_reviews = pd.DataFrame(all_reviews)
df_reviews.to_csv("yelp_reviews.csv", index=False)
# Nebo uložte do JSON pro větší flexibilitu
import json
with open("yelp_data.json", "w") as f:
json.dump({"businesses": businesses, "reviews": all_reviews}, f, indent=2)
Pro čtenáře, kteří jdou no-code cestou, Thunderbit exportuje stejná data přímo do Excelu, Google Sheets, Airtable nebo Notion — bez pandas a bez kódu na zápis souborů.
Anti-blocking strategie: jak scrapovat Yelp bez blokace
Tahle část je vlastně důvod, proč tenhle článek existuje. Ochrana Yelpu proti botům je od konce roku 2024 výrazně tvrdší — TLS fingerprinting, kontrola reputace IP, CAPTCHA a behaviorální analýza jsou všechno součástí hry. Většina starších návodů je zastaralá, protože vznikla ještě před tímto zpřísněním.

Strategie je vrstvená. Každá vrstva snižuje míru blokací; dohromady z toho vznikne použitelný a dlouhodobě udržitelný scraping.
Vrstva 1: realistické request hlavičky
Výchozí hlavičky Python requests posílají User-Agent: python-requests/2.x — a to je okamžitě blokované. Jenže ani realistický User-Agent sám o sobě nestačí. Yelp kontroluje celý set Client Hints hlaviček a jejich konzistenci.
FULL_HEADERS = {
"authority": "www.yelp.com",
"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": "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",
"sec-ch-ua": '"Chromium";v="124", "Google Chrome";v="124", "Not-A.Brand";v="99"',
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": '"Windows"',
"sec-fetch-dest": "document",
"sec-fetch-mode": "navigate",
"sec-fetch-site": "same-origin",
"sec-fetch-user": "?1",
"upgrade-insecure-requests": "1",
"referer": "https://www.yelp.com/",
"cookie": "intl_splash=false",
}
Tři chyby, kvůli kterým vás systém označí:
- UA tvrdí, že jde o Chrome, ale
sec-ch-uachybí nebo odporuje verzi UA sec-ch-ua-platformříká "Windows", ale UA string uvádí macOS- Stejný User-Agent pro tisíce requestů z jedné IP — používejte pool 10–20 čerstvých Chrome/Firefox/Safari stringů
Vrstva 2: rate limiting a náhodné prodlevy
Předvídatelné časování je varovný signál. Přidejte náhodné pauzy a při chybách použijte exponenciální backoff.
import random, time
def polite_get(client_get, url, attempt=0):
r = client_get(url, headers=FULL_HEADERS, impersonate="chrome131")
if r.status_code in (403, 429, 503):
if attempt >= 4:
raise RuntimeError(f"Blokováno po {attempt + 1} pokusech na {url}")
backoff = 2 ** (attempt + 1) + random.random()
print(f" Získáno {r.status_code}, čekám {backoff:.1f}s (pokusu {attempt + 1})")
time.sleep(backoff)
return polite_get(client_get, url, attempt + 1)
time.sleep(random.uniform(3, 7))
return r
| Parametr | Doporučená hodnota |
|---|---|
| Náhodná pauza mezi requesty | random.uniform(3, 7) sekund |
| Backoff při 429/403/503 | 2 → 4 → 8 → 16 s, max. 5 pokusů |
| Současní workeři na jednu IP | 1 (serializovat na IP; pro paralelismus použít proxy) |
| Maximální udržitelná rychlost na jednu rezidenční IP | ~1 request / 5 s (~12 rpm) |
Vrstva 3: rotace User-Agentů a session
Rotujte mezi sadou reálných browser User-Agentů. Udržujte sessions a cookies, aby to vypadalo jako skutečné prohlížení — Yelp využívá detekci přes cookies, takže vytvářet novou session pro každý request je samo o sobě podezřelé.
UA_POOL = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/124.0.0.0 Safari/537.36",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 14_4_1) AppleWebKit/537.36 Chrome/124.0.0.0 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:125.0) Gecko/20100101 Firefox/125.0",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 14.4; rv:125.0) Gecko/20100101 Firefox/125.0",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 14_4_1) AppleWebKit/605.1.15 Safari/17.4.1",
# Přidejte dalších 5–10 aktuálních stringů
]
Vrstva 4: rotace proxy
Při jakémkoli reálném objemu potřebujete rezidenční proxy. Datacenter ani free proxy na Yelpu nefungují — IP reputační vrstva Yelpu preventivně vrací 403 pro rozsahy AWS, GCP a DigitalOcean.
| Poskytovatel | Startovní cena za GB | Poznámky |
|---|---|---|
| IPRoyal | $1.75/GB | Nejlevnější; provozuje nejcitovanější Yelp návod |
| Decodo (dříve Smartproxy) | $3.20–$3.50 | Nejlepší poměr GB/cena při vyšším objemu |
| Bright Data | $4.00 (PAYG) | Pool přes 150M IP; dedikovaná stránka pro Yelp proxy |
| Oxylabs | $6.00–$8.00 | Prémiové; 10M+ IP |
| Aluvia (mobile SIM) | $3.00 | Skutečné mobilní IP amerických operátorů, cílené na Yelp |
Rotující rezidenční proxy (nová IP pro každý request) fungují nejlépe pro velké crawly výsledků. Sticky sessions (jedna IP po dobu 10 minut) jsou lepší, když chcete zachovat cookies napříč flow stránka firmy → recenze → stránkování.
Vrstva 5: detekce a ošetření blokací
Ne každá blokace vypadá stejně. Yelp často podstrčí generický shell „page not available“ místo CAPTCHA, takže naivní scrapery si myslí, že dostaly data, i když ve skutečnosti dostaly prázdnou odpověď.
BLOCK_MARKERS = (
"captcha", "px-captcha", "page not available",
"access denied", "unusual traffic",
)
def is_blocked(resp):
if resp.status_code in (401, 403, 429, 503):
return True
body = resp.text.lower()
if any(m in body for m in BLOCK_MARKERS):
return True
# Pokud jde o search/business page a chybí react-root-props,
# Yelp poslal ořezanou blokovací odpověď
if "react-root-props" not in body and "/biz/" in str(resp.url):
return True
return False
| Signál | Význam |
|---|---|
| HTTP 403 | Tvrdý blok — IP/hlavičky/TLS jsou spálené |
| HTTP 429 | Rate limit — často se dá zachránit backoffem |
| HTTP 503 | Obecný blok nebo load shedding |
Redirect na /error nebo tělo „page not available“ | Soft block |
| Prázdný jen se | Challenge page čekající na JS |
captcha / g-recaptcha / px-captcha v těle | Eskalace — vyžaduje se CAPTCHA |
Chybějící react-root-props na listing page | Ořezaná blokovací odpověď |
Vrstva 6: odolný parsing — skrytý JSON místo CSS selektorů
Je dobré to zopakovat: Yelp náhodně mění názvy CSS tříd při každém buildu. Scraper připoutaný k h3.y-css-14xwok2 se rozbije během pár týdnů, jakmile Yelp nasadí h3.y-css-hcq7b9.
Payloady, které se nemění:
<script type="application/ld+json">— strukturovaná data schema.org (název, adresa, telefon, hodnocení, otevírací doba)<script data-id="react-root-props">— kompletní data výsledků vyhledávání jako JSONhttps://www.yelp.com/gql/batch— GraphQL endpoint pro recenze se stabilnímdocumentId
Pokud parsujete CSS třídy, stavíte na písku. Parsujte raději JSON.
Vrstva 7: fallback přes stealth browser
Na headless browser přepínejte jen tehdy, když curl_cffi + rezidenční proxy neprojdou — typicky když Yelp vrátí JavaScript challenge page nebo CAPTCHA.
Pro 95 % scraping úloh pro firmy / vyhledávání / recenze je curl_cffi + skrytý JSON + rezidenční proxy rychlejší, levnější a spolehlivější než browser. Ale když browser opravdu potřebujete:
| Nástroj | Stav (2025) | Poznámky |
|---|---|---|
| rebrowser-playwright | Doporučený start | Upravovaný Playwright s fixem CDP leaků |
| nodriver | Špička pro stealth v Chromu | Nástupce undetected-chromedriver; obchází WebDriver protokol |
| patchright | Aktivně udržovaný fork Playwrightu | Prochází moderní detekční testy |
| playwright-stealth | Osvědčený | Patching navigator.webdriver, odstranění HeadlessChrome z UA |
Pro Yelp vynechte obyčejné Selenium. Je příliš snadno fingerprintovatelné.
Yelp Fusion API vs. Python scraping vs. Thunderbit: kompletní srovnání
| Dimenze | Yelp Fusion API | Python scraping | Thunderbit |
|---|---|---|---|
| Plný text recenzí | ❌ 3 úryvky × ~160 znaků | ✅ Neomezeně (GraphQL) | ✅ Vestavěná šablona pro recenze |
| Metadata recenzí (hlasy, odpovědi provozovatele) | ❌ | ✅ | ✅ Přes pole navržená AI |
| Fotky | ❌ (0 na Base) | ✅ Neomezeně | ✅ |
| Maximum výsledků na vyhledávání | 240 (před 2024 to bylo 1 000) | Neomezeně (s paginací) | Neomezeně |
| Denní limit | 300–500 (nové) / 5 000 (legacy) | Jen rozpočet na proxy | Na kredity (3 000/měsíc na Pro) |
| Náročnost nastavení | ~15 min | Hodiny až dny | ~2 minuty |
| Anti-bot ochrana | N/A | Váš problém | Řešeno (Cloud režim) |
| Právní riziko | Nízké (autorizované) | Střední (šedá zóna ToS) | Střední (stejné jako scraping) |
| Cena (start) | od $29/měsíc | ~ $0.75–$4/GB proxy + čas vývoje | Free tier |
| Cena při větším objemu | $643+/měsíc | $50–$500/měsíc za proxy + čas vývoje | $38–$49/měsíc |
| Export dat | JSON | CSV/JSON (musíte napsat sami) | Excel / Sheets / Airtable / Notion — zdarma |
| Údržba | Nízká | Vysoká (selectors se rozbíjejí, anti-bot sílí) | Nízká (AI se přizpůsobí) |
Právní a etické tipy pro scraping Yelpu
Nejsem právník a tohle není právní poradenství. Ale právní situace se za poslední dva roky změnila natolik, že byste měli znát základní rámec, než investujete čas do projektu na scraping Yelpu.
Co říkají podmínky Yelpu: Aktualizace ToS z října 2025 výslovně zakazuje používat „jakéhokoli robota, pavouka... nebo jiné automatizované zařízení“ k „přístupu, získávání, kopírování, scrapování nebo indexování jakékoli části služby“. Přibylo také znění o „AI Technologies a/nebo jiných automatizovaných nástrojích“.
Podpora Yelpu opakuje: „Yelp nepovoluje žádné scrapování svého webu.“
Co říká robots.txt: robots.txt Yelpu má wildcard User-agent: * / Disallow: / a výslovně blokuje GPTBot, ClaudeBot, PerplexityBot, CCBot a Meta-ExternalAgent. Povoleni jsou jen Googlebot, Bingbot a několik crawlerů sociálních sítí.
Relevantní právní precedens: V případu Meta v. Bright Data (N.D. Cal., leden 2024) soud rozhodl, že scraping veřejně dostupných dat bez přihlášení neporušuje podmínky Meta. Klíčové rozlišení je: veřejná data bez přihlášení vs. data po přihlášení. Případ hiQ v. LinkedIn ukázal, že scraping veřejných dat pravděpodobně neporušuje CFAA, ale hiQ přesto prohrál na státních deliktech (trespass to chattels, misappropriation) a dostal rozsudek na $500 000.
Praktická doporučení:
- Scrapujte jen veřejně dostupné stránky bez přihlášení
- Omezujte tempo requestů (prodlevy v tomhle návodu zároveň fungují jako etické rate limity)
- Nepřeprodávejte syrové texty recenzí připsané konkrétním uživatelům — respektujte soukromí recenzentů
- Dodržujte místní zákony o ochraně dat (CCPA, GDPR)
- Nepřihlašujte se kvůli scrapingu — to už překračuje hranici autorizace
- Informace o firmě (název/adresa/telefon/hodnocení) berte jako veřejná faktická data; text recenzí jako citlivější obsah
Pro konkrétní situaci se poraďte s právníkem.
Závěr
Tři cesty, jeden cíl.
Yelp Fusion API je autorizovaná a nenáročná varianta — ale končí na 3 úryvcích recenzí a začíná na $29 měsíčně. Python scraping vám dá plnou kontrolu nad každým datovým bodem na Yelpu, ale vyžaduje reálnou investici: curl_cffi pro TLS impersonation, rezidenční proxy, náhodné prodlevy, parsing skrytého JSON a průběžnou údržbu, jakmile se obrana Yelpu dál vyvíjí. Thunderbit vás dostane od „potřebuji data z Yelpu“ k „tady je moje tabulka“ zhruba za 30 sekund, bez kódu a bez nastavování proxy.
Anti-blocking postupy, které v roce 2025 skutečně fungují: realistické hlavičky s plným Client Hints, curl_cffi pro impersonaci TLS fingerprintu, náhodné prodlevy s exponenciálním backoffem, rotace rezidenčních proxy a — hlavně — parsování skrytého JSON (application/ld+json a react-root-props) místo křehkých CSS selektorů.
Nevíte, která cesta je pro vás? Nejprve zkuste free tier Thunderbit. Pokud vám stačí, ušetřili jste si hodiny práce. Pokud potřebujete víc kontroly — plné programové pipeline, vlastní pole, úzkou integraci s CRM — výše uvedený Python návod vám pokryje záda. A pokud chcete hlubší pohled na krajinu scraping nástrojů, podívejte se na náš přehled nejlepších Chrome rozšíření pro web scraping nebo na průvodce extrakcí dat z webu do Excelu.
Vyzkoušejte Thunderbit pro extrakci dat z Yelpu Get Started Free
Často kladené otázky
Dá se Yelp zdarma scrapovat v Pythonu?
Ano — pomocí bezplatných knihoven jako curl_cffi, parsel a jmespath. Ale při větším objemu (víc než pár desítek stránek) budete potřebovat placené rezidenční proxy, které začínají zhruba na IPRoyal za $1.75/GB. Thunderbit navíc nabízí free tier s 6 stránkami měsíčně pro rychlou no-code extrakci.
Blokuje Yelp scrapery?
Ano, a dost agresivně. Yelp používá TLS/JA3 fingerprinting, hodnocení reputace IP, CAPTCHA, behaviorální analýzu a rotující zamaskované CSS třídy. Obyčejný requests je blokovaný hned na první pokus. Vrstvená anti-blocking strategie z tohohle průvodce — curl_cffi pro TLS impersonation, realistické hlavičky, náhodné prodlevy a rezidenční proxy — je to, co v roce 2025 funguje.
Je Yelp Fusion API lepší než scraping?
Záleží na vašich potřebách. API je autorizované a s nižším rizikem, ale vrací jen 3 úryvky recenzí po přibližně 160 znacích, omezuje výsledky hledání na 240 a začíná na $29 měsíčně. Pokud potřebujete plný text recenzí, metadata recenzí nebo víc než pár stovek záznamů denně, scraping je jediná cesta.
Jak scrapovat recenze z Yelpu v Pythonu?
Použijte curl_cffi s impersonate="chrome131" pro načtení stránky firmy, z <meta name="yelp-biz-id"> vytáhněte zakódované ID firmy a pak pošlete POST na https://www.yelp.com/gql/batch s operací GetBusinessReviewFeed a stránkujte přes base64-enkódovaný after cursor. Krok za krokem kód je v tutoriálu výše. Dobrou referencí je také repo Scrapfly Yelp scraper.
Dá se Yelp scrapovat i bez kódování?
Ano — Thunderbit AI Web Scraper má předpřipravené šablony pro Yelp business i review. Otevřete stránku Yelpu, klikněte na AI Suggest Fields a potom na Scrape. Export do Google Sheets, Excelu, Airtable a Notion je zdarma ve všech tarifech, včetně free plánu.
Více informací


