Yasal Uyarı: Bu rehber yalnızca herkese açık veriye erişim içindir. Yelp'in Kullanım Şartları otomatik veri toplamayı yasaklar. ABD'de Computer Fraud and Abuse Act (CFAA) ve AB'de GDPR gibi yürürlükteki yasaları dikkate alın. Kişisel veri toplamadan önce GDPR uyumluluğu için hukuki danışmanlık alın. Mümkün olduğunda resmi Yelp Fusion API'yi kullanın.
Yelp İşletme Verisi Scrape Nedir ve Neden Önemlidir?
Yelp, dünya çapında milyonlarca işletme için zengin bir yerel-işletme veritabanıdır. 2026 itibarıyla platform, ~200 milyon küresel ziyaretçi çekmekte ve herkese açık işletme profilleri değerli bir veri kaynağı sunmaktadır. Yelp scrape işlemi, bu herkese açık profillerden işletme adı, adres, telefon, kategori, çalışma saatleri, puan ve yorum metinlerini programatik olarak toplamayı ifade eder.
Yerel-işletme veri setleri oluşturan geliştiriciler için Yelp, rakipsiz derinliğe sahiptir. Ancak iki temel engel vardır: (1) resmi Fusion API her işletme için yalnızca 3 yorum döndürür ve günlük 5000 istek limiti uygular; (2) Yelp, PerimeterX/HUMAN tarafından korunan agresif anti-bot savunması kullanır. Bu rehber, her iki engeli de aşmak için üretim düzeyinde stratejiler sunar.
Yelp'de Herkese Açık Veri vs. Login-Walled Veri
Yelp işletme profilleri /biz/<slug> URL'lerinde login gerektirmeden erişilebilir. Aşağıdaki alanlar herkese açıktır:
- İşletme adı ve id (slug)
- Adres, telefon, web sitesi
- Kategoriler (örn. "Italian", "Restaurants")
- Çalışma saatleri (haftalık tablo)
- Puan (1-5 yıldız) ve değerlendirme sayısı
- Yorum metinleri (herkese açık yorumlar)
- Fotoğraflar (işletme ve kullanıcı yüklemeleri)
Login gerektiren içerik şunları içerir: arkadaş yorumları, filtrelenmiş/gizli yorumlar, kullanıcı profil sayfaları ve mesajlaşma. Bu rehber yalnızca login gerektirmeyen herkese açık veriyi hedefler.
Fusion API'nin 3-Yorum Sınırı
Yelp Fusion API, resmi erişim yoludur ve ücretsiz tier'da günlük 5000 istek sunar. Ancak resmi dokümantasyon göre /reviews endpoint'i her işletme için maksimum 3 yorum döndürür. Bir işletmenin 500 yorumu varsa, Fusion API ile yalnızca 3 tanesine erişebilirsiniz. Tüm yorumları toplamak için sayfa scrape'i gerekir.
| Veri Alanı | Fusion API | Scrape (Public HTML) |
|---|---|---|
| İşletme adı, adres, telefon | ✓ Sınırsız | ✓ |
| Puan, kategori, saatler | ✓ | ✓ |
| Yorum metni | ✗ 3 yorum limiti | ✓ Tüm yorumlar |
| Günlük istek limiti | 5,000/gün | Yok (proxy'e bağlı) |
| ToS uyumu | ✓ Resmi | ✗ ToS ihlali |
Yelp Anti-Bot Savunması: PerimeterX/HUMAN
Yelp, HUMAN Security (eski adıyla PerimeterX) tarafından korunur. Bu sistem üç ana savunma katmanı kullanır:
1. _px3 Çerezi ve Sensor Challenge
PerimeterX, her ziyaretçiye bir _px3 çerezi atar. Bu çerez, tarayıcı fingerprint verilerini (canvas hash, WebGL renderer, font listesi, ekran çözünürlüğü) içeren şifrelenmiş bir sensor data payload'ından üretilir. Plain HTTP isteği gönderdiğinizde sensor data eksik olur ve _px3 çerezi reddedilir — sonuçta 403 veya CAPTCHA sayfası.
2. TLS Fingerprinting (JA3/JA4)
PerimeterX, TLS handshake sırasında ClientHello paketini analiz eder. Python requests kütüphanesi, JA3 fingerprint'i ile gerçek bir Chrome tarayıcısından farklıdır. Bu mismatch, bot tespiti için güçlü bir sinyaldir. curl-impersonate veya tls-client gibi kütüphaneler JA3 fingerprint'i taklit edebilir.
3. IP Reputation Scoring
Datacenter IP'leri (AWS, DigitalOcean, OVH), PerimeterX'in IP reputation veritabanında düşük puana sahiptir. Tipik olarak 5-15 datacenter isteği sonrası CAPTCHA tetiklenir. Residential IP'ler ise yüksek puana sahiptir ve binlerce istek yapılabilir.
Pratik gözlem: Datacenter proxy ile Yelp'e yapılan ilk 10 istek başarılı olabilir, ama 11. istekte PerimeterX CAPTCHA sayfası döner. Residential proxy ile aynı hacim 100x-500x'e kadar çıkabilir.
Neden Residential Proxy ve US Geo-Targeting Gerekli?
Yelp, yerel-işletme platformudur ve sonuçlar coğrafi konuma göre değişir. Austin, TX'de bir kafe ararken IP'niz Almanya'dan çıkıyorsa, sonuç seti farklı olur. US residential proxy iki sorunu çözer:
- IP reputation: Residential IP'ler PerimeterX için yüksek trust score'a sahiptir.
- Geo-doğruluk:
-country-US-city-austinile Austin yerel sonuçlarını alırsınız.
ProxyHat residential proxy'leri, US şehir düzeyinde geo-targeting sunar. ProxyHat lokasyonları sayfasından mevcut ülkeleri ve şehirleri kontrol edebilirsiniz.
ProxyHat ile Yelp Scrape: Python Örneği
Aşağıdaki örnek, ProxyHat residential proxy üzerinden Yelp işletme sayfasını çeker ve gömülü __INITIAL_STATE__ JSON blob'ını ayrıştırır. Bu blob, sayfanın tüm işletme verisini ve ilk sayfa yorumlarını içerir.
import requests
import json
import re
import time
import random
# ProxyHat residential proxy - US geo-targeting
proxy_url = "http://user-country-US-city-austin-session-yelp01:PASSWORD@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",
"Upgrade-Insecure-Requests": "1",
}
biz_slug = "uchi-austin"
url = f"https://www.yelp.com/biz/{biz_slug}"
response = requests.get(url, proxies=proxies, headers=headers, timeout=30)
if response.status_code == 200:
html = response.text
# __INITIAL_STATE__ blob'unu bul
match = re.search(r'<script[^>]*>.*?__INITIAL_STATE__\s*=\s*({.*?})\s*;.*?</script>',
html, re.DOTALL)
if match:
state_json = json.loads(match.group(1))
# İşletme bilgilerini çıkar
biz = state_json.get("biz", {})
print(f"İşletme: {biz.get('name')}")
print(f"Puan: {biz.get('rating')}")
print(f"Değerlendirme: {biz.get('reviewCount')}")
# İlk yorumu çıkar (truncated)
reviews = biz.get("reviews", [])
if reviews:
r = reviews[0]
print(f"Yorum yazarı: {r.get('user', {}).get('displayName', 'N/A')}")
print(f"Puan: {r.get('rating')}")
text = r.get('comment', {}).get('text', '')[:200]
print(f"Metin: {text}...")
else:
print("__INITIAL_STATE__ bulunamadı")
else:
print(f"HTTP {response.status_code} - muhtemelen PerimeterX bloğu")
# Rate-limit pacing: istekler arası 2-5 saniye
time.sleep(random.uniform(2, 5))
Bu örnekte dikkat edilecek noktalar:
- Sticky session:
-session-yelp01flag'i aynı IP'yi korur. Yelp, aynı IP'den gelen sequential istekleri normal kullanıcı davranışı olarak değerlendirir. - City targeting:
-city-austinAustin yerel işletmelerini doğru sıralar. - Rate pacing: İstekler arası 2-5 saniye rastgele bekleme, bot tespitini zorlaştırır.
review_feed JSON Endpoint'i
Yorum sayfalaması için Yelp, /biz/<slug>/review_feed endpoint'ini kullanır. Bu endpoint, AJAX ile yüklenen ek yorumları JSON olarak döndürür.
import requests
import time
proxy_url = "http://user-country-US-city-austin-session-yelp01:PASSWORD@gate.proxyhat.com:8080"
proxies = {"http": proxy_url, "https": proxy_url}
review_feed_url = "https://www.yelp.com/biz/uchi-austin/review_feed"
params = {
"rl": "en",
"sort_by": "relevance_desc",
"start": "0", # Pagination offset
"limit": "20",
}
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",
"Referer": "https://www.yelp.com/biz/uchi-austin",
"Accept": "application/json",
}
response = requests.get(review_feed_url, proxies=proxies,
headers=headers, params=params, timeout=30)
if response.status_code == 200:
data = response.json()
reviews = data.get("reviews", [])
print(f"{len(reviews)} yorum yüklendi")
for r in reviews[:3]:
print(f"---\nPuan: {r.get('rating')}")
print(f"Metin: {r.get('comment', {}).get('text', '')[:150]}...")
else:
print(f"HTTP {response.status_code}")
time.sleep(3) # Rate-limit pacing
Node.js ile Yelp Scrape: SOCKS5 Üzerinden
Node.js ortamında socks-proxy-agent kullanarak ProxyHat SOCKS5 proxy'si üzerinden Yelp verisi çekebilirsiniz. SOCKS5, TLS trafiğini transparent proxy'eden geçirir ve bazı anti-bot sistemlerinde daha az tespit edilir.
const { SocksProxyAgent } = require('socks-proxy-agent');
const fetch = require('node-fetch');
const socksUrl = 'socks5://user-country-US-city-austin-session-yelp02:PASSWORD@gate.proxyhat.com:1080';
const agent = new SocksProxyAgent(socksUrl);
const slug = 'uchi-austin';
const url = `https://www.yelp.com/biz/${slug}`;
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 scrapeYelp() {
const res = await fetch(url, { agent, headers, timeout: 30000 });
if (res.status === 200) {
const html = await res.text();
const match = html.match(/__INITIAL_STATE__\s*=\s*({[\s\S]*?})\s*;/);
if (match) {
const state = JSON.parse(match[1]);
const biz = state.biz || {};
console.log('İşletme:', biz.name);
console.log('Puan:', biz.rating);
console.log('Yorum sayısı:', biz.reviewCount);
const reviews = (biz.reviews || []).slice(0, 3);
reviews.forEach((r, i) => {
console.log(`\n--- Yorum ${i + 1} ---`);
console.log('Puan:', r.rating);
console.log('Metin:', (r.comment?.text || '').substring(0, 150) + '...');
});
}
} else {
console.log(`HTTP ${res.status} - PerimeterX bloğu olası`);
}
}
scrapeYelp().catch(console.error);
Pagination, Rate-Limit ve Fingerprint Yönetimi
Pagination Stratejisi
Yelp yorum sayfalaması review_feed endpoint'inde start parametresi ile çalışır. Her sayfa 20 yorum döndürür. Bir işletmenin 500 yorumu varsa, 25 sayfa gerekir.
# Pagination loop
for offset in range(0, 500, 20):
params["start"] = str(offset)
response = requests.get(review_feed_url, proxies=proxies,
headers=headers, params=params, timeout=30)
if response.status_code == 200:
reviews = response.json().get("reviews", [])
if not reviews:
break # Yorum bitti
process_reviews(reviews)
time.sleep(random.uniform(2, 5)) # Rate-limit pacing
Sticky Session Continuity
Bir işletmenin tüm yorumlarını çekerken aynı session'ı kullanın. Session değişimi = IP değişimi = PerimeterX şüphe tetiklemesi. -session-yelp01 flag'i ProxyHat'te aynı IP'yi 10-30 dakika korur. Farklı işletmeler için yeni session kullanın.
User-Agent Rotasyonu
Tek bir User-Agent ile binlerce istek göndermek fingerprint riskini artırır. 5-10 gerçekçi, güncel Chrome/Firefox User-Agent string'i arasında rotasyon yapın.
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 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0",
"Mozilla/5.0 (X11; Linux x86_64) 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/605.1.15 (KHTML, like Gecko) Version/17.2 Safari/605.1.15",
]
headers["User-Agent"] = random.choice(USER_AGENTS)
Rate-Limit Pacing Kuralları
- İstekler arası bekleme: 2-5 saniye rastgele (asla sabit interval kullanmayın)
- Maksimum istek/IP/saat: ~200-300 istek (residential proxy için güvenli bölge)
- Günlük limit: Tek session ile 2,000-3,000 istek hedefleyin
- CAPTTCHA alırsanız: O session'ı bırakın, 30 dakika bekleyin, yeni session ile devam edin
Yaygın Hatalar ve Edge Cases
Hata 1: Datacenter Proxy ile Başlamak
En yaygın hata, geliştirme aşamasında datacenter proxy kullanıp sonra üretime geçmektir. Datacenter IP'leri PerimeterX'te düşük reputation'a sahiptir ve ilk 5-15 istekten sonra blok alırsınız. Geliştirmeden itibaren residential proxy kullanın.
Hata 2: __INITIAL_STATE__ Yapısını Sert Kodlamak
Yelp, __INITIAL_STATE__ blob yapısını sürümler arası değiştirebilir. JSON path'leri sert kodlamak kırılmalara yol açar. Defensive parsing kullanın: .get() zincirleri ve try/except blokları.
Hata 3: robots.txt'i İhmalk Etmek
Yelp'in robots.txt dosyası, /biz/ path'lerini Disallow olarak işaretler. Etik açıdan robots.txt'e saygı göstermek gerekir, ancak ABD'de hiQ Labs v. LinkedIn kararı herkese açık veri toplamayı CFAA ihlali saymamıştır. Bu, yasal bir boşluk alanıdır; risk değerlendirmesi yapın.
Hata 4: Kişisel Veriyi Görmezden Gelmek
Yorum yazarı isimleri ve fotoğrafları GDPR kapsamında kişisel veridir. AB'de bu veriyi saklamak için yasal dayanak (onay, meşru menfaat) gerekir. Yalnızca anonimleştirilmiş veri (yorum metni + puan, isim olmadan) toplamak riski azaltır.
ProxyHat Kurulumu ve İç Kaynaklar
ProxyHat residential proxy'leri Yelp scrape için idealdir. Kurulum adımları:
- ProxyHat fiyatlandırma sayfasından residential plan seçin.
- Dashboard'da kullanıcı adı ve şifrenizi alın.
- Username içine geo-targeting ve session flag'leri ekleyin:
user-country-US-city-austin-session-yelp01 - HTTP için
gate.proxyhat.com:8080, SOCKS5 içingate.proxyhat.com:1080kullanın.
Detaylı teknik dokümantasyon için ProxyHat Docs'a bakın. Web scraping genel kullanım senaryoları için web scraping use case sayfamızı inceleyin. SERP takibi için SERP tracking use case sayfamız faydalıdır.
Etik Scraping ve Resmi API Önceliği
Yelp scrape etmek teknik olarak mümkün olsa da, etik ve yasal çerçeveyi dikkate almak gerekir. İşte pratik ilkeler:
- Fusion API'yi öncelikli değerlendirin. İhtiyacınız işletme adı, adres, puan ve 3 yorum ise Fusion API yeterlidir. 5,000 günlük istek limiti çoğu kullanım senaryosu için yeterli.
- robots.txt'e saygı gösterin. Yelp robots.txt
/biz/path'lerini disallow eder. Bu, resmi olarak scrape istenmediği anlamına gelir. - Kişisel veriden kaçının. Yorum yazarı isimleri, profil fotoğrafları ve kullanıcı ID'leri GDPR kapsamındadır. Yalnızca puan + yorum metni gibi anonimleştirilmiş veri toplamak riski azaltır.
- Login-walled içeriğe erişmeyin. Hesap açıp login gerektiren veriyi çekmek CFAA ihlali olabilir.
- Veri miktarını sınırlayın. 10 milyon işletme yerine, projeniz için yeterli olan 10,000 işletme ile yetinin. Gereksiz hacim, hem teknik hem yasal riski artırır.
- Rate-limit'e saygı gösterin. Saniyede 100 istek göndermek, Yelp'in altyapısına zarar verebilir. Saniyede 1-2 istek güvenli bölgedir.
Öneri: Akademik araştırma, rekabet analizi veya yerel-işletme dizini oluşturma gibi meşru kullanımlarda önce Fusion API'yi deneyin. Yalnızca API'nin yetmediği spesifik durumlarda (tüm yorumları toplama, geçmiş veri analizi) scrape'e başvurun ve her zaman anonimleştirilmiş veri ile çalışın.
Key Takeaways
- Yelp scrape için residential proxy şarttır; datacenter IP'ler 5-15 istek sonrası PerimeterX tarafından bloklanır.
- Fusion API her işletme için yalnızca 3 yorum ve günlük 5,000 istek limiti sunar; tüm yorumlar için scrape gerekir.
__INITIAL_STATE__blob'u vereview_feedJSON endpoint'i veri çıkarımı için ana kaynaklardır.- US geo-targeting (
-country-US-city-austin) yerel işletme sonuçlarını doğru almak için kritiktir. - Sticky session + 2-5 saniye rate pacing + User-Agent rotasyonu = PerimeterX'i uzak tutmanın temel formülü.
- GDPR kapsamında kişisel veri (isim, fotoğraf) toplamaktan kaçının; anonimleştirilmiş veri kullanın.
- Mümkün olduğunda resmi Fusion API'yi tercih edin; scrape'i son çenek olarak kullanın.
FAQ
Yelp işletme verisi nedir ve nasıl scrape edilir?
Yelp işletme verisi, /biz/<slug> URL'lerinde herkese açık olan işletme adı, adresi, telefonu, kategorileri, çalışma saatleri, puanı ve yorum metinlerini içerir. Scrape işlemi, bu sayfaları HTTP istekleriyle çekip HTML veya gömülü JSON blob'larını ayrıştırmayı kapsar. Residential proxy ve doğru rate-limit pacing ile PerimeterX anti-bot savunması aşılabilir.
Yelp scrape için hangi proxy tipi en iyisidir?
Yelp için residential proxy en iyi seçenektir. Datacenter IP'leri PerimeterX tarafından hızlıca işaretlenir ve birkaç istek sonra CAPTCHA tetiklenir. Mobil proxy de çalışır ancak maliyeti daha yüksektir. US geo-targeting (örneğin -country-US-city-austin) yerel işletme sonuçlarını doğru almak için kritiktir.
PerimeterX engellerini nasıl aşarım?
PerimeterX/HUMAN, _px3 çerezi ve sensor challenge ile çalışır. Tam aşmak zordur; ancak residential IP'ler, gerçekçi User-Agent rotasyonu, istekler arası 2-5 saniye bekleme ve sticky session kullanımı ile IP-reputation skorunu düşük tutabilirsiniz. Headless browser yerine mümkün olduğunca plain HTTP istekleri tercih edin.
Fusion API yeterli mi, neden scrape'e ihtiyaç var?
Yelp Fusion API her işletme için yalnızca 3 yorum döndürür ve günlük 5000 istek limiti vardır. Tüm yorumları veya büyük ölçekli işletme verisi istiyorsanız scrape gerekir. Ancak Fusion API, resmi ToS'a uygun olduğu için mümkün olduğunda tercih edilmelidir.
Yelp scrape etmek yasal mı?
ABD'de CFAA ve AB'de GDPR kapsamında değerlendirilmelidir. Herkese açık, login gerektirmeyen veri çekmek genellikle düşük risk taşır; ancak kişisel veri (yorum yazarı ismi, fotoğraf) GDPR kapsamındadır. Yelp'in ToS'u scrape'i yasaklar; bu yüzden resmi Fusion API'yi öncelikli değerlendirin ve robots.txt'ye saygı gösterin.






