Anda telah membeli proxy residensial, mengatur User-Agent Chrome yang baru, tetapi situs tetap memberikan 403 pada permintaan pertama. Apakah ini terdengar familiar? Masalahnya bukan pada IP atau header. Anda telah terdeteksi bahkan sebelum server membaca satu pun header HTTP β melalui handshake TLS. Pada tahun 2026, ini adalah vektor deteksi nomor 1, dan requests biasa gagal secara otomatis. Mari kita bahas bagaimana ini bekerja dan bagaimana memperbaikinya dengan beberapa baris kode melalui curl_cffi.
Apa yang terjadi: Anda terdeteksi oleh handshake TLS
Ketika klien membuat koneksi HTTPS, ia pertama-tama mengirimkan paket ClientHello β bahkan sebelum HTTP. Di dalamnya tercantum: versi TLS, daftar cipher suites yang didukung, ekstensi TLS (SNI, ALPN, supported_groups), kurva eliptik, dan format titik. Urutan dan komposisi bidang ini berbeda-beda di antara klien yang berbeda berbeda β dan dari situ klien dapat dikenali sebelum ia mengucapkan sepatah kata pun.
Dari bidang-bidang ini, sebuah sidik jari dihitung. JA3 (standar tahun 2017) mengambil string dalam bentuk TLSVersion,Ciphers,Extensions,EllipticCurves,ECPointFormats dan menghash-nya dengan MD5, menghasilkan tanda tangan 32 karakter. Masalah JA3 adalah bahwa sejak Januari 2023, Chrome mengacak urutan ekstensi β 16 ekstensi memberikan 16! (lebih dari 20 triliun) kemungkinan, dan browser yang sama menghasilkan JA3 yang berbeda.
Oleh karena itu, industri beralih ke JA4 (FoxIO, penerapan massal 2024β2025). JA4 mengurutkan kode ekstensi berdasarkan nilai hex sebelum hashing β pengacakan Chrome tidak lagi merusaknya. Hash β SHA-256 yang dipangkas, format yang mudah dibaca manusia dan terdiri dari tiga bagian (a_b_c), di dalamnya termasuk ALPN dan dukungan QUIC/HTTP3. Contoh: Chrome 124 memberikan t13d1516h2 (15 cipher, 16 ekstensi, ALPN h2), sementara Python requests yang polos memberikan t13d1715h2. Untuk anti-bot, tanda tangan kedua adalah penanda langsung "ini adalah skrip".
Mengapa pada tahun 2026 Anda tidak bisa ke mana-mana tanpa ini
Deteksi JA4 tertanam di semua vendor besar: Cloudflare mencocokkan sidik jari dengan allowlist, Akamai menambahkan hash terpisah untuk frame HTTP/2 SETTINGS, DataDome membandingkan dengan basis data bot yang dikenal. Logikanya sederhana dan mematikan: jika Anda mengirim User-Agent: Chrome 131, tetapi sidik jari TLS berteriak "urllib3/OpenSSL" β ini adalah sinkronisasi yang salah, dan Anda akan diblokir seketika. Tidak ada proxy yang menyelamatkan: IP residensial yang sempurna dengan sidik jari Python requests tetap kalah.
Itulah sebabnya kombinasi "proxy + pemalsuan sidik jari" menjadi dasar kebersihan scraping pada tahun 2026, bukan opsi untuk yang lebih maju.
Solusi: curl_cffi dalam 5 menit
curl_cffi adalah pembungkus Python di atas curl-impersonate (curl yang dimodifikasi, dibangun dengan BoringSSL dari Chrome atau NSS dari Firefox sebagai pengganti OpenSSL). Ini mereproduksi handshake browser yang asli dan memiliki API yang hampir identik dengan requests yang biasa.
Langkah 1. Instalasi. Biner curl-impersonate untuk Windows/macOS/Linux diunduh secara otomatis:
pip install curl-cffi
Langkah 2. Permintaan dasar. Ubah impor dan tambahkan satu parameter:
from curl_cffi import requests
resp = requests.get("https://target.com/", impersonate="chrome")
print(resp.status_code)
print(resp.http_version) # HTTP/2 β seperti di browser asli
Satu baris impersonate="chrome" memalsukan langsung empat lapisan: sidik jari TLS (JA3/JA4), versi HTTP (HTTP/2 alih-alih HTTP/1.1), urutan header, dan negosiasi ALPN.
Langkah 3. Selalu gunakan alias generik, bukan pin versi. Tulis impersonate="chrome" (atau "safari", "safari_ios") β alias secara otomatis diselesaikan ke profil terbaru. impersonate="chrome124" yang di-hardcode akan kadaluarsa: Chrome diperbarui setiap ~4 minggu, dan profil lama akan menjadi anomali. Target yang dapat diandalkan β Chrome, Edge, dan Safari/iOS (profil dari chrome99 hingga chrome131, safari15β18).
Langkah 4. Proxy dan sesi. Untuk scraping yang nyata, simpan status dalam sesi dan sambungkan proxy. IP residensial atau seluler di sini wajib β data center terdeteksi secara terpisah dari TLS berdasarkan ASN:
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)
Langkah 5. Asinkron untuk volume. Berbeda dengan requests, curl_cffi secara bawaan memiliki async dan HTTP/2:
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))
Periksa sidik jari Anda β jangan menebak
Sebelum mengirimkan lalu lintas produksi, pastikan bahwa pemalsuan benar-benar berfungsi. Kirim permintaan ke verifier publik dan bandingkan JA4 dengan browser referensi:
- tls.peet.ws β mengembalikan JA3, JA4, sidik jari Akamai, dan frame HTTP/2 dalam JSON. Minta melalui
curl_cffidan melalui Chrome asli, bandingkan hash-nya. - ja4db.com β basis data JA4 yang dikenal, membantu memahami dengan siapa Anda mirip.
- browserleaks.com/tls dan alat JA3/JA4 dari Scrapfly β rincian pemisahan bidang.
Di staging, nyaman untuk menempatkan mitmproxy antara scraper dan target dan memantau hash JA4 yang sebenarnya dari setiap permintaan.
Diagnostik: masih mendapatkan 403/429
Jika sidik jari sudah benar, tetapi pemblokiran tetap ada β ikuti checklist dari yang umum hingga yang jarang:
- IP dari data center. Alasan nomor 1. Beralih ke proxy residensial atau seluler β mengapa satu sidik jari tidak cukup, dijelaskan secara rinci dalam artikel tentang deteksi proxy residensial melalui IP Intelligence.
- Profil kadaluarsa.
pip install -U curl-cffidan alias generik"chrome". - Rate terlalu tinggi. Tambahkan jeda acak 1β3 detik antara permintaan.
- Header telanjang. Pastikan untuk mengirim
Accept-Language,Accept-Encoding,Refererβ ketidakhadiran mereka juga merupakan anomali. - Sinkronisasi yang salah antara sesi dan IP. Aturan: satu sesi β satu IP selama masa hidupnya.
- Status 200 β sukses. Periksa isi respons: di bawah kode 200 mungkin terdapat halaman dengan CAPTCHA.
Di mana curl_cffi terhenti
curl_cffi menutup lapisan jaringan β dan itu saja. Ia tidak mengeksekusi JavaScript. Oleh karena itu, ia tidak berdaya terhadap tantangan JS: Cloudflare Turnstile, halaman "Memeriksa browser Andaβ¦" (IUAM), cookie cf_clearance yang ditetapkan oleh skrip setelah pemeriksaan β semua ini memerlukan lingkungan browser yang sebenarnya. Mengapa pada tahun 2026 solver CAPTCHA hampir tidak berfungsi melawan sistem pencegahan semacam itu, telah kami bahas dalam analisis terpisah tentang penghindaran CAPTCHA.
Apa yang harus dilakukan ketika terhenti di dinding JS:
- Hibrida. Playwright atau Nodriver menjalankan tantangan dan mendapatkan
cf_clearance, kemudian cookie diserahkan kecurl_cffiyang cepat untuk sebagian besar permintaan β sehingga Anda membayar untuk browser berat hanya sekali. - Layanan Solver (CapSolver, 2Captcha) untuk otomatisasi pengeluaran token.
- API scraping terkelola, jika Anda tidak ingin mengelola infrastruktur.
Dan ingat tentang keamanan thread: setiap thread β sesi sendiri. Tetapkan versi curl-cffi dalam requirements.txt dan tinjau profil setiap 6β12 minggu, saat browser diperbarui.
Alternatif curl_cffi
- tls-client β pembungkus di atas pustaka Go berbasis uTLS, dengan profil (
chrome_124,safari_ios_17) dan benderarandom_tls_extension_order=True. Penyesuaian sidik jari yang fleksibel. - primp β klien di Rust, memungkinkan untuk secara independen menetapkan
impersonate_osdan memberikan throughput lebih tinggi; minus β API tidak sepenuhnya cocok denganrequestsdan pustaka ini lebih muda.
Proxy apa yang dibutuhkan dan mengapa
Pemalsuan sidik jari dan proxy menyelesaikan dua sisi dari satu tugas: curl_cffi menutup pertanyaan "seperti apa koneksinya", proxy β "dari mana asalnya". Anti-bot memeriksa kedua sinyal secara independen, jadi JA4 yang sempurna dengan ASN data center hitam tidak ada gunanya. Untuk tujuan yang aman (marketplace, media sosial, agregator perjalanan) gunakan proxy residensial atau proxy seluler: mereka memiliki asal operator yang bersih, dan proxy seluler juga bersembunyi di balik efek CGNAT "kerumunan". Tinggalkan data center untuk tujuan yang tidak sensitif dan volume tinggi.
Kesimpulan
Pada tahun 2026, scraping adalah permainan identitas, bukan hanya IP. requests polos terlihat seperti skrip pada tingkat handshake TLS dan kalah sebelum header pertama. Mengganti impor dengan curl_cffi dengan impersonate="chrome" menghilangkan kegagalan ini dalam lima menit, tetapi hanya berfungsi dalam kombinasi dengan IP residensial atau seluler yang bersih dan dengan pemahaman batas: lapisan jaringan β ya, tantangan JavaScript β tidak. Kumpulkan tumpukan dengan jujur: sidik jari yang benar, proxy yang benar, hibrida dengan browser di mana ada dinding JS β dan 403 pada permintaan pertama akan menjadi masa lalu.
