← Blog'a dön

Obscura: Chrome'u Tahtından Eden Rust Tabanlı Headless Browser

Rust ile yazılmış Obscura headless browser: 30MB RAM, 85ms yüklenme, CDP uyumlu. Chrome yerine kullanabileceğiniz açık kaynak alternatif.

Obscura: Chrome'u Tahtından Eden Rust Tabanlı Headless Browser

Obscura: Chrome'u Tahtından Eden Rust Tabanlı Headless Browser

Web scraping ve otomasyon yapan geliştiriciler olarak hepimizin ortak bir dertleşme noktası vardır: Headless Chrome. Bellek tüketimi 200 MB'ı buluyor, başlatılması iki saniye sürüyor, anti-bot sistemleri tarafından anlık tespit ediliyor. Yüzlerce bağımsız kütüphane kuruyoruz, docker image'ı şişiyor, sunucu masrafları çığır gibi büyüyor. Obscura tam da bu noktada devreye giriyor. Rust ile yazılmış, tek binary dosyasından oluşan, CDP (Chrome DevTools Protocol) uyumlu bir headless browser. Bu yazıda Obscura'nın teknik altyapısını, headless Chrome ile karşılaştırmalı performans sonuçlarını, stealth (gizli) modunun işleyişini ve gerçek kullanım senaryolarını birlikte inceliyoruz. Kod örnekleriyle Puppeteer ve Playwright uyumluluğunu test ediyoruz.

Obscura Browser Logosu

Neden Obscura? Chrome'un Açık Verdiği Yerler

Chrome tabanlı headless browser kullanmak, günümüzde standart bir pratik. Ancak bu yaklaşımın örtülü maliyetleri var. İlk olarak bellek kullanımı: Puppeteer ile açtığınız her sayfa ortalama 200 MB RAM istiyor. Elli paralel işlem açtığınızda 10 GB bellek sadece browser'lar için ayrılıyor. İkinci olarak başlatma süresi: Her işlem öncesi Chrome'un çekirdek yüklemesi iki saniyeyi buluyor. Üçüncü olarak tespit edilebilirlik: navigator.webdriver bayrağı, Canvas fingerprint tutarsızlıkları ve eksik GPU profilleri sayesinde modern anti-bot sistemleri (DataDome, Cloudflare, PerimeterX) headless Chrome'u saniyeler içinde tanıyor.

Obscura bu sorunları kökten çözmeye odaklanmış. Rust ile yazılmış olması, bellek güvenliği ve performans açısından doğal bir avantaj sağlıyor. Rust'ın sahiplik (ownership) modeli sayesinde bellek sızıntıları ve use-after-free hataları derleme zamanında engelleniyor. Bu, uzun süre çalışan scraping işlemlerinde kritik. Önemli olan nokta ise tek bir binary dosya ile gelmesi. Node.js kurulumu, Chromium indirme süreci, sürüm uyumsuzlukları gibi dertler yok. cargo build --release komutu ile çalışır hale geliyor. Dağıtımı ise tek bir dosya kopyalamayla tamamlanıyor.

Karşılaştırmalı Performans: Sayılar Konuşsun

Obscura'nın GitHub deposunda yer alan karşılaştırma tablosu şöyle:

  • Bellek kullanımı: Obscura 30 MB, Chrome 200+ MB
  • Binary boyutu: Obscura 70 MB, Chrome 300+ MB
  • Sayfa yüklenme: Obscura 85 ms, Chrome 500 ms
  • Başlatma süresi: Obscura anlık, Chrome yaklaşık 2 saniye

Bu farklar sadece teorik değil. Statik HTML sayfalarında Obscura 51 ms'de tamamlarken, Chrome 500 ms civarında kalıyor. JavaScript ve XHR içeren dinamik sayfalarda Obscura 84 ms, Chrome 800 ms çekiyor. Yani yaklaşık on kat daha hızlı. Bu farkın temel sebebi, Obscura'nın masaüstü tarama için değil, otomasyon için tasarlanmış olması. Gereksiz görselleştirme katmanları, şifre çözme ara yüzleri, tarayıcı eklentisi desteği ve WebGL gibi yükleri taşımıyor. Bu tasarruflar bir araya gelince ortaya çıkan sonuç etkileyici.

Performans ve veri analizi grafiği

Teknik Altyapı: V8 ve CDP ile Neler Mümkün?

Obscura gerçek bir JavaScript motoru olan V8'i kullanıyor. Bu, sayfaların tamamen render edilebileceği anlamına geliyor. React, Vue veya Angular tabanlı tek sayfalık uygulamaların (SPA) içeriğini çekebiliyorsunuz. Sunucu taraflı render (SSR) yapmayan uygulamalarda bu yetenek hayati. Ayrıca Chrome DevTools Protocol (CDP) desteği sayesinde mevcut Puppeteer ve Playwright kodlarınızı değiştirmeden kullanabiliyorsunuz.

Desteklenen CDP domainleri şunlar: Target, Page, Runtime, DOM, Network, Fetch, Storage, Input ve özel olarak LP (DOM-to-Markdown dönüşümü). Fetch domaini üzerinden canlı istek engelleme (request interception) yapılabiliyor. Bu, belirli scriptleri, görselleri veya analitik kütüphaneleri sayfa yüklenmeden bloke etmek için kritik. Network domaini ile çerez yönetimi, ekstra HTTP header ekleme ve kullanıcı aracısı (user agent) değişikliği yapılabiliyor. Input domaini ise fare ve klavye etkileşimlerini simüle ediyor. Bu sayede form doldurma, tıklama ve kaydırma işlemleri programatik olarak gerçekleştirilebiliyor.

Obscura'nın mimarisi crate bazlı. Ana proje altında farklı crate'ler bulunuyor. Bu modüler yapı, sadece ihtiyaç duyulan özellikleri derlemeye olanak tanıyor. Stealth modu örneğin, --features stealth ile derlenince aktif oluyor. Böylece temel kullanımda daha hafif bir binary elde edebiliyorsunuz. Bu yaklaşım, Rust ekosistemindeki workspace yapısının gücünü gösteriyor.

Stealth Modu: Anti-Bot Sistemlerini Nasıl Atlatıyor?

Obscura'nın stealth modu sadece navigator.webdriver bayrağını kaldırmakla kalmıyor. Her oturum için GPU profili, ekran çözünürlüğü, Canvas fingerprint, AudioContext fingerprint ve pil durumu gibi özellikler rastgele oluşturuluyor. Yani her bağlantıda farklı bir cihaz profili sunuyorsunuz. Bu, fingerprinting tabanlı takip sistemlerini etkisiz kılıyor. FingerprintJS gibi kütüphaneler artık sizi tanıyamıyor.

Diğer bir önemli detay ise native function masking. Normalde headless browser'larda JavaScript fonksiyonlarının kaynak kodu incelendiğinde otomasyon izleri görülebilir. Obscura, Function.prototype.toString() çağrılarına [native code] döndürerek bu tespiti engelliyor. Bu basit görünen teknik, gelişmiş bot tespit sistemlerinin önemli bir kontrol noktasını devre dışı bırakıyor. Ayrıca event.isTrusted değerini gerçek kullanıcı etkileşimleriymiş gibi true olarak işaretleme yeteneği var. Bot tespit sistemleri, mouse hareketlerinin ve tıklamalarının insan davranışına uygunluğunu kontrol eder. Obscura bu kontrolleri aşıyor.

Tracker blocking özelliği de önemli. Varsayılan olarak 3.520 tracker domaini engelleniyor. Google Analytics, Facebook Pixel, Hotjar gibi analitik araçların scriptleri sayfaya hiç yüklenmiyor. Bu sadece gizlilik açısından değil, sayfa yüklenme süresini de dramatik şekilde kısaltıyor. Bir e-ticaret sitesini tararken gereksiz izleme scriptlerinin yüklenmesini beklemediğiniz için veri çekme hızınız artıyor. Ayrıca bu engelleme, reklam ağları tarafından IP adresinizin not edilmesini de önlüyor.

Güvenlik ve gizlilik konsepti

CLI Araçları: serve, fetch, scrape

Obscura sadece bir kütüphane değil, aynı zamanda kullanışlı CLI araçları sunuyor. obscura serve komutu ile CDP WebSocket sunucusu başlatılabiliyor. Varsayılan port 9222. Çalıştırdıktan sonra Puppeteer veya Playwright ile ws://127.0.0.1:9222 üzerinden bağlanabiliyorsunuz. --stealth bayrağı ile sunucuyu anti-tespit modunda çalıştırabilirsiniz. --workers parametresi ile paralel işlemci sayısını ayarlıyorsunuz. --obey-robots ise robots.txt kurallarına uymayı sağlıyor.

obscura fetch ile tek bir sayfayı hızlıca çekebiliyorsunuz. --eval bayrağı ile sayfa içinde JavaScript çalıştırıp sonucu döndürebiliyorsunuz. Örneğin obscura fetch https://example.com --eval "document.title" komutu sayfa başlığını getiriyor. --dump html ile tam render edilmiş HTML'i, --dump text ile sadece metni alabiliyorsunuz. --dump links ise sayfadaki tüm bağlantıları listeliyor. --wait-until networkidle0 ise AJAX isteklerinin tamamlanmasını bekliyor. SPA uygulamalarından veri çekerken bu bayrak hayat kurtarıcı. --selector ile belirli bir CSS seçicisinin görünmesini bekleyebiliyorsunuz.

obscura scrape ise toplu işlemler için tasarlanmış. Birden fazla URL'yi paralel olarak işleyebiliyor. --concurrency parametresi ile aynı anda kaç sayfanın taranacağını ayarlıyorsunuz. --format json ile sonuçları yapılandırılmış şekilde alabiliyorsunuz. Büyük ölçekli scraping işlemlerinde bu araç ciddi zaman kazandırıyor. CI/CD pipeline'ınıza entegre ederek otomatik veri toplama işlemleri kurabilirsiniz.

Puppeteer ve Playwright ile Gerçek Kullanım

CDP uyumluluğu sayesinde mevcut kodlarınızı taşımak çok kolay. Puppeteer kullanan bir projeniz varsa sadece puppeteer-core ile WebSocket endpoint'ini değiştirmeniz yeterli. Playwright için de benzer şekilde connectOverCDP metodunu kullanıyorsunuz. Bu geçiş süreci genellikle sadece bağlantı kodunu değiştirmekten ibaret.

Form gönderimi, oturum yönetimi ve çerez tabanlı kimlik doğrulama işlemleri Obscura'da tam olarak çalışıyor. POST isteklerini yönetiyor, 302 yönlendirmelerini takip ediyor ve çerezleri sürekli tutuyor. Bu, giriş gerektiren platformlardan veri çekerken kritik önem taşıyor. Örneğin bir e-ticaret panelinden sipariş verilerini çekerken oturumunuzun canlı kalması gerekir. Obscura bu süreci sorunsuz yönetiyor.

JavaScript tarafında şuna benzer bir kodla başlayabilirsiniz:

import puppeteer from 'puppeteer-core';

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

const page = await browser.newPage();
await page.goto('https://news.ycombinator.com');

const stories = await page.evaluate(() =>
  Array.from(document.querySelectorAll('.titleline > a'))
    .map(a => ({ title: a.textContent, url: a.href }))
);
console.log(stories);

await browser.disconnect();

Playwright ile de aynı kolaylık sağlanıyor. chromium.connectOverCDP metodu mevcut CDP uç noktasına bağlanıyor ve geri kalan kodunuz aynı şekilde çalışıyor. Bu uyumluluk, mevcut test ve scraping altyapılarınızı koruyarak geçiş yapmanıza olanak tanıyor.

Kurulum ve Derleme Süreci

Obscura'yı kullanmanın iki yolu var. İlki önceden derlenmiş binary'yi indirmek. GitHub Releases sayfasından Linux x86_64, macOS Apple Silicon, macOS Intel ve Windows için paketler mevcut. Tek yapmanız gereken arşivi açıp binary'yi çalıştırmak. Herhangi bir kurulum sihirbazı, bağımlılık yükleyici veya sistem yeniden başlatma işlemi gerekmiyor.

İkinci yol ise kaynak koddan derlemek. Rust 1.75+ gerekiyor. İlk derleme yaklaşık beş dakika sürüyor çünkü V8 kaynak kodundan derleniyor. Ancak bu sadece ilk seferlik. Sonrasında derleme önbelleği sayesinde çok daha hızlı. cargo build --release --features stealth komutu ile stealth modunu aktif ederek derleme yapabiliyorsunuz. Stealth modu olmadan derlerseniz binary biraz daha hafif oluyor. Hangi özellikleri kullanacağınıza göre seçim yapabilirsiniz.

Obscura Kime Uygun?

Obscura her türlü web scraping işlemine hitap etmiyor. Eğer ekran görüntüsü alma, PDF oluşturma veya karmaşık CSS animasyonlarının görselleştirilmesi gibi işlemler yapıyorsanız, hâlâ Chrome daha uygun olabilir. Çünkü Obscura tam bir render motoru yerine hafifletilmiş bir otomasyon motoru. Ancak veri çekme, form doldurma, oturum bazlı otomasyon ve AI ajanları için web içeriği okuma görevlerinde Obscura çok daha verimli.

Bulut sunucularında maliyet optimizasyonu yapanlar, paralel onlarca işlem çalıştıranlar ve anti-bot korumalarını geçmek zorunda olanlar için Obscura ciddi bir alternatif. Bellek kullanımındaki fark, özellikle container tabanlı altyapılarda (Kubernetes, Docker Swarm) daha fazla pod/şü çalıştırabilmenizi sağlıyor. Aynı donanım üzerinde üç kat daha fazla işlem koşturabilmek, bulut faturanızda direkt yansıyor.

Sonuç: Geleceğin Browser'ı mı?

Obscura, Rust ekosisteminin sistem programlamadaki gücünün web otomasyonuna taşınmasının güzel bir örneği. 2.2K yıldız ve 152 fork ile topluluk ilgisi oldukça yüksek. Apache 2.0 lisansı ile tamamen açık kaynak olması, ticari projelerde kullanım özgürlüğü sağlıyor. Henüz çok yeni bir proje olduğu için dikkatli yaklaşmakta fayda var. Issue listesi 11 adet, pull request sayısı 3. Üretim ortamında kullanmadan önce kendi kullanım senaryolarınızda test etmelisiniz.

Yine de sunulan performans rakamları ve stealth yetenekleri göz ardı edilemez. Headless Chrome'un yerini tamamen alacak mı? Kısa vadede hayır, çünkü ekosistem desteği ve topluluk birikimi farkı var. Ancak uzun vadede, özellikle maliyet ve gizlilik odaklı projelerde, Obscura ve benzeri araçlar pazarın önemli bir parçası haline gelebilir. Web scraping endüstrisi yıllardır Chrome'un tekelinden şikayet ediyordu. Obscura, bu tekele ilk ciddi meydan okuyuculardan biri.

Siz Obscura'yı denediniz mi? Web scraping için kullandığınız araçlar neler? Deneyimlerinizi aşağıdaki yorumlarda paylaşın. Daha teknik konuları tartışmak için efeozkan.com.tr üzerinden bana ulaşabilirsiniz. İyi araçlar, iyi kodlar. Ama unutmayın: her zaman etik sınırlar içinde kalın ve robots.txt kurallarına saygı gösterin.

Efe Hüseyin Özkan

Yazılım Mühendisi & AI Geliştirici

Yapay zeka sistemleri, full-stack geliştirme ve ölçeklenebilir ürün mimarisi üzerine çalışıyor. Daha fazla teknik yazı için blogu takip edebilirsiniz.