← notlar

2026-04-03

Residential proxy'den Scraping API'ye geçiş

Otel fiyat scraping sisteminde residential proxy kullanıyordum. Her request için dönen IP üzerinden SAMO sitelerine istek atıyordum. Çalışıyordu ama pahalıydı ve kontrol zordu. Decodo'nun Scraping API'sine geçtim — hem ucuzladı hem daha güvenilir oldu.

2 katmanlı mimari

Eskiden her sayfa için aynı yöntemi kullanıyordum. Şimdi iki katman var:

Tier 1 — JS Render (Premium proxy): İlk sayfa için headless browser kullanıyor. SAMO sayfası JavaScript ile çalışıyor, düğmeye tıklanması lazım. Decodo'nun browser'ı sayfayı render edip HTML'i döndürüyor. Buradan cookie ve CSRF token alıyorum.

Tier 2 — Standard proxy ile sayfalama: Sayfa 2'den sonrası için JS render'a gerek yok. Sadece URL değiştirip (page=2, page=3...) standard proxy üzerinden istek atıyorum. Cookie bile gerekmiyor — SAMO, URL parametrelerine bakarak fiyat döndürüyor, yeter ki IP Rusya'dan gelsin.

Tier 1: Premium proxy + headless browser → cookie + CSRF + sayfa 1
Tier 2: Standard proxy → sayfa 2, 3, 4... (sadece url + geo)

Bu ayrım maliyeti ciddi düşürdü. JS render pahalı, her sayfada kullanmak israf.

Browser action chain

SAMO sayfaları otomatik yüklenmiyor. Bir "Ara" düğmesine tıklamak gerekiyor. Decodo'ya 3 adımlık browser action gönderiyorum:

[
  {"type": "wait", "wait_time_s": 30},
  {"type": "click", "selector": "button.load.right"},
  {"type": "wait_for_element", "selector": "table.res tr",
   "timeout_s": 60, "on_timeout": "skip"}
]
  1. Sayfa JS'inin yüklenmesini bekle
  2. Arama düğmesine tıkla (button.load.right — tüm SAMO sitelerinde aynı)
  3. Sonuç tablosunun gelmesini bekle

on_timeout: skip önemli — bazen sonuç gelmeyebilir (otel bulunamadı vs.), bu durumda hata atmak yerine boş HTML döndürüyor.

Render cache

Tier 1 render pahalı. Aynı operatör için birden fazla tarih arıyorsam her seferinde render yapmak israf. In-memory cache ekledim:

Operatör başına 1 render → cookie + CSRF → 10 dakika cache

88 tarih-operatör kombinasyonunda 88 yerine 14 render yapıyorum. 26 cache hit. ConcurrentMap<String, CachedRenderResult> — key operatör kodu, value cookie + CSRF + timestamp.

TTL 10 dakika çünkü Decodo session'ı o kadar yaşıyor.

$19 plan'ın sürpriz limitleri

Decodo'nun $19 planında standard proxy pool'u ile headers ve session_id parametreleri desteklenmiyor. Göndersen 400 Bad Request alıyorsun. Dokümantasyonda yazmıyor.

Standard proxy desteklenen parametreler: url, proxy_pool, geo
Başka bir şey gönderme.

İlk başta cookie'leri header olarak eklemeye çalıştım — 400. Session ID ile aynı proxy IP'yi tutmaya çalıştım — 400. Sonra fark ettim ki zaten gerekmiyor: SAMO, URL parametreleri yeterli olduğunda (HOTELS=ID&CHECKIN_BEG=...&page=N) cookie olmadan da fiyat döndürüyor. Yeter ki IP bloklı olmasın.

Operatör bazlı kontrol

Her operatör farklı. Bazısı proxy istiyor, bazısı istemiyor:

  • AYAX_API: Authenticated REST API, proxy gereksiz — direkt bağlantı
  • AYAX: scrapingApiEnabled=false — direkt HTTP, proxy yok
  • Diğerleri: Decodo Scraping API üzerinden Tier 1 + Tier 2

Geo parametresi de operatöre göre değişiyor. Global default Rusya ama mesela iTravel için Ukrayna lazım — proxyCountryOverride ile operatör bazında override ediyorum.

Sonuç

Residential proxy aboneliğini iptal ettim. $19/ay sabit plan: ~3600 premium render + ~4800 standard proxy isteği. Render cache ile verimli kullanılıyor. Daha önce aylık $50+ residential proxy harcıyordum, şimdi daha az parayla daha güvenilir çalışıyor.