Lewati Cloudflare dengan Puppeteer
Titik awal
Saya ingin mengikis situs yang dilindungi oleh Cloudflare. Tanpa proxy, tanpa browser – tidak ada jalan keluar: 403 Forbidden
, jawaban kosong atau langsung cf-chl-bypass
. Jadi: browser tanpa kepala adalah suatu keharusan.
Sasaran: Memanggil halaman secara otomatis, membaca DOM, mengekstrak JSON. Tidak ada perayapan besar-besaran, hanya tarikan biasa.
⚙️ Pemilihan alat
saya memilih Dalang diputuskan karena:
- Pengaturan cepat
- Kontrol halaman dengan mudah melalui JS
- Tidak ada overhead seperti dengan Selenium + Webdriver
Saya menguji alternatif seperti Playwright atau undetected-chromedriver kemudian, tetapi pertama-tama: Puppeteer murni.
Masalah
- Cloudflare memblokir Chrome tanpa kepala
→ meskipun waktu tunggu hanya halaman kesalahan yang muncul navigator.webdriver = true
→ hapus sidik jari untuk deteksi bot- Agen pengguna & header hilang
→ Chrome tanpa gaya, konten kosong
Langkah-langkah solusi
1. Nonaktifkan tanpa kepala
const browser = await puppeteer.launch({ headless: false, args: ['--no-sandbox', '--disable-setuid-sandbox'] });
2. navigator.webdriver
menghapus
await page.evaluateOnNewDocument(() => { Object.defineProperty(navigator, 'webdriver', { get: () => false, }); });
3. Atur agen pengguna + header
await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64)...'); await page.setExtraHTTPHeaders({ 'accept-language': 'de-DE,de;q=0.9', });
4. Tambahkan waktu tunggu + periksa tangkapan layar
await page.goto(url, { waitUntil: 'networkidle2' }); await page.waitForTimeout(3000); await page.screenshot({ path: 'proof.png' });
5. Integrasikan proxy (jika IP diblokir)
const browser = await puppeteer.launch({ headless: false, args: [ '--proxy-server=http://user:[email protected]:8000', ], });
Apa yang saya pelajari
- Tanpa kepala = langsung diblokir, tidak peduli seberapa bagus headernya
navigator.webdriver
harus pergi, kalau tidak kamu tidak punya kesempatanwaitForTimeout
sering kali perlu menunggu JS dinamis
Bonus: Skrip minimal
const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch({ headless: false }); const page = await browser.newPage(); await page.setUserAgent('Mozilla/5.0...'); await page.evaluateOnNewDocument(() => { Object.defineProperty(navigator, 'webdriver', { get: () => false }); }); await page.goto('https://zielseite.com', { waitUntil: 'networkidle2' }); const html = await page.content(); console.log(html); await browser.close(); })();
Kesimpulan
Cloudflare memang menyebalkan, tetapi bukannya tidak bisa dibobol – dengan otomatisasi browser, Anda hampir selalu dapat melewatinya. Headless = keluar, header + delay = masuk.
Uji coba dari 04/2025 – dapat berubah jika Cloudflare menyesuaikan logika deteksinya.