Obscura: Headless Browser Rust untuk Web Scraping

Obscura: Headless Browser Rust untuk Web Scraping

Bitnesia Software Sep 10, 2026 1 EN

Setiap kali menjalankan puluhan headless browser untuk keperluan scraping atau AI agent, kita pasti pernah melihat RAM server langsung terkuras habis. Chrome memang andal untuk browsing manual, tapi saat dijalankan ribuan kali secara paralel di server, konsumsi memorinya jadi masalah nyata. Di sinilah Obscura masuk sebagai jawaban. Obscura adalah headless browser engine open-source berbasis Rust yang dirancang khusus untuk kebutuhan AI agent dan web scraping skala besar.

Masalah utama Chrome versi headless ada tiga: startup yang lambat (sekitar 2 detik per instance), konsumsi RAM yang boros (200 MB atau lebih per instance), dan risiko state bleeding, yaitu kebocoran data atau cookie antar-task saat banyak instance dijalankan bersamaan. Obscura mengatasi ketiganya lewat arsitektur native Rust: startup instan tanpa proses fork browser penuh, page load rata-rata 85 milidetik dibanding sekitar 500 milidetik pada Chrome, dan konsumsi memori hanya sekitar 30 MB per sesi. Obscura juga membawa fitur anti-deteksi bot bawaan, sesuatu yang tidak dimiliki headless Chrome secara default. Artikel ini membahas cara instalasi, penggunaan CLI, integrasi dengan Puppeteer/Playwright, stealth mode, sampai integrasi MCP untuk AI agent.

1. Obscura vs Headless Chrome

Sebelum masuk ke instalasi, penting untuk melihat perbandingan performa Obscura dan headless Chrome secara langsung. Tabel berikut merangkum angka yang dipublikasikan resmi di dokumentasi Obscura.

MetrikObscuraHeadless Chrome
Memori per sesi~30 MB200+ MB
Ukuran binary~70 MB300+ MB
Startup timeInstan~2 detik
Page load~85 ms~500 ms
Anti-detect bawaanAda (stealth mode)Tidak ada

Selisih memori ini terasa signifikan begitu kita bicara skala. Menjalankan 10 instance headless Chrome secara bersamaan bisa menghabiskan 2 GB RAM lebih, sementara beban kerja yang sama di Obscura hanya memakai sekitar 300 MB. Bagi developer yang menjalankan scraper di server dengan resource terbatas, perbedaan ini bisa menentukan berapa banyak worker paralel yang sanggup dijalankan tanpa membuat server kehabisan memori.

2. Instalasi dan Setup Obscura

Obscura didistribusikan sebagai satu binary statis, jadi tidak perlu instalasi Chrome, Node.js, atau dependency tambahan. Ada tiga metode instalasi yang bisa dipilih sesuai kebutuhan: unduh binary resmi, jalankan lewat Docker, atau build dari source code.

2.1 Unduh Binary Resmi

Cara paling cepat untuk mencoba Obscura adalah mengunduh binary resmi dari repository GitHub Obscura. Untuk Linux x86_64, jalankan langkah berikut:

  1. Unduh arsip binary dengan curl:
    curl -LO https://github.com/h4ckf0r0day/obscura/releases/latest/download/obscura-x86_64-linux.tar.gz
  2. Ekstrak arsip .tar.gz:
    tar xzf obscura-x86_64-linux.tar.gz
  3. Verifikasi instalasi dengan memeriksa versi:
    ./obscura --version

Untuk arsitektur lain, ganti nama file sesuai target: obscura-aarch64-linux.tar.gz untuk Linux ARM64, obscura-x86_64-macos.tar.gz untuk macOS Intel, dan obscura-aarch64-macos.tar.gz untuk macOS Apple Silicon. Di Windows, unduh file .zip dari halaman Releases, ekstrak, lalu jalankan obscura.exe --version lewat terminal.

2.2 Menjalankan Lewat Docker

Bagi sysadmin yang lebih terbiasa mengelola service lewat container, Docker adalah cara paling instan untuk menjalankan Obscura tanpa mengotori sistem host. Jalankan perintah berikut:

  1. Tarik dan jalankan container Obscura sekaligus, dengan port 9222 dipetakan ke localhost:
    docker run -d --name obscura -p 127.0.0.1:9222:9222 h4ckf0r0day/obscura
  2. Pastikan container berjalan normal:
    docker ps --filter name=obscura

Konfigurasi ini membuat Obscura langsung menerima koneksi Chrome DevTools Protocol di ws://127.0.0.1:9222, siap dipakai oleh Puppeteer atau Playwright tanpa konfigurasi tambahan.

2.3 Build dari Source Code

Opsi ketiga cocok untuk developer yang ingin mengaktifkan fitur rendering (screenshot, PDF) dan stealth tingkat lanjut, atau ingin build khusus untuk arsitektur tertentu. Build dari source membutuhkan Rust 1.75 ke atas.

  1. Clone repository resmi Obscura:
    git clone https://github.com/h4ckf0r0day/obscura.git
    cd obscura
  2. Build binary CLI dengan fitur rendering dan stealth sekaligus aktif:
    cargo build --release -p obscura-cli --bins --features render,stealth
  3. Binary hasil build akan tersedia di target/release/obscura.

Build pertama biasanya memakan waktu sekitar 5 menit karena harus mengompilasi seluruh dependency, termasuk V8. Build berikutnya jauh lebih cepat karena Cargo hanya mengompilasi ulang bagian yang berubah. Jika hanya butuh fitur inti tanpa rendering maupun stealth, cukup jalankan:

cargo build --release -p obscura-cli --bins --no-default-features

3. Web Scraping dengan Obscura CLI

Setelah binary siap, kita bisa langsung mencoba perintah dasar Obscura CLI untuk mengambil data dari halaman web.

3.1 Mengambil Judul Halaman

Perintah obscura fetch memuat sebuah halaman lalu menjalankan ekspresi JavaScript lewat flag --eval. Contoh berikut mengambil judul halaman:

obscura fetch https://example.com --eval "document.title"

Perintah ini mengembalikan hasil "Example Domain". Karena Obscura menjalankan JavaScript nyata lewat engine V8, kita juga bisa menulis ekspresi yang lebih kompleks, misalnya mengumpulkan seluruh link dalam satu function:

obscura fetch https://example.com --eval "(function(){
  const links = document.querySelectorAll('a');
  return Array.from(links).map(a => a.href);
})()"

3.2 Mengekstrak Link dan Assets

Untuk kebutuhan scraping yang lebih spesifik, flag --dump menyediakan beberapa mode output tanpa perlu menulis script JavaScript manual:

obscura fetch https://example.com --dump html      # HTML hasil render
obscura fetch https://example.com --dump text      # Teks polos halaman
obscura fetch https://example.com --dump links      # Semua URL dari tag <a href>
obscura fetch https://example.com --dump assets     # Resource eksternal (fetch/XHR)

Mode links dan assets sangat membantu saat kita perlu memetakan struktur sebuah situs sebelum melakukan scraping penuh, misalnya untuk mengetahui endpoint API mana saja yang dipanggil sebuah halaman lewat request fetch atau XHR.

3.3 Screenshot dan Render PDF

Fitur screenshot dan PDF membutuhkan binary yang dibuild dengan fitur render aktif. Untuk mengambil screenshot viewport halaman, gunakan flag --screenshot:

obscura fetch https://example.com --screenshot hasil.png

Untuk export PDF, gunakan klien Puppeteer atau Playwright yang terhubung ke Obscura lewat CDP, lalu panggil page.pdf() seperti biasa. Perlu dicatat, output PDF Obscura saat ini bersifat raster, sehingga teks di dalamnya belum bisa diseleksi seperti PDF hasil Chrome.

3.4 Scraping Paralel Skala Besar

Untuk scraping ratusan atau ribuan URL sekaligus, Obscura menyediakan subcommand obscura scrape yang membagi pekerjaan ke beberapa worker process secara paralel. Secara default, Obscura menjalankan 10 worker paralel:

obscura scrape --concurrency 20 --format json url1 url2 url3

Kita juga bisa menyalurkan daftar URL dari file lewat pipe:

cat urls.txt | obscura scrape --concurrency 20 -

Perintah ini membutuhkan binary obscura-worker tersedia di PATH yang sama dengan obscura, karena proses utama akan memanggil worker tersebut untuk tiap unit pekerjaan.

4. Integrasi Puppeteer dan Playwright

Salah satu kekuatan utama Obscura adalah dukungan penuh terhadap Chrome DevTools Protocol (CDP), sehingga developer yang sudah punya kode Puppeteer atau Playwright tidak perlu merombak logic scraping-nya. Kita cukup mengarahkan koneksi WebSocket ke Obscura, bukan ke Chrome.

Langkah pertama untuk kedua integrasi ini sama: jalankan Obscura dalam mode server.

obscura serve --port 9222

4.1 Koneksi Puppeteer

Karena kita menghubungkan ke instance browser eksternal (bukan meluncurkan Chrome baru), gunakan puppeteer-core, bukan puppeteer versi penuh:

const puppeteer = require('puppeteer-core');

const browser = await puppeteer.connect({
  browserWSEndpoint: 'ws://127.0.0.1:9222',
});

const page = await browser.newPage();
await page.goto('https://example.com');
console.log(await page.title());

4.2 Koneksi Playwright

Playwright menyediakan method chromium.connectOverCDP khusus untuk terhubung ke browser yang sudah berjalan lewat CDP:

const { chromium } = require('playwright');

const browser = await chromium.connectOverCDP('ws://127.0.0.1:9222');
const page = await browser.newPage();
await page.goto('https://example.com');
console.log(await page.title());

Pola koneksi seperti ini membuat tim developer bisa memindahkan scraper produksi dari Chrome ke Obscura hanya dengan mengganti target koneksi, tanpa menyentuh logic navigasi atau ekstraksi data yang sudah ada.

5. Mengaktifkan Stealth Mode

Saat scraper diarahkan ke situs yang punya sistem deteksi bot, headless Chrome standar sering ketahuan karena fingerprint-nya khas: navigator.webdriver bernilai true, kombinasi GPU dan resolusi layar yang seragam antar-instance, dan pola traffic yang mudah dikenali sistem anti-bot milik target. Stealth mode di Obscura dirancang untuk mengatasi celah-celah ini.

5.1 Cara Kerja Stealth

Saat diaktifkan, stealth mode mengacak sejumlah sinyal fingerprint per sesi, termasuk profil GPU, resolusi layar, hasil rendering Canvas, dan Audio API, sehingga setiap sesi browser terlihat seperti perangkat yang berbeda. Obscura juga mengatur navigator.webdriver menjadi undefined, meniru kondisi browser yang dijalankan manusia lewat GUI, bukan lewat automation.

5.2 Tracker Blocking

Selain fingerprint, stealth mode memuat blocklist berisi 3.520 domain analitik, iklan, dan fingerprinting yang dikenal luas. Request ke domain-domain ini langsung diblokir di level jaringan sebelum sempat dimuat, sehingga halaman terasa lebih ringan dan cepat karena tidak perlu menunggu script tracker pihak ketiga selesai dieksekusi.

5.3 Penerapan Praktis

Untuk mengaktifkan stealth mode, tambahkan flag --stealth pada perintah obscura fetch, obscura serve, atau obscura scrape:

obscura fetch https://target-situs.com --stealth --dump html

Perlu dicatat, fitur stealth hanya aktif jika binary dibuild dengan flag --features stealth seperti pada langkah build dari source sebelumnya. Secara teknis, mode ini juga mengganti transport TLS dari Rustls (default) ke BoringSSL lewat pustaka wreq, sehingga fingerprint TLS (urutan cipher, ALPN, ClientHello) menyerupai browser asli, bukan pustaka HTTP client generik yang sering dikenali sistem anti-bot.

Meski begitu, stealth mode Obscura punya batas. Berdasarkan dokumentasi resminya, fitur ini menangani deteksi bot dasar, tapi belum menembus challenge interaktif seperti Cloudflare, Datadome, Akamai Bot Manager, CAPTCHA, atau pembatasan berbasis rate limit per-IP. Untuk kasus semacam itu, sysadmin tetap perlu strategi tambahan seperti rotasi proxy residensial.

6. Integrasi MCP untuk AI Agent

Model Context Protocol (MCP) adalah standar terbuka yang memungkinkan aplikasi AI seperti Claude Desktop atau Cursor memanggil tool eksternal secara terstruktur. Obscura menyediakan server MCP bawaan yang mengekspos kontrol penuh atas browser sebagai kumpulan tool, sehingga AI agent bisa menavigasi, mengklik, mengisi form, dan membaca halaman web secara mandiri, tanpa kita menulis script otomasi manual.

6.1 Tool yang Diekspos

Server MCP Obscura mengekspos lebih dari 30 tool yang terbagi ke beberapa kategori:

  • Navigasi: browser_navigate, browser_back, browser_reload
  • Pembacaan halaman: browser_snapshot, browser_markdown, browser_extract, browser_search
  • Interaksi: browser_click, browser_fill, browser_type, browser_select_option
  • Operasi asinkron: browser_wait_for, browser_evaluate
  • Diagnostik: browser_network_requests, browser_console_messages
  • Output visual: browser_screenshot, browser_pdf
  • Manajemen state: browser_get_cookies, browser_storage_state
  • Manajemen tab: browser_tab_new, browser_tab_switch

Cakupan ini membuat AI agent bisa menjalankan alur kerja browser yang cukup kompleks, mulai dari login ke sebuah situs sampai mengekstrak data dari halaman hasil pencarian.

6.2 Konfigurasi Dasar

Server MCP Obscura mendukung dua mode transport: stdio untuk integrasi langsung dengan aplikasi desktop, dan HTTP untuk akses lewat jaringan. Untuk mode stdio, cukup jalankan:

obscura mcp

Untuk mode HTTP, misalnya saat Obscura dijalankan di dalam container dan perlu diakses AI agent dari mesin lain:

obscura mcp --http --port 3000 --host 0.0.0.0

Karena mode HTTP tidak punya autentikasi bawaan, sysadmin yang mengekspos transport ini di luar localhost wajib mengatur allowlist origin lewat environment variable OBSCURA_MCP_ALLOWED_ORIGINS, dan sebaiknya menempatkannya di belakang reverse proxy yang menegakkan autentikasi.

Untuk menghubungkan Obscura ke Claude Desktop, tambahkan konfigurasi berikut ke file claude_desktop_config.json (lokasinya di ~/Library/Application Support/Claude/claude_desktop_config.json pada macOS, atau %APPDATA%\Claude\claude_desktop_config.json pada Windows):

{
  "mcpServers": {
    "obscura": {
      "command": "/path/to/obscura",
      "args": ["mcp"]
    }
  }
}

Setelah file disimpan, restart Claude Desktop agar tool Obscura muncul dan bisa langsung dipanggil AI agent saat sesi percakapan berjalan.

7. Obscura vs Alternatif Lain

Obscura bukan satu-satunya opsi di ranah automation browser. Sebelum memutuskan, ada baiknya membandingkan posisinya dengan beberapa alternatif populer.

Browserless adalah layanan Chrome-as-a-service terkelola: kita tidak perlu mengurus infrastruktur browser sama sekali, tapi trade-off-nya biaya berjalan sesuai penggunaan dan tetap mewarisi konsumsi resource khas Chrome di sisi backend mereka. Cocok untuk tim yang ingin cepat jalan tanpa mengelola server sendiri.

ZenRows memposisikan diri sebagai scraping API lengkap dengan proxy rotation dan penyelesaian CAPTCHA bawaan, lebih ke arah layanan siap pakai ketimbang engine browser yang kita kontrol sendiri. Opsi ini lebih masuk akal saat target scraping punya proteksi anti-bot yang sangat ketat dan tim tidak ingin mengurus infrastruktur bypass-nya sendiri.

Sementara itu, Playwright atau Puppeteer standar yang menjalankan Chromium asli tetap jadi pilihan paling aman soal kompatibilitas rendering, karena menggunakan engine yang identik dengan Chrome produksi. Obscura menjadi pilihan tepat ketika efisiensi resource dan kecepatan startup jadi prioritas utama, terutama untuk beban kerja AI agent yang menjalankan banyak sesi browser singkat secara paralel di server sendiri.

8. Keterbatasan Obscura

Sebagai engine render independen, bukan Chromium asli, Obscura punya beberapa batasan yang perlu diketahui sebelum dipakai di produksi. Semua poin di bawah ini diambil dari dokumentasi resmi Obscura, bukan asumsi.

  • Satu V8 isolate untuk semua tab: seluruh halaman dalam satu sesi berbagi isolate V8 yang sama, sehingga JavaScript yang berat CPU di satu tab bisa memperlambat tab lain dalam sesi tersebut.
  • PDF belum sepenuhnya lengkap: output PDF bersifat raster, teksnya belum bisa diseleksi, dan fitur seperti tagged PDF, header/footer, outline, serta CSS paged media penuh belum diimplementasikan.
  • Web API belum selengkap Chromium: fitur seperti service worker, pemutaran media native, dan sejumlah Web API lain masih belum lengkap dibanding Chromium penuh.
  • Device emulation belum matang: simulasi perangkat mobile atau viewport khusus masih lebih terbatas dibanding Chromium.

Untuk halaman web modern yang sangat berat JavaScript atau bergantung pada Web API eksotis, rendering quirk di atas berpotensi muncul. Sysadmin dan developer sebaiknya menguji dulu halaman target di Obscura sebelum menggantikan Chromium sepenuhnya di pipeline produksi.

9. Kesimpulan

Obscura layak dipertimbangkan ketika kita mengelola proyek AI agent yang intensif memanggil browser, scraping ribuan halaman secara paralel, atau bekerja di server dengan resource terbatas. Efisiensi memori sekitar 30 MB per sesi dan startup instan membuatnya jauh lebih hemat dibanding menjalankan headless Chrome dalam skala besar, sementara dukungan CDP penuh menjaga kompatibilitas dengan kode Puppeteer dan Playwright yang sudah ada.

Sebaliknya, jika proyek kita sangat bergantung pada rendering yang identik dengan Chrome produksi, misalnya untuk visual regression testing atau halaman web yang memakai Web API kompleks, Playwright dan Puppeteer standar di atas Chromium asli masih jadi pilihan paling aman. Langkah paling praktis adalah mencoba Obscura langsung di proyek scraping atau AI agent yang sedang berjalan, membandingkan hasilnya dengan setup Chrome yang sudah ada, lalu memutuskan berdasarkan data konsumsi resource dan tingkat kompatibilitas di kasus nyata kita sendiri.

Dukung keberlanjutan tutorial open source Bitnesia melalui link di bawah ini.

Kirim Donasi

Related Posts