Platformlar arası bir yemek teslimat fiyat karşılaştırması kurarken önünüze çıkan tek teknik engel genellikle tek bir şeydir: sayfayı açtığınız anda beliren CAPTCHA. Menüleri, teslimat ücretlerini ve promosyonları toplamak isteyen bir fiyat analizi aracı doğrulama adımını geçemeyince tüm iş akışı orada takılır. CaptchaAI'nin API'si bu adımı otomatikleştirir; geri kalanı sitekey çıkarımı, token gönderimi ve HTML ayrıştırmadan oluşan standart bir veri kazıma akışıdır. Bu rehber, DoorDash, Uber Eats ve Grubhub gibi platformlardaki CAPTCHA türlerini eşler ve tek bir Python karşılaştırıcıyla akışı gösterir.
Neden platformdan platforma fiyatlar değişiyor?
Aynı restoran, DoorDash'te başka, Uber Eats'te başka fiyat gösterebilir. Sebep basit: restoranlar her platformun farklı komisyon oranını (%15–30) menü fiyatına yansıtır; teslimat ücretleri ve minimum sipariş tutarları da platforma göre değişir. Aynı ürünün platformlar arasındaki fiyat farkını ölçmek, pazar araştırması ve rekabet analizi için doğrudan veri üretir.
Türkiye'de Yemeksepeti ve Getir gibi platformların yoğun olduğu bir pazarda bu tablo tanıdıktır: aynı menü, farklı komisyon yapısı, farklı vitrin fiyatı. CaptchaAI'nin thread tabanlı planları USD üzerinden sabit fiyatlandığından, TL kurundaki dalgalanmadan bağımsız olarak aylık maliyetinizi önceden bilirsiniz.
Hangi platform hangi CAPTCHA'yı kullanıyor?
Her platform farklı bir doğrulama katmanı kullanır; iş akışınızı kurmadan önce hangi türle karşılaşacağınızı bilmek gerekir.
| Platform | CAPTCHA türü | Tetikleyici | Korunan veri |
|---|---|---|---|
| DoorDash | reCAPTCHA v3 + Cloudflare | Bot tespiti | Menüler, fiyatlar, ücretler |
| Uber Eats | Cloudflare Turnstile | Otomatik erişim | Restoran listeleri, fiyatlar |
| Grubhub | reCAPTCHA v2 | İstek sınırlama | Menü öğeleri, promosyonlar |
| Postmates | Cloudflare doğrulama akışı | Kazıma tespiti | Teslimat ücretleri, tahmini süreler |
| Just Eat | reCAPTCHA v2 | Tekrarlanan aramalar | Restoran verileri |
| Instacart | reCAPTCHA v3 | Bot tespiti | Market fiyatları |
CaptchaAI bu tablodaki türlerin tamamını çözer: reCAPTCHA v2 ve v3, Cloudflare Turnstile ve Cloudflare doğrulama akışı — böylece platform hangisini kullanırsa kullansın aynı akış çalışır.
Python ile çok platformlu fiyat karşılaştırıcı
Aşağıdaki sınıf bir restoranı birden fazla platformda arar, CAPTCHA çıktığında in.php'ye görev gönderip res.php'den sonucu sorgular ve dönen token'ı doğru alana (Turnstile veya reCAPTCHA) otomatik enjekte eder.
import requests
import time
import re
from bs4 import BeautifulSoup
import json
CAPTCHAAI_KEY = "YOUR_API_KEY"
CAPTCHAAI_URL = "https://ocr.captchaai.com"
def solve_captcha(method, sitekey, pageurl, **kwargs):
data = {
"key": CAPTCHAAI_KEY, "method": method,
"googlekey": sitekey, "pageurl": pageurl, "json": 1,
}
data.update(kwargs)
resp = requests.post(f"{CAPTCHAAI_URL}/in.php", data=data)
task_id = resp.json()["request"]
for _ in range(60):
time.sleep(5)
result = requests.get(f"{CAPTCHAAI_URL}/res.php", params={
"key": CAPTCHAAI_KEY, "action": "get",
"id": task_id, "json": 1,
})
r = result.json()
if r["request"] != "CAPCHA_NOT_READY":
return r["request"]
raise TimeoutError("Timeout")
class FoodDeliveryComparator:
def __init__(self, proxy=None):
self.session = requests.Session()
if proxy:
self.session.proxies = {"http": proxy, "https": proxy}
self.session.headers.update({
"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X) "
"AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 "
"Mobile/15E148 Safari/604.1",
"Accept-Language": "en-US,en;q=0.9",
})
def search_restaurants(self, platform_url, location, cuisine=None):
"""Search restaurants on a delivery platform."""
params = {"address": location}
if cuisine:
params["cuisine"] = cuisine
url = f"{platform_url}/search"
resp = self.session.get(url, params=params, timeout=30)
if self._has_captcha(resp.text):
resp = self._solve_and_retry(resp.text, url)
return self._parse_restaurants(resp.text)
def get_menu(self, restaurant_url):
"""Get menu with prices from a specific restaurant."""
resp = self.session.get(restaurant_url, timeout=30)
if self._has_captcha(resp.text):
resp = self._solve_and_retry(resp.text, restaurant_url)
return self._parse_menu(resp.text)
def compare_restaurant_across_platforms(self, restaurant_name, platforms, location):
"""Compare same restaurant's pricing across delivery platforms."""
results = []
for platform in platforms:
try:
restaurants = self.search_restaurants(
platform["url"], location,
)
# Find matching restaurant
match = None
for r in restaurants:
if restaurant_name.lower() in r["name"].lower():
match = r
break
if match and match.get("url"):
menu = self.get_menu(match["url"])
results.append({
"platform": platform["name"],
"restaurant": match["name"],
"delivery_fee": match.get("delivery_fee", ""),
"delivery_time": match.get("delivery_time", ""),
"menu_items": len(menu),
"sample_prices": menu[:5],
})
else:
results.append({
"platform": platform["name"],
"restaurant": restaurant_name,
"status": "not found",
})
except Exception as e:
results.append({
"platform": platform["name"],
"error": str(e),
})
time.sleep(5)
return results
def track_delivery_fees(self, platforms, location, output_file):
"""Track delivery fees across platforms for analysis."""
all_data = []
for platform in platforms:
try:
restaurants = self.search_restaurants(
platform["url"], location,
)
for r in restaurants[:20]: # Top 20 per platform
all_data.append({
"platform": platform["name"],
"restaurant": r["name"],
"delivery_fee": r.get("delivery_fee", ""),
"delivery_time": r.get("delivery_time", ""),
"rating": r.get("rating", ""),
})
time.sleep(5)
except Exception as e:
print(f"Error on {platform['name']}: {e}")
with open(output_file, "w") as f:
json.dump(all_data, f, indent=2)
return all_data
def _has_captcha(self, html):
return any(tag in html.lower() for tag in [
'data-sitekey', 'g-recaptcha', 'cf-turnstile',
'challenge-platform',
])
def _solve_and_retry(self, html, url):
match = re.search(r'data-sitekey="([^"]+)"', html)
if not match:
return self.session.get(url)
sitekey = match.group(1)
if 'cf-turnstile' in html:
token = solve_captcha("turnstile", sitekey, url)
return self.session.post(url, data={"cf-turnstile-response": token})
token = solve_captcha("userrecaptcha", sitekey, url)
return self.session.post(url, data={"g-recaptcha-response": token})
def _parse_restaurants(self, html):
soup = BeautifulSoup(html, "html.parser")
restaurants = []
for card in soup.select(".restaurant-card, .store-card, .merchant"):
name_el = card.select_one(".name, .store-name, h3")
if name_el:
restaurants.append({
"name": name_el.get_text(strip=True),
"url": self._link(card),
"delivery_fee": self._text(card, ".delivery-fee, .fee"),
"delivery_time": self._text(card, ".delivery-time, .eta"),
"rating": self._text(card, ".rating, .stars"),
})
return restaurants
def _parse_menu(self, html):
soup = BeautifulSoup(html, "html.parser")
items = []
for item in soup.select(".menu-item, .item-card"):
items.append({
"name": self._text(item, ".item-name, .name"),
"price": self._text(item, ".price, .item-price"),
"description": self._text(item, ".description, .item-desc"),
})
return items
def _text(self, el, selector):
found = el.select_one(selector)
return found.get_text(strip=True) if found else ""
def _link(self, card):
a = card.select_one("a")
return a.get("href", "") if a else ""
# Usage
comparator = FoodDeliveryComparator(
proxy="http://user:pass@mobile.proxy.com:5000"
)
# Compare platforms
platforms = [
{"name": "Platform A", "url": "https://delivery-a.example.com"},
{"name": "Platform B", "url": "https://delivery-b.example.com"},
{"name": "Platform C", "url": "https://delivery-c.example.com"},
]
comparison = comparator.compare_restaurant_across_platforms(
restaurant_name="Pizza Palace",
platforms=platforms,
location="10001",
)
for result in comparison:
print(f"{result.get('platform')}: Fee={result.get('delivery_fee')} "
f"ETA={result.get('delivery_time')}")
Proxy ve altyapı notları
Teslimat uygulamaları mobil önceliklidir; kod örneğindeki gibi bir iPhone/Android User-Agent göndermek en doğal görünen trafiği üretir. İstek hacmini birden fazla IP'ye dağıtan bir proxy yapılandırması, tek IP'den gelen yoğun isteklerin tetiklediği istek sınırlarını azaltır. Fiyatlandırma konuma bağlı olduğundan, proxy'nizin coğrafi konumunu hedef teslimat bölgesiyle eşleştirin. Ayrıntılar için yüksek başarı için proxy yapılandırması ve proxy havuzu yönetimi rehberlerine bakabilirsiniz.
İzlemeniz gereken veri noktaları
Ham veriyi analize dönüştüren metrikler:
| Metrik | İş değeri |
|---|---|
| Menü öğesi fiyatları | Fiyat paritesi ve fiyat farkı analizi |
| Teslimat ücretleri | Platform ücreti karşılaştırması |
| Minimum sipariş tutarları | Erişim engeli analizi |
| Teslimat süresi tahminleri | Hizmet düzeyi karşılaştırması |
| Promosyonlar/indirimler | Pazarlama zekası |
| Restoran müsaitliği | Kapsam analizi |
Karşılaştırmayı düzenli bir işe dönüştürün
Tek seferlik bir çekim yalnızca anlık bir fotoğraf verir; asıl değer düzenli ölçümde ortaya çıkar. track_delivery_fees çıktısını her çalıştırmada tarih damgalı bir JSON dosyasına yazın; böylece platformlar arası fiyat farkının zaman içinde nasıl değiştiğini takip edebilirsiniz. Genel pazar analizi için haftalık bir tarama çoğu ekibe yeter; promosyon dönemlerinde veya rakip fiyatlarını yakından izlediğiniz kampanyalarda günlük çalıştırma daha anlamlıdır.
İşi Europe/Istanbul saat dilimine göre gece saatlerinde zamanlarsanız hem hedef sitelerdeki trafik düşük olur hem de sabah raporunuz hazır gelir. Her çalıştırmada kaç restoranı aynı anda topladığınızı not edin: eşzamanlı iş yükünüz, BASIC ($15/ay, 5 thread) mi yoksa ADVANCE ($90/ay, 50 thread) mı planının size oturduğunu belirler. Küçük bir izleme listesiyle başlayın, hacim büyüdükçe thread sayısını yukarı çekin.
Sık karşılaşılan sorunlar ve çözümleri
| Sorun | Sebep | Düzeltme |
|---|---|---|
| Boş restoran sonuçları | Konum sunulmuyor veya CAPTCHA sayfası döndü | Doğru teslimat adresi ve posta kodunu ayarlayın |
| Menü fiyatları uygulamadan farklı | Web ve uygulama arasında fiyat tutarsızlığı | Uygulama eşdeğeri fiyatlar için mobil User-Agent kullanın |
| Cloudflare doğrulama akışı döngüsü | Oturum profili tutarsızlığı | Tutarlı bir mobil User-Agent ve oturum yapılandırması kullanın |
| Restoran bir platformda var, diğerinde yok | Farklı kapsam | Karşılaştırmada "mevcut değil" olarak işaretleyin |
| Yanlış teslimat ücretleri | Konuma bağlı fiyatlandırma | Proxy coğrafi konumunu hedef bölgeyle eşleştirin |
Sık sorulan sorular
CaptchaAI hangi CAPTCHA türlerini destekliyor?
Bu akışta ihtiyaç duyduğunuz türlerin tamamı desteklenir: reCAPTCHA v2 ve v3, Cloudflare Turnstile ve Cloudflare doğrulama akışı. hCaptcha ve FunCaptcha ise henüz desteklenmiyor.
Fiyat karşılaştırması için hangi plan gerekir?
Tek bir restoranı birkaç platformda izliyorsanız BASIC ($15/ay, 5 thread) yeterlidir. Çok sayıda restoranı paralel toplayacaksanız ADVANCE ($90/ay, 50 thread) daha uygundur; planlar thread başına sınırsız çözüm içerir.
Toplanan fiyat verileri KVKK kapsamında mı?
Menü ve fiyat verisi genellikle kişisel veri değildir; ancak restoran sahibi adları veya kullanıcı yorumları gibi kişisel veriler toplarsanız bunlar KVKK kapsamına girer. Akışınızı yetkili kullanım sınırları içinde tutun.
reCAPTCHA v3 gibi görünmez CAPTCHA'lar da çözülebiliyor mu?
Evet. reCAPTCHA v3 arka planda skor üretir ve kullanıcıya kutu göstermez; CaptchaAI bu türü de userrecaptcha yöntemiyle çözer ve token'ı döndürür.
İlgili kılavuzlar
- Perakende envanter takibi ve CAPTCHA yönetimi
- Yüksek başarı için proxy yapılandırması
- Proxy havuzu yönetimi rehberi
Yemek teslimat fiyatlarını geniş ölçekte karşılaştırın — CaptchaAI anahtarınızı alın ve platformlar arası analizi otomatikleştirin.