Selamlar herkese,
Uzun süredir veri toplama / scraping işlerinde en çok can sıkan konu malum: Cloudflare, DataDome veya temel bot filtreleri. Çoğu zaman ya basit bir requests atıp 403 alıyoruz ya da her URL için ağır bir Selenium/Playwright açıp sunucunun RAM'ini tüketiyoruz.
Bu sorunu çözmek için geliştirdiğim açık kaynaklı
resilient-scraper projesinin arkasındaki mantığı ve mimariyi özetlemek istedim.
Temel Mantık: Kademeli İstek (Escalation Ladder)
Mantık aslında basit: Her siteye tarayıcıyla saldırmak gereksiz maliyet. İstek en ucuz yöntemden başlar, patlarsa bir üst katmana geçer:
- curl_cffi: İlk denemeyi tarayıcısız yapar. Chrome TLS (JA3/JA4) ve HTTP/2 parmak izini taklit ettiği için birçok CDN/WAF katmanını tarayıcı açmadan yarım saniyede geçer.
- Playwright: İlk adım patlarsa (sayfada JS çalışması gerekiyorsa) headless tarayıcı devreye girer.
- nodriver: Standart otomasyon tespit edilirse, doğrudan CDP üzerinden gerçek Chrome oturumu kaldırılır; bot bayrakları olmadan zorlu challenge'lar tamamlanır.
"Siteyi Kazımak Yerine Arka Kapı": Otomatik JSON API Keşfi
SPA sitelerde HTML parse etmek yerine sayfanın arkada veri çektiği API'yi yakalamak her zaman daha temiz. Projeye --discover parametresi ekledim. Sayfayı açıp network trafiğini dinliyor, dönen JSON isteklerini analiz edip gerçek veri kaynağını terminale döküyor:
from resilient_scraper import discover_apis, Fetcher
# Sayfanın arkasındaki JSON endpoint'i bul
endpoints = discover_apis("https://ornek-site.com/liste") best_api = endpoints[0]
# Tarayıcı açmadan doğrudan curl_cffi ile hafif şekilde çek
data = Fetcher().fetch(best_api.url).text
Projede ayrıca:
- Sayfaların 200 dönüp aslında challenge basmasını gövdeden okuyan block detection,
- Hata veren proxy'leri geçici bekleme süresine (cooldown) alan havuz yönetimi,
- Host bazlı rate limit ve jitter özellikleri var.
Projeyi açık kaynak olarak GitHub'a bıraktım, incelemek veya projelerinde kullanmak isteyenler bakabilir:
https://github.com/Frumane/resilient-scraper
Sizin benzer projelerde maliyet/hız optimizasyonu için kullandığınız farklı yöntemler var mı? Fikirlerinizi duymak isterim.