Yerleşik proxy satın aldınız, yeni bir Chrome User-Agent ayarladınız, ama site yine de ilk istekte 403 hatası veriyor. Tanıdık mı? Sorun IP'de ya da başlıklarda değil. Sunucu, en azından bir HTTP başlığı okumadan önce sizi TLS el sıkışması ile tespit etti. 2026 yılında bu, tespit için bir numaralı vektör ve sıradan requests bunu otomatik olarak geçemiyor. Bunun nasıl çalıştığını ve curl_cffi ile birkaç satır kodla nasıl düzeltileceğini inceleyelim.
Ne oluyor: sizi TLS el sıkışması ifşa ediyor
Müşteri HTTPS bağlantısı kurduğunda, ilk olarak ClientHello paketini gönderir — tüm HTTP'den önce. Bu pakette: TLS sürümü, desteklenen şifreleme setleri (cipher suites), TLS uzantıları (SNI, ALPN, supported_groups), eliptik eğriler ve nokta formatları listelenir. Bu alanların sırası ve içeriği farklı müşterilerde farklıdır — bu nedenle müşteri, bir kelime bile söylemeden önce tanınabilir.
Bu alanlardan bir parmak izi hesaplanır. JA3 (2017 standardı) TLSVersion,Ciphers,Extensions,EllipticCurves,ECPointFormats biçiminde bir dize alır ve bunu MD5 ile hashleyerek 32 karakterlik bir imza elde eder. JA3'ün sorunu, Ocak 2023'ten itibaren Chrome'un uzantıların sırasını rastgele hale getirmesidir — 16 uzantı, 16! (20 trilyondan fazla) kombinasyon sunar ve aynı tarayıcı farklı JA3'ler verir.
Bu nedenle endüstri JA4'e geçti (FoxIO, kitlesel benimseme 2024–2025). JA4, hashlemeden önce uzantı kodlarını hex değerine göre sıralar — Chrome'un rastgeleleştirmesi artık onu bozmaz. Hash, kesilmiş SHA-256'dır, insan tarafından okunabilir ve üç parçalıdır (a_b_c), ALPN ve QUIC/HTTP3 desteğini içerir. Örnek: Chrome 124 t13d1516h2 verir (15 şifre, 16 uzantı, ALPN h2), ancak çıplak Python requests t13d1715h2 verir. Anti-bot için ikinci imza, "bu bir betik" doğrudan işaretidir.
2026'da neden bununla bir yere varamazsınız
JA4 tespiti, tüm büyük satıcılara entegre edilmiştir: Cloudflare parmak izini izin listeleriyle karşılaştırır, Akamai ayrı bir HTTP/2 SETTINGS çerçevesi hash'i ekler, DataDome bilinen botlar veritabanıyla karşılaştırır. Mantık basit ve öldürücü: Eğer User-Agent: Chrome 131 gönderiyorsanız ve TLS parmak izi "urllib3/OpenSSL" diye bağırıyorsa — bu senkronizasyon bozukluğu demektir ve anında engellenirsiniz. Hiçbir proxy kurtarmaz: Python requests ile parmak izi olan mükemmel yerleşik IP bile kaybeder.
Tam da bu nedenle "proxy + parmak izi taklidi" kombinasyonu 2026'da scraping için temel hijyen haline geldi, gelişmişler için bir seçenek değil.
Çözüm: curl_cffi ile 5 dakikada
curl_cffi, curl-impersonate (Chrome'dan BoringSSL veya Firefox'tan NSS ile derlenmiş modifiye edilmiş curl) üzerine bir Python sarmalayıcıdır. Gerçek bir tarayıcı el sıkışmasını yeniden üretir ve neredeyse alışılmış requests ile aynı API'ye sahiptir.
Adım 1. Kurulum. Windows/macOS/Linux için curl-impersonate ikili dosyaları otomatik olarak çekilir:
pip install curl-cffi
Adım 2. Temel istek. İthali değiştirin ve bir parametre ekleyin:
from curl_cffi import requests
resp = requests.get("https://target.com/", impersonate="chrome")
print(resp.status_code)
print(resp.http_version) # HTTP/2 — gerçek bir tarayıcı gibi
Bir satır impersonate="chrome" dört katmanı aynı anda taklit eder: TLS parmak izi (JA3/JA4), HTTP sürümü (HTTP/2 yerine HTTP/1.1), başlıkların sırası ve ALPN müzakereleri.
Adım 3. Her zaman genel takma adı kullanın, sürüm pinlemeyin. impersonate="chrome" (veya "safari", "safari_ios") yazın — takma ad otomatik olarak en güncel profili çözer. Sabitlenmiş impersonate="chrome124" geçersiz hale gelecektir: Chrome her ~4 haftada güncellenir ve eski profil kendisi bir anomali haline gelir. Güvenilir hedefler — Chrome, Edge ve Safari/iOS (chrome99'dan chrome131'e, safari15–18 profilleri).
Adım 4. Proxy ve oturumlar. Gerçek scraping için durumu bir oturumda tutun ve proxy ekleyin. Yerleşik veya mobil IP burada zorunludur — veri merkezi TLS'den ayrı olarak ASN ile tespit edilir:
from curl_cffi import requests
session = requests.Session(impersonate="chrome")
headers = {
"Accept-Language": "en-US,en;q=0.9",
"Accept-Encoding": "gzip, deflate, br",
"Referer": "https://www.google.com/",
}
proxies = {
"http": "http://user:pass@proxy-host:port",
"https": "http://user:pass@proxy-host:port",
}
resp = session.get("https://target.com", headers=headers, proxies=proxies)
Adım 5. Hacim için asenkronluk. requests'dan farklı olarak, curl_cffi kutudan çıktığı gibi async ve HTTP/2'yi destekler:
import asyncio
from curl_cffi.requests import AsyncSession
async def fetch(session, url):
r = await session.get(url, impersonate="chrome")
return r.status_code
async def main(urls):
async with AsyncSession() as session:
return await asyncio.gather(*[fetch(session, u) for u in urls])
asyncio.run(main(["https://target.com"] * 20))
Parmak izinizi kontrol edin — tahmin etmeyin
Gerçek trafik göndermeden önce, taklidin gerçekten çalıştığından emin olun. Kamuya açık doğrulayıcılara istek gönderin ve JA4'ü referans tarayıcı ile karşılaştırın:
- tls.peet.ws — JA3, JA4, Akamai parmak izi ve HTTP/2 çerçevelerini JSON formatında döner. Bunu
curl_cffiile ve gerçek Chrome üzerinden isteyin, hash'leri karşılaştırın. - ja4db.com — bilinen JA4 veritabanı, kime benzediğinizi anlamanıza yardımcı olur.
- browserleaks.com/tls ve Scrapfly'dan JA3/JA4 aracı — alanların detaylı dökümü.
Staging'de mitmproxy'yi scraper ile hedef arasında koymak ve her isteğin gerçek JA4 hash'ini izlemek kolaydır.
Tanı: hala 403/429 alıyorsanız
Parmak izi doğruysa ve engellemeler devam ediyorsa — sık karşılaşılanlardan nadir olanlara doğru kontrol listesine gidin:
- Veri merkezi IP'si. Sebep №1. Yerleşik proxy'lere veya mobil proxy'lere geçin — neden bir parmak izinin yeterli olmadığını IP Intelligence ile yerleşik proxy tespiti konusundaki makalede detaylıca ele aldık.
- Geçersiz profil.
pip install -U curl-cffive genel takma ad"chrome". - Çok yüksek oran. İstekler arasında 1–3 saniye rastgele beklemeler ekleyin.
- Çıplak başlıklar. Mutlaka
Accept-Language,Accept-Encoding,Referergönderin — bunların eksikliği de bir anomali olarak kabul edilir. - Oturum ve IP senkronizasyonu. Kural: bir oturum — tüm yaşam süresi boyunca bir IP.
- 200 durumu ≠ başarı. Yanıtın gövdesini kontrol edin: 200 kodu altında CAPTCHA içeren bir sayfa olabilir.
curl_cffi nerede duvara çarpıyor
curl_cffi ağ katmanını kapatır — ve bu kadar. JavaScript çalıştırmaz. Bu nedenle JS zorluklarına karşı etkisizdir: Cloudflare Turnstile, "Tarayıcınızı kontrol ediyoruz..." (IUAM) sayfası, kontrol sonrası script tarafından yerleştirilen cf_clearance çerezi — bunların hepsi gerçek bir tarayıcı ortamı gerektirir. 2026'da CAPTCHA çözücülerin bu tür önleyici sistemlere karşı neredeyse çalışmayı bıraktığını ayrı bir incelemede CAPTCHA geçişi konusunu ele aldık.
JS duvarına çarptığınızda ne yapmalısınız:
- Hibrit. Playwright veya Nodriver zorluğu geçer ve
cf_clearancealır, ardından çerezi hızlıcurl_cffiile ana istekler için aktarır — böylece ağır tarayıcı için bir kez ödeme yaparsınız. - Çözücü hizmetleri (CapSolver, 2Captcha) otomatik token dağıtımı için.
- Yönetilen scraping API'leri, eğer altyapıyı tutmak istemiyorsanız.
Ve thread güvenliğini unutmayın: her thread'e kendi oturumu. curl-cffi sürümünü requirements.txt dosyasında sabitleyin ve profilleri her 6–12 haftada bir gözden geçirin, tarayıcılar güncellendiğinde.
curl_cffi alternatifleri
- tls-client — uTLS tabanlı Go kütüphanesi üzerinde bir sarmalayıcı, profillerle (
chrome_124,safari_ios_17) verandom_tls_extension_order=Truebayrağı ile. Parmak izinin esnek ince ayarı. - primp — Rust'ta bir istemci,
impersonate_os'yi bağımsız olarak ayarlamanıza olanak tanır ve daha yüksek bir bant genişliği sağlar; dezavantajı — API tamamenrequestsile uyuşmuyor ve kütüphane daha genç.
Hangi proxyye ihtiyacınız var ve neden
Parmak izi taklidi ve proxy, bir görevin farklı yarılarını çözer: curl_cffi "bağlantı nasıl görünüyor" sorusunu kapatır, proxy ise "nereden geliyor" sorusunu yanıtlar. Anti-bot her iki sinyali bağımsız olarak kontrol eder, bu nedenle mükemmel JA4 ile siyah veri merkezi-ASN işe yaramaz. Korunan hedefler (pazar yerleri, sosyal medya, seyahat toplayıcıları) için yerleşik veya mobil proxy'ler alın: bunların temiz operatör kökeni vardır ve mobil olanlar CGNAT "kalabalık etkisi" arkasında gizlenir. Veri merkezini, duyarsız hedefler ve yüksek hacim için bırakın.
Sonuç
2026'da scraping, yalnızca IP değil, kimliklerin oyunudur. Çıplak requests, TLS el sıkışması düzeyinde bir betik olarak görünür ve ilk başlıktan önce kaybeder. curl_cffi ile impersonate="chrome" içeriğini değiştirmek bu açığı beş dakikada kapatır, ancak yalnızca temiz bir yerleşik veya mobil IP ile ve sınırları anlayarak çalışır: ağ katmanı — evet, JavaScript zorlukları — hayır. Yığını dürüstçe toplayın: doğru parmak izi, doğru proxy, JS duvarında gerektiğinde tarayıcı ile hibrit — ve ilk istekte 403 hatası geçmişte kalacak.
