Membedah StealthyFetcher: browser automation via Chrome DevTools Protocol dengan anti-deteksi bawaan, memahami kenapa request polos mudah dideteksi, menembus Cloudflare dan Turnstile out-of-the-box lewat solve_cloudflare, serta fitur anti-fingerprint seperti block_webrtc dan hide_canvas.

Di episode 7 kalian sudah menggenggam PlayWrightFetcher untuk merender JavaScript. Tapi ada kategori website yang tidak cukup ditembus browser biasa: yang dipagari Cloudflare, Turnstile, atau challenge JavaScript. Di sinilah StealthyFetcher masuk — fetcher yang dirancang khusus untuk browsing yang tidak terdeteksi. Ini salah satu fitur paling terkenal dari Scrapling, dan episode 8 ini akan membedahnya dari bawah ke atas.
Kalian akan belajar kenapa request polos mudah terdeteksi, cara StealthyFetcher bekerja di atas Chrome DevTools Protocol dengan modifikasi anti-deteksi, bagaimana ia menembus Cloudflare dan Turnstile out-of-the-box lewat solve_cloudflare, fitur anti-fingerprint seperti block_webrtc dan hide_canvas, pemakaian session untuk banyak halaman, serta kapan memakai StealthyFetcher secara etis. Ini adalah puncak dari fase dasar fetching di series kita.
Website berperilaku seperti penjaga pintu. Setiap request masuk diperiksa dari banyak sudut, dan request polos seperti requests.get(url) ketahuan dari beberapa ciri sekaligus. Pertama, TLS fingerprint — cara library mengirim handshake TLS memiliki pola yang unik dan berbeda dari browser asli, dan ini bisa dikenali bahkan sebelum HTTP dimulai. Kedua, header yang tidak lengkap — browser mengirim lusinan header dalam urutan tertentu; requests hanya mengirim beberapa, dan urutannya pun berbeda.
Ketiga, perilaku browser — properti seperti navigator.webdriver, ukuran layar, GPU, canvas fingerprint, dan WebGL berbeda pada browser otomatis. Keempat, ritme request — bot cenderung membombardir tanpa jeda alami. Anti-bot modern seperti Cloudflare menggabungkan semua sinyal ini menjadi skor risiko; begitu skor melewati ambang, kalian disambut halaman challenge atau status 403. Itulah mengapa URL yang sama bisa diakses manusia tapi menolak bot.
StealthyFetcher adalah jawaban Scrapling untuk masalah di atas. Ia mengendalikan browser sungguhan lewat Chrome DevTools Protocol (CDP) — protokol yang sama yang dipakai DevTools untuk berkomunikasi dengan browser — lalu menyuntikkan puluhan modifikasi anti-deteksi sehingga browser otomatis tidak bisa dibedakan dari browser normal. Pemakaiannya semudah fetcher lain:
from scrapling import StealthyFetcher
page = StealthyFetcher.fetch(
"https://example.com/proteksi",
headless=True,
network_idle=True,
)
print(page.status)
print(page.css("h1::text").get())StealthyFetcher.fetch{python} membuka browser, menjalankan semua script anti-deteksi, memuat halaman, dan mengembalikan objek Response yang bisa diseleksi seperti biasa. Perhatikan bahwa headless=True tetap bisa dipakai — stealth tidak bergantung pada menampilkan jendela, melainkan pada modifikasi fingerprint. Untuk debugging atau kasus yang sangat ketat, headless=False tersedia sebagai opsi.
Info
StealthyFetcher memakai browser khusus yang dimodifikasi (turunan Chromium/Firefox dengan patch anti-deteksi). Pastikan sudah menjalankan scrapling install untuk mengunduh browser ini beserta dependensinya sebelum pertama kali digunakan.
Sekilas bagaimana StealthyFetcher "menyamarkan" browser. Lewat CDP, ia memutar ulang semua sinyal yang dipakai anti-bot untuk menilai kalian. Sinyal itu antara lain:
navigator.webdriver, bahasa, platform, dan properti lain agar konsisten dengan browser manusia.Semua modifikasi ini bekerja otomatis; kalian tidak perlu mengkonfigurasi apa pun untuk penggunaan dasar. Untuk kontrol lebih dalam, Scrapling mengekspos opsi seperti block_webrtc=True untuk memblokir WebRTC, hide_canvas=True untuk menambah noise canvas, dan humanize=True untuk membuat interaksi browser terasa lebih manusiawi.
from scrapling import StealthyFetcher
page = StealthyFetcher.fetch(
"https://example.com/ketat",
headless=True,
network_idle=True,
block_webrtc=True,
hide_canvas=True,
humanize=True,
)Kombinasi di atas — memblokir WebRTC, menambah noise canvas, dan meniru perilaku manusia — menutup celah-celah terakhir yang biasa dipakai anti-bot untuk mendeteksi otomasi. Mulailah dari opsi default, dan aktifkan fitur tambahan hanya ketika website target mulai mencurigai kalian.
Inilah kartu truf StealthyFetcher: kemampuan menembus proteksi Cloudflare — termasuk Turnstile — tanpa konfigurasi rumit. solve_cloudflare=True membuat fetcher mendeteksi dan menyelesaikan tiga jenis challenge Cloudflare: JavaScript challenge, challenge interaktif (checkbox verifikasi), dan invisible challenge yang berjalan di latar belakang.
from scrapling import StealthyFetcher
page = StealthyFetcher.fetch(
"https://nopecha.com/demo/cloudflare",
headless=True,
solve_cloudflare=True,
)
print(page.status)Dengan solve_cloudflare=True{python}, fetcher menunggu sampai challenge teratasi dan halaman asli termuat sebelum mengembalikan respons. Yang lebih menarik, opsi ini juga tersedia dari command line untuk eksperimen cepat tanpa menulis kode:
scrapling extract stealthy-fetch \
"https://nopecha.com/demo/cloudflare" \
hasil.html \
--solve-cloudflare \
--css-selector "body"Perintah di atas menjalankan stealth fetch lewat CLI, menyelesaikan challenge Cloudflare, lalu menyimpan hasilnya ke file hasil.html. Flag --css-selector{bash} membatasi output hanya pada elemen yang dicari. CLI semacam ini sangat berguna untuk menguji apakah sebuah URL bisa ditembus sebelum kalian membangun spider penuh.
Danger
Kemampuan menembus Cloudflare adalah pedang bermata dua. Gunakan hanya pada website yang kalian miliki, website publik yang mengizinkan scraping, atau untuk tujuan penelitian yang jelas. Menembus proteksi untuk mengekstrak data secara melanggar syarat layanan atau hukum bisa berakibat blokir permanen hingga tuntutan hukum. Selalu patuhi robots.txt dan Terms of Service.
Setiap kali StealthyFetcher.fetch dipanggil, browser dibuka dan ditutup — itu mahal. Untuk mengambil banyak halaman dari domain yang dilindungi, gunakan session agar browser tetap hidup. Ini juga menjaga cookies Cloudflare tetap hangat, sehingga challenge tidak perlu diselesaikan ulang untuk setiap halaman.
from scrapling.fetchers import StealthySession
with StealthySession(headless=True, solve_cloudflare=True) as session:
for n in range(1, 6):
page = session.fetch(f"https://example.com/proteksi/hal/{n}", network_idle=True)
print(n, page.status)
page = session.fetch("https://example.com/proteksi/setelah-login")StealthySession{python} menjaga browser, cookies, dan state challenge dalam satu sesi. Setelah challenge pertama teratasi, halaman-halaman berikutnya biasanya langsung dimuat tanpa hambatan — itulah kenapa kombinasi session dan solve_cloudflare adalah pola produksi yang paling umum. Ada pula varian asinkron AsyncStealthySession(max_pages=4) yang mengelola kumpulan tab browser untuk konteks paralel.
StealthyFetcher bukan jawaban untuk segalanya. Aturannya sederhana: pakai fetcher paling ringan yang bisa menembus target. Mulai dengan Fetcher HTTP — cepat dan murah. Jika halaman butuh JavaScript, naik ke PlayWrightFetcher. Baru ketika website menunjukkan proteksi keras seperti Cloudflare, Turnstile, atau blokir berdasarkan fingerprint, panggil StealthyFetcher. Pendekatan bertingkat ini menjaga kecepatan dan sumber daya tetap optimal — browser stealth jauh lebih berat daripada HTTP biasa, jadi jangan memakainya untuk halaman yang sebenarnya ramah bot.
Episode 8 ini menuntaskan fase dasar fetching. Kalian sekarang paham kenapa request polos terdeteksi (TLS fingerprint, header, perilaku), bagaimana StealthyFetcher bekerja di atas Chrome DevTools Protocol dengan modifikasi anti-deteksi, cara menembus Cloudflare dan Turnstile lewat solve_cloudflare=True baik di Python maupun CLI, penggunaan StealthySession untuk banyak halaman, dan strategi memilih fetcher dari yang paling ringan hingga paling stealth.
Inti yang harus dibawa pulang:
StealthyFetcher mengendalikan browser via CDP dan menyuntikkan anti-deteksi otomatis.solve_cloudflare=True menuntaskan JavaScript, interactive, dan invisible challenge.scrapling extract stealthy-fetch dengan --solve-cloudflare berguna untuk uji cepat.StealthySession menjaga cookies dan state challenge agar halaman berikutnya cepat dimuat.Di episode 9 kita berpindah dari sisi fetching ke sisi parsing yang adaptif: auto-match dan adaptive selectors — selektor yang bisa menyesuaikan diri ketika struktur DOM website berubah, tanpa bantuan AI. Sampai jumpa!