Botasaurus, Omkar Cloud tarafından geliştirilen bir Python web scraping framework’üdür ve kendisini scraper oluşturmak için hepsi bir arada bir paket olarak konumlandırır. Düz bir fonksiyon yazarsınız, onu @browser, @request ya da @task ile süslersiniz; framework de bunun etrafına tarayıcı sürücüsü, tarayıcı benzeri bir HTTP istemcisi, önbellekleme, paralel çalışma ve çok formatlı çıktı mekanizmasını kurar. Bu bir meta-package yapısıdır ve asıl önemli olan da budur: pip install botasaurus, ortamınıza tek bir kütüphane bırakmaz; bir dizi birinci taraf wheel’i ve geniş bir bağımlılık ağını birlikte getirir. Dürüstçe ölçebildiğim en ilginç detay da tam olarak bu mekanik yapı oldu.
Botasaurus kendini anti-detection odağıyla pazarlıyor; ancak bu inceleme tam da o eksende ilerlemiyor. Ben framework’ü envanterledim — ne kuruyor, ne import ediyor, hangi metotları sunuyor, ne kadar yer kaplıyor, hangi lisans altında dağıtılıyor — ama canlı bir savunma mekanizmasına karşı test etmedim. Aşağıdaki tüm footprint ve import sayıları pip çıktısından, python -c "import ..." komutlarından ve hiç sayfa getirmesi söylenmemiş ama oluşturulmuş sınıfları incelemekten geliyor; bunların hiçbiri için bir tarayıcı çalıştırmadım. Sonrasında tarayıcı açtım, ama yalnızca kendi yazıp 127.0.0.1 üzerinde servis ettiğim sayfalara karşı; sürücünün kendini nasıl tanıttığını ve JavaScript ile kendini oluşturan bir sayfadan içerik çekip çekemediğini görmek için. Hiçbir aşamada canlı bir web sitesi kullanılmadı, hiçbir anti-bot servisine bağlanılmadı ya da ölçüm yapılmadı ve hiçbir CAPTCHA ile etkileşime girilmedi. Gerçek sitelere karşı etkinlik kapsam dışı bırakıldı; bunu baştan açıkça söylemek, yapmadığım bir benchmark’ı ima etmekten daha doğru.
Bu çerçeveyle birlikte öne çıkan sonuç bir footprint hikâyesi ve bu, olumsuz değil. Temiz bir kurulum, her şeyin merkezindeki tarayıcı sürücüsü yaklaşık 4 MB iken, 44 paket boyunca toplam 122,3 MB’lık bir site-packages klasörü oluşturuyor. Framework ağır çünkü sürücü ağır; ağır çünkü “all-in-one” yaklaşımı, HTML çekme işi için numpy, lxml, gevent ve daha bir düzine şeyi de yanında getiriyor. Bulguların ikinci yarısı ise genelde avantaj diye sunulup aslında güvenilmeyecek bir sayı: import botasaurus yalnızca 0,08 ms sürüyor. Bu, yüzeyde son derece hafif bir framework gibi görünüyor; gerçekteyse boş bir ön kapıdan ibaret.
Botasaurus aslında nedir
Botasaurus — GitHub’da omkarcloud/botasaurus, 14 Temmuz 2026’da metadata’yı çektiğimde 5.561 yıldız, 486 fork ve 58 açık issue ile duruyordu — tek amaçlı bir kütüphane değil, bir Python framework’üdür. Test ettiğim sürümler, üst paket için botasaurus 4.0.97, altındaki motor için botasaurus-driver 4.0.92 idi. Meta-package tarafı requires-python >=3.7 ilan ediyor (driver tarafı >=3.5), PyPI classifier’ları ise yalnızca 3.11’e kadar destek iddiasında bulunuyor. Buna rağmen benim makinemde Python 3.14.2 üzerinde sorunsuz kuruldu ve import smoke test’inden geçti. Bu, bu kurulum için geçerli bir bulgudur; her özellik için evrensel uyumluluk garantisi değildir.
Kategori etiketini doğru yere koymak önemli; çünkü “iyi”nin ne anlama geldiğini o belirliyor. Botasaurus, Scrapy ve Crawlee ile aynı mahallede duran framework tarafında yer alıyor: yapısını, decorator’larını ve alışkanlıklarını benimsiyorsunuz; karşılığında altyapıyı o yönetiyor. Bu, size yalnızca Chrome DevTools Protocol bağlantısı veren ve geri çekilen nodriver gibi odaklanmış bir sürücüden farklı bir teklif. Botasaurus bir sürücü içeriyor (botasaurus-driver) ama bunu task runner, cache katmanı, çıktı serializer’ları ve request istemcisiyle sarıyor. Yani bir sürücü satın almıyorsunuz; içinde sürücü olan, belirgin görüşleri olan bir iş akışı satın alıyorsunuz.
Üç decorator bu tasarımın minyatür hâli ve üçü de gerçek giriş noktaları — botasaurus.browser.browser, botasaurus.request.request ve botasaurus.task.task hepsinin var olduğunu ve import edildiğini doğruladım. @browser, fonksiyonunuzu insan benzeri tarayıcı sürücüsü üzerinde çalıştırır. @request, tarayıcı formuna benzeyecek şekilde hazırlanmış hafif bir HTTP istemcisi üzerinde çalıştırır. @task ise ilk iki kategoriden net biçimde biri olmayan her şey için genel sarmalayıcıdır. Decorate edersiniz, Botasaurus etrafındaki mekanizmayı sağlar: paralel yürütme, sürücü yeniden kullanımı, sonuç önbellekleme ve JSON, CSV, Excel ile HTML yazıcıları. Tutarlı bir fikir. Bir scraper’ın etrafında bu kadar framework isteyip istemediğiniz asıl soru; bu da bir kusur değil, bir tercih meselesi.
Genel değerlendirme ve sınırları
Botasaurus yetkin, iyi şekillendirilmiş ve framework’lerin yapması gereken şeyi yapıyor: sık görülen senaryoyu kısaltıyor. Decorator modeli temiz. MIT lisansı gerçekten cömert. Kurulum da sorunsuz çalışıyor. API yüzeyinin ergonomisini puanlasaydım, iyi puan verirdi.
Ama sürekli dönüp baktığım nokta şu: framework’ün kendi manşet vaadi olan anti-detection, sorumlu bir inceleme tarafından ancak birinin production savunmalarına doğrultulmadan konuşulabilecek bir şey değil. Driver gerçekten de anti-detection etiketli açık bir API yüzeyi sunuyor; varlığını doğruladığım ama davranışını hiçbir hedef üzerinde test etmediğim metotlar bunlar. Bu konuda söyleyebileceğim tek şey bu. Sürücüyü korumalı bir siteye yönlendirmedim, başarı oranı ölçmedim, bir mekanizmayı tersine mühendislikle çözmedim ve hiçbir ifade tarzıyla bu üçünü ima etmeyeceğim. Metotlar sınıfın içinde var. Sahadaki davranışları ise bu incelemenin konusu değil.
Bundan sonrası bir kabiliyet, kurulum, kaynak kullanımı ve lisans envanteri; ayrıca sürücünün yalnızca benim kontrol ettiğim bir sayfada ne yaptığı. Bu, çoğu incelemeden daha dar bir iddia — ve tam da bunun için önemli.
Kendisi hakkında ne söylüyor

Gerçek bir savunma katmanına yaklaşmadan cevaplayabileceğiniz bir soru: Botasaurus bir tarayıcıyı çalıştırdığında, o tarayıcı baktığı sayfaya kendisi hakkında neleri açığa vuruyor? navigator.webdriver, user-agent, platform, diller, plugin ve donanım sayıları, window.chrome yapısı, Permissions API’nin söyledikleri, pencere ve ekran geometrisi gibi bariz sinyalleri okuyan bir sayfa yazdım; bunu 127.0.0.1 üzerinde servis ettim ve dört stack’i bunun üzerine gönderdim: Botasaurus, nodriver ve kontrol grubu olarak stock Playwright ile stock Puppeteer. Dördü de aynı Chrome sürümünü kullandı (Chrome for Testing 151.0.7922.10); dolayısıyla farklılıklar varsa bunlar tarayıcıdan değil kütüphaneden kaynaklanıyor. Headless ve headed modda, her biri üç kez. Aşağıdaki değerlerin hepsi üç denemede de aynı kaldı.
| Stack | Mod | navigator.webdriver | User-agent token | navigator.languages |
|---|---|---|---|---|
| Botasaurus 4.0.92 | headless | false | HeadlessChrome/151.0.0.0 | ["en-US"] |
| Botasaurus 4.0.92 | headed | false | Chrome/151.0.0.0 | ["en-US"] |
| nodriver 0.50.3 | headless / headed | false | HeadlessChrome/151 / Chrome/151 | ["en-US"] |
| Playwright 1.56.0 | headless / headed | true | HeadlessChrome/151 / Chrome/151 | ["en-US","en"] |
| Puppeteer 24.16.0 | headless / headed | true | HeadlessChrome/151 / Chrome/151 | ["en-US"] |
Farklar, hangi kontrolü kullandığınıza göre değişiyor. Stock Puppeteer’a karşı Botasaurus, navigator.webdriver değerini değiştirdi; dil listesi ve sıfır boyutlu pencere geometrisi aynı kaldı, user-agent yalnızca sürüm biçimlendirmesi açısından farklıydı. Stock Playwright’a karşı gözlenen farklar dil listesi ve pencere geometrisini de içeriyordu. Nodriver’a karşı boolean ve diller eşleşti; gösterilen alanlarda yalnızca user-agent biçimlendirmesi farklıydı. Bunlar anti-detection puanı değil, varsayılan ifşa gözlemleridir.
İki ayrıntı, çıplak false değerinden daha ilginç. Birincisi, değerin oraya nasıl geldiği. Dört stack’te de property, Navigator.prototype üzerindeki tarayıcının kendi native getter’ı olarak kalıyor — function get webdriver() { [native code] } — instance’a yapıştırılmış bir own-property ya da değiştirilmiş bir fonksiyon değil. Yani Botasaurus, sayfa yüklendikten sonra property’yi yeniden yazmıyor; değer tarayıcı başlatılırken belirleniyor ve property’nin kendisine dokunulmuyor.
İkinci ayrıntı, pazarlama iddiasını sınırlayan nokta. Headless modda Botasaurus’un user-agent’ı hâlâ HeadlessChrome/151.0.0.0 ilan ediyor — stock Puppeteer ile aynı, stock Playwright ile aynı. Headed modda Chrome/151.0.0.0 oluyor; bu da yine birebir aynı. Driver constructor’ı bir user_agent parametresi alıyor, yani bunu vermek bir keyword argument kadar kolay; ama varsayılan konfigürasyon browser automation dünyasının en bilinen kendini ele veren dizesini maskelemiyor.
Neredeyse her şey dört stack arasında aynıydı; bunu açık söylemek önemli çünkü hikâyeyi daraltıyor — aşağıdaki her özellik Botasaurus, nodriver, Playwright ve Puppeteer’da aynıydı:
| Özellik | Tüm stack’lerde aynı değer |
|---|---|
platform | MacIntel |
vendor | Google Inc. |
| Plugin sayısı | beş |
| MIME type sayısı | iki |
pdfViewerEnabled | true |
| Mantıksal çekirdek sayısı | on iki |
| Bildirilen cihaz belleği | 16 GB |
| Dokunma noktası | sıfır |
window.chrome | mevcut; app/csi/loadTimes var, runtime yok |
| WebGL renderer string’i | dört stack’te de aynı |
Eski Permissions API ile Notification.permission çelişkisi hiçbir yerde ortaya çıkmadı — dördü de default ve prompt değerlerini uyumlu biçimde verdi. Ayrıca document ve window üzerinde eski WebDriver stack’leriyle ilişkilendirilen cdc_ kalıntılarını da taradım: dördünde de boştu.
Dağıtıma geçmeden önce bilmeniz gereken son şey şu: Botasaurus, 122 MB olmasına rağmen bir tarayıcı göndermez ya da indirmez. find_chrome_executable() sizin makinenizde zaten kurulu olan Chrome’u bulur — bende /Applications/Google Chrome.app, sürüm 150.0.7871.187 — ve user-agent da tam olarak bu sürümü açıklar. Filonuzda hangi Chrome yüklüyse, stack de onu ilan eder. Bu kadar görüş sahibi bir framework için şaşırtıcı derecede görüşsüz bir varsayılan.
Bu ne, bu ne değil, net söyleyelim. Bu, hiç kimsenin saklanmasını istemediği bir otomatik stack’in neyi açığa vurduğunun kaydıdır — savunan taraftaysanız faydalıdır, kendi aracınızın ne yayınladığını merak ediyorsanız faydalıdır. Ancak herhangi bir hizmet için bunların önemli olup olmadığının ölçümü değildir. Ben bunu test etmedim; yukarıdaki hiçbir satır bir sonuç ima ediyor diye okunmamalı.
Bu fixture için daha affedici bir varsayılan okuma
Kendini ilan etmek bir şeydir; doğru HTML’yi döndürmek ise işin kendisi. Botasaurus’u bu benchmark deposundaki diğer tüm araçlarla aynı üç içerik sınıflı fixture üzerinde çalıştırdım; böylece sayılar burada ölçülen her başka araçla aynı eksene oturuyor. Sayfa üç şey içeriyor: A, sunulan baytların içinde kelimenin tam anlamıyla yer alan bir işaretçiyle statik bir bağlantı; B, parse sırasında inline script tarafından oluşturulan, işaretçisi ve URL’si parçalardan birleştirilen ve yalnızca JavaScript çalıştırıldığında ortaya çıkan bir düğüm; ve C, yükleme olayından 800 ms sonra aynı şekilde eklenen bir düğüm. Sınıf C adversarial olanıdır — load event anında yapılan bir okuma onu göremez.
| Stack | Varsayılan okuma | Açık bir bekleme ile |
|---|---|---|
| Botasaurus 4.0.92 | 3’ten 2’si (A + B, C yok) | 3’ten 3’ü |
| nodriver 0.50.3 | 3’ten 2’si | 3’ten 3’ü |
| Playwright 1.56.0 | 3’ten 2’si | 3’ten 3’ü |
| Puppeteer 24.16.0 | 3’ten 2’si | 3’ten 3’ü |
Botasaurus, büyük oyuncuların vardığı yere varıyor. driver.get() ardından doğrudan driver.page_html, load anında alınmış bir snapshot’tır: JavaScript’i düzgün işler — sınıf B bunu kanıtlar, çünkü sınıf B sunulan byte’larda hiçbir yerde yoktur — fakat 800 ms gecikmeli içeriği kaçırır. driver.wait_for_element("#delayed-injected") eklediğinizde üçü de gelir. Bu sonuç, üç tekrar ve bütün test setinin üç ayrı koşusunda da stabil kaldı; tek bir flake bile olmadı.
İlginç kısım, injection gecikmesini tarayıp her stack’in varsayılan okumasının ne zaman pes ettiğine baktığınızda ortaya çıkıyor:
| Sınıf C, şu gecikmeden sonra enjekte edildi | Botasaurus | nodriver | Playwright | Puppeteer |
|---|---|---|---|---|
| 0 ms | bulundu | bulundu | bulundu | bulundu |
| 100 ms | bulundu | — | — | — |
| 200 ms | bulundu | — | — | — |
| 300 ms | bulundu | — | — | — |
| 400 ms ve üzeri | — | — | — | — |
Diğer tüm stack’ler, injection load’dan 100 ms veya daha sonra geldiği anda sınıf C’yi kaybediyor. Botasaurus ise 300 ms’de hâlâ yakalıyor ve ancak 400 ms’de pes ediyor. Bunun nedeni constructor’da açık: wait_for_complete_page_load=True varsayılan olarak açık, bu yüzden get() boş bir load event’ten anlamlı biçimde daha geç dönüyor. Somut olarak, varsayılan okuma nodriver’ın 119–129 ms ve Puppeteer’ın 125–171 ms aralığında kaldığı yerde, 401–431 ms civarında duvar saati süresi tüketiyor.
Bu yerel gecikmeli enjeksiyon fixture’ında yapılan takas, navigasyon başına yaklaşık 250 ms’ye karşılık gelen daha geç bir varsayılan snapshot oldu. Bu sayede bu çalışmalarda load sonrası 300 ms’ye kadar enjekte edilen içerik yakalandı; ancak bu, Botasaurus’un her sitede daha doğru olduğu anlamına gelmez. Explicit wait condition yazmadan hızlı scraper’lar kuruyorsanız, bu tampon kaçırılan geç bir düğümü önleyebilir. Yüksek navigasyon hacminde ya da zaten belirli bir koşulu bekliyorsanız, bu yalnızca ek maliyettir.
Ölçek için iki zaman ölçümü daha. Tarayıcıyı ayağa kaldırma konusunda Botasaurus, nodriver ve Puppeteer ile neredeyse aynı seviyede, Playwright’ın ise belirgin biçimde gerisinde kaldı:
| Stack | Tarayıcı açılışı, tüm koşular boyunca |
|---|---|
| Botasaurus 4.0.92 | 986–1151 ms |
| nodriver 0.50.3 | 910–1583 ms |
| Puppeteer 24.16.0 | 969–1008 ms |
| Playwright 1.56.0 | 282–365 ms |
wait_for_element() ise 300 ms gecikmeye kadar ek bir maliyet getirmiyor — çünkü get() o zamana kadar zaten injection sonrasına taşmış oluyor — ardından 400–800 ms’de yaklaşık 1,42 s’ye ve 1500 ms’de 2,43 s’ye çıkıyor.
122 MB sorusu: Bir meta-package gerçekte ne kurar

İşin en faydalı kısmı aritmetik, çünkü size verebileceğim en işe yarar bilgi bu. Yeni bir sanal ortamda temiz bir pip install botasaurus, 44 dist-info paketine yayılan 122,3 MB’lık bir site-packages ağacı oluşturdu. İçinden pip’i çıkardığınızda — ki bu 10,9 MB ve Botasaurus’un talep ettiği bir şey değil, venv overhead’i — geriye yaklaşık 111 MB’lık framework ve bağımlılık kalıyor. Tarayıcı otomasyonunu fiilen yapan bileşen olan browser driver ise bunun yaklaşık 4 MB’ı. Demek ki geriye kalan yaklaşık 107 MB, meta-package’in sizin için gerekli olduğuna karar verdiği her şey.
Nereye gidiyor? Tek başına en ağır beş transitif bağımlılık, toplamın büyük bölümünü oluşturuyor (her satır artifacts/raw/runs/resource_baseline.run1.json içindeki bir install_footprint.heaviest_deps_mb girdisidir; toplamı ben ekledim, dosyada alan olarak yok):
| Paket | Diskte kapladığı alan |
|---|---|
| numpy | 30,9 MB |
| lxml | 19,2 MB |
| botasaurus_requests | 12,6 MB |
| gevent | 11,3 MB |
| pygments | 8,4 MB |
| Beş paketin toplamı | 82,4 MB (30,9 + 19,2 + 12,6 + 11,3 + 8,4) |
numpy’nin tek başına en büyük kalem olması beni kaşı kaldırmaya itti — sonuçta bu, web sayfalarını çekip ayrıştıran bir aracın içinde duran bir lineer cebir kütüphanesi. Elbette yanlış değil; framework’ler faydalı bağımlılıklarla büyür ve ağaçtaki bir şeyin dizi matematiğine ihtiyacı olduğu belli. Sadece bu iş için oldukça fazla makine.
Ölçek kıyası için, odaklanmış sürücü nodriver aynı makinede 6 paket boyunca yaklaşık 17,2 MB yer kaplıyor — kabaca 7x daha hafif. (Bu rakam bu paketten değil; kendi artifacts/raw/runs/resource_baseline.run1.json dosyasındaki install_footprint.site_packages_total_mb değeri ve aynı host üzerinde ayrı, aşamalı bir koşuda ölçüldü; 122,3 ÷ 17,2 = 7,1.) Bu sayıların hiçbiri bir kusur değil; bu, “her şey dahil” bir framework ile odaklanmış bir sürücü arasındaki mekanik maliyet farkı. Bir container içinde ölçülen site-packages footprint’i uygulama katmanına eklenir. Bu, tüm imaj boyutu değildir ve bu test build süresini ya da cold-deploy zamanını ölçmedi.
Bir başka footprint ayrıntısı daha: introspection sırasında from botasaurus.request import request ifadesinin ilk kullanımı, yaklaşık 12,8 MB’lık tek seferlik bir indirmeyi tetikledi. Yakalanan run, bu rakamı sabit bir kurulum footprint artışı gibi ele alacak kadar net bir artifact ve hedef göstermiyordu. Yine de bu kod yolunun ilk kullanımda ağ erişimi gerektirebileceğini gösteriyor; air-gapped bir dağıtımdan önce bunu kendi imajınızda yeniden üretmeniz iyi olur.
Yalan söyleyen import sayısı
Soğuk başlangıç import süreleri, sayıların kolayca yanlış okunabildiği yerdir. Yedi temiz subprocess import boyunca ölçüldüğünde, üst seviye import botasaurus medyan 0,08 ms çıktı. Bunu tek başına alıntılarsanız, kategorideki en hafif framework gibi görünür.
Öyle değil. Hızlı çünkü orada neredeyse hiçbir şey yok. Üst seviye botasaurus paketi __version__ sunmuyor ve neredeyse boş bir public namespace’e sahip — import işlemi neredeyse hiç iş yapmıyor çünkü paketin içinde neredeyse hiçbir şey yok. CLI aracı ya da serverless cold start için asıl önemli olan import, motoru almak: from botasaurus_driver import Driver yaklaşık 135 ms sürüyor ve koşular arasında birkaç milisaniye içinde stabil kalıyor. İşte bir sayfa bile çekilmeden önce ödediğiniz gerçek sabit maliyet bu. Motor modülü import edildikten sonra resident memory yaklaşık 29–30 MB seviyesinde kalıyor — yine, ortada bir Chrome process’i yokken. Gerçek bir tarayıcı başlatırsanız bu önemli ölçüde artar; çalışan bir tarayıcıyla memory ölçmedim, bu yüzden rakam vermeyeceğim.
Buradaki ders küçük ama keskin: import botasaurus’un anlık olması, framework’ün ucuz olduğu anlamına gelmez; üst seviye paketin içinin boş olması anlamına gelir. Cold start boyutlandırıyorsanız, gerçekten bağımlı olacağınız import’u ölçün.
API şekli: boş bir ön kapının arkasında 99 metot

Motorun Driver sınıfı 99 public metot sunuyor — navigasyon, element sorguları, çerezler ve local storage, fare ve klavye aksiyonları, ekran görüntüleri, sekme yönetimi, CDP passthrough ve dosya yüklemelerini kapsayan geniş bir yüzey. Constructor 18 parametre alıyor; bu da ayarlanabilir alanın makul bir haritası: headless, proxy, profile, tiny_profile, block_images, block_images_and_css, wait_for_complete_page_load, chrome_executable_path, extensions, arguments, user_agent, window_size, lang ve birkaç tane daha. Kurulum anı API’si olarak olağan browser-wrapper kontrollerini kapsıyor.
Ama üst seviyedeki şekil tuzağı, zararsız olsa da gerçek. import botasaurus, size neredeyse boş bir namespace veriyor — __version__ yok, üst seviyede hemen hiç public isim yok. Gerçekte kullandığınız her şey alt modüllerde: from botasaurus.browser import browser, Driver, from botasaurus.request import request, from botasaurus.task import task. Çalıştırdığınız build’i loglamak için botasaurus.__version__ ararsanız bulamazsınız; importlib.metadata kullanmanız gerekir. Bunun hiçbir şeyi bozduğu yok. Sadece çoğu Python geliştiricisinin içgüdüsel olarak beklediği düzen bu değil; bunu bilmek ilk gün kafanızın karışacağı beş dakikayı kurtarır.
Daha önce işaret ettiğim metotlar hakkında bir dokümantasyon gözlemi de burada geçerli ve sınırımın içinde kalıyor: var olan anti-detection isimli metotların yalnızca 2 tanesi kod içi docstring taşıyor. Geri kalanlar yalnızca isimleriyle kendini anlatıyor; metot başına açıklama ise kurulu kaynakta değil, harici dokümantasyon sitesinde yer alıyor. Bu, yerellik notu; kalite hükmü değil — birçok iyi kütüphane açıklamasını kodun dışında tutar — ama çalışma biçiminiz “metodu anlamak için kaynak kodu okuyayım” ise, bu yüzeyin çoğu size yalnızca adını söyleyecektir.
Lisans: motor da dahil olmak üzere her yerde MIT
Hem meta-package hem de botasaurus-driver MIT lisansı taşıyor; standart License :: OSI Approved :: MIT License classifier’ı da ekli. MIT permisif bir lisans: copyleft yükümlülüğü yok, kendi kodunuzu açma zorunluluğu yok, ticari kullanım için düşük sürtünme. Bu, komşu anti-detect sürücü nodriver’ın AGPL-3.0 ile gelmesiyle gerçek ve küçümsenmeyecek bir fark yaratıyor — ağ kullanımı maddesi birçok hukuk ekibini tedirgin eden bir copyleft lisansı. Lisans sizin için bir engelse, Botasaurus’un MIT yaklaşımı gerçekten artı hanesine yazılır.
Ama burada yine meta-package yapısının getirdiği bir not var. Bu izinli MIT, Botasaurus’un kendi birinci taraf wheel’leri için geçerli. Kurulumun çektiği yaklaşık 40 transitif paketin her birinin kendi lisansı olduğunu otomatik olarak garanti etmez. Omkar Cloud’un yayınladığı paketlerde üst seviye MIT’yi doğruladım; ağaçtaki her bağımlılığın lisansını tek tek denetlemedim. Hobi projesinde bu ayrım genelde önemsizdir. Ancak yazılım bileşen envanteriyle ilgilenen bir şirkette tüm ağacı benimsemek istiyorsanız, bu 40 paketlik yapı kendi lisans tarayıcınızdan geçirilmeden “tamamdır” denecek bir şey değildir — çünkü sorun bulduğum için değil, bakmadığım için; ve meta-package tam da beklenmedik lisansların saklandığı yerdir.
Artılar ve eksiler
Artılar:
- Temiz üç-decorator tasarımı (
@browser/@request/@task), üç giriş noktası da doğrulandı — framework sıradan işi kısaltıyor. - Meta-package ve driver tarafında MIT lisansı var; bu, benzer bir sürücünün AGPL-3.0 lisansıyla gelen yapısına karşı gerçek bir avantaj. Permisif, ticari kullanıma uygun, copyleft yok.
- Geniş bir sürücü yüzeyi: 99 public metot ve olağan browser automation ihtiyaçlarını kapsayan 18 parametreli constructor.
- PyPI classifier’larının ötesinde Python 3.14.2 ve 3.12.13 üzerinde kuruldu ve import smoke test’inden geçti; runtime uyumluluğu kanıtlanmadı.
- Ölçtüğüm tüm stack’ler arasında varsayılan okuma için en geniş doğruluk penceresi: load’dan 300 ms sonra enjekte edilen içeriği hâlâ yakalıyor; nodriver, Playwright ve Puppeteer ise 100 ms’de kaybediyor.
wait_for_complete_page_load=Truegerçekten iş görüyor. - Varsayılan olarak
navigator.webdriverdeğerini stock kontrollere karşıtruedeğilfalsedöndürüyor; üstelik property’yi yamalamadan — descriptor tarayıcının kendi native getter’ı olarak kalıyor. - Tasarıma gömülü “batteries included” yaklaşımı — cache, paralellik, sürücü yeniden kullanımı ve JSON/CSV/Excel/HTML çıktıları framework’ün parçası.
Eksiler:
- Diskte ağır: 44 paket boyunca 122,3 MB; yaklaşık 7x daha ağır bir footprint. Bunun nedeni sürücünün kendisi değil, numpy (30,9 MB) ve lxml (19,2 MB) gibi bağımlılıklar.
- Rahatlatıcı görünen 0,08 ms’lik üst seviye import yanıltıcı; gerçekten bağımlı olduğunuz motor import’u yaklaşık 135 ms ve import sonrası bellek tarayıcı başlamadan önce 29–30 MB civarında.
- Daha geniş varsayılan okuma penceresi bedava değil: aynı sayfada ve aynı Chrome’da, hafif bir sürücüye göre navigate-and-read başına 401–431 ms, yani 119–129 ms’ye karşı ciddi bir gecikme.
- Headless çalıştırmalarda user-agent varsayılan olarak hâlâ
HeadlessChromediye bağırıyor; bu, stock kontrollere birebir benziyor.user_agentconstructor parametresi var, ama onu sizin yerinize ayarlayan hiçbir şey yok. - 122 MB olmasına rağmen bir tarayıcıyla gelmiyor — host’ta zaten kurulu olan Chrome’u kullanıyor; dolayısıyla açıklanan tarayıcı sürümü, filonuzda hangi sürüm varsa o.
@request’in ilk kullanımı bu koşuda yaklaşık 12,8 MB’lık tek seferlik bir indirme tetikledi; artifact ve hedef, bunun kalıcı bir footprint artışı olduğunu söyleyecek kadar net değildi.- Üst seviye paket neredeyse boş ve
__version__sunmuyor; gerçek API ve sürüm daha az görünür bir yerde. - Anti-detection isimli metotların çoğunda kod içi docstring yok; yani kaynak kod size davranışı değil, adı söylüyor.
Bu sayıların kapsamadığı ve dolayısıyla burada test edilmemiş alanlar: gerçek dünya anti-bot etkinliğinin her şeyi (tasarım gereği kapsam dışı), sayfa başına bellek, proxy ve profil yönetimi, ölçekte throughput ve macOS arm64 dışındaki herhangi bir platform. Footprint ve import ölçümleri hiç tarayıcı çalıştırılmadan üretildi; geri çağırma ve ifşa ölçümleri ise yalnızca 127.0.0.1 üzerindeki bir fixture ile konuşan tarayıcılardan geldi.
Kimler için uygun, kimler uzak durmalı
Hazır bir parça yerine bir framework istiyorsanız Botasaurus size uyar. Sıfırdan bir scraping projesine başlıyorsanız ve bir yapı icat etmek yerine bir yapı benimsemek istiyorsanız — giriş noktaları için decorator’lar, önbellekleme ve paralellik hazır, çıktı yazıcıları gömülü — bu tutarlı ve MIT lisanslı bir seçenek. MIT izin vericidir, ama kullanım ve dağıtım modeliniz yine de normal uyumluluk incelemesini hak eder. Scrapy ya da Crawlee düşünmeye alışık ekipler, burada da benzer bir çerçeve bulacaktır.
Boyut hassassa, ya da en azından iki kez düşünün. numpy ve gevent gibi paketleri içeren 122 MB’lık bir kurulum, gerçek ihtiyacınız yalnızca “tarayıcıyı sür ve birkaç alanı çek” iken hafif bir container’a taşımak için çok şeydir. Odaklanmış bir sürücü, otomasyonu ağırlığın çok küçük bir kısmına indirir; bedeli ise etrafındaki altyapıyı sizin yazmanızdır. Ve eğer aradığınız şey anti-detection etkinliği hakkında bir karar ise, tamamen uzak durun; çünkü ben tam da o kısmı bilerek test etmedim — doğrulamadığım ve çürütmediğim bir pazarlama iddiasına güvenmiş olursunuz.
Alternatifler ve Thunderbit’in yeri
Önce dürüst çerçeve: Botasaurus ücretsizdir, MIT lisanslıdır ve self-hosted çalışır. Filoyu siz yönetirsiniz, güncellemeleri siz yaparsınız ve patch’leme, lisans uyumu ve numpy’nin gelecekteki sürümlerde ne yapacağı dahil tüm bağımlılık ağının sahibi siz olursunuz — 44 paketin tamamının. Birçok ekip için tam da istedikleri şey budur ve yönetilen hiçbir servis, doğrudan maliyette “zaten sahip olduğunuz bir framework” ile yarışamaz.
Açık kaynak içinde faydalı kıyaslar şekle göre yapılır. Botasaurus ile framework tarafındaysanız, Scrapy ve Crawlee onun karşısına koymaya değer doğal rakiplerdir — olgun, görüş sahibi ve her birinin benimsenmesi gereken kendi alışkanlıkları vardır. Bir crawler iskeleti yerine sayfadan LLM-ready Markdown almak istiyorsanız, Crawl4AI ve içerik odaklı Trafilatura bu iş için daha doğrudan tasarlanmıştır. Python ve anti-detect yaklaşımını sevip meta-package’tan daha hafif bir şey istiyorsanız, Scrapling bakmaya değer; derlenmiş bir dil de masadaysa, Go kütüphanesi Colly JavaScript render etmeyi bırakıp hız ve küçük footprint kazanır. Botasaurus dahil tüm browser-driving seçenekleri, Playwright ve Puppeteer karşılaştırmamızın çizdiği maliyet profilini taşır — gerçek tarayıcılar çalıştırmak ucuz değildir; etraflarındaki framework’ün neden bu kadar ağır olduğunun bir parçası da budur.
Yönetilen bir API’nin girdiği nokta, aynı hattın başka bir yeridir. Botasaurus self-hosted geliştirici yığınıdır; Thunderbit ise aynı geliştiricileri hedefleyen yönetilen yığını satar. Open API iki uç noktadan oluşur. POST /distill (1 credit), sayfayı temiz, LLM-ready Markdown olarak döndürür; rendering ve anti-bot işlemleri sunucu tarafında halledilir, böylece siz bir tarayıcı ya da bağımlılık ağını hiç kurmazsınız. POST /extract (20 credit), tanımladığınız JSON Schema’ya karşı yapılandırılmış JSON döndürür; sayfanın ne kadar tarayıcıya ihtiyaç duyduğuna bağlı olarak renderMode none, basic veya full olabilir. İkisi için de yüz URL’ye kadar batch sürümleri var. Ajanlar ve kod asistanları için bir MCP sunucusu mevcut — thunderbit_suggest_fields ücretsizdir ve bir sayfanın ne sunduğunu, hiçbir şey harcamadan önce söyler. Cron ve CI için npx @thunderbit/thunderbit-cli üzerinden CLI de var. Bunlara dokunmak istemeyen geliştirici olmayan kullanıcılar için Chrome extension aynı motoru no-code bir araç olarak çalıştırır; Thunderbit’in YouTube kanalı da yaygın iş akışlarını anlatır.
Takas, hangi aracın daha iyi olduğu değil, işin nerede yapıldığıdır. Botasaurus framework’ü, tarayıcı filosunu, bağımlılıkları, altyapıyı ve bakımı sizin tarafınızda bırakır; istek başına vendor ücreti yoktur. Ama compute, bandwidth, proxy ve operasyon yine para ister. Yönetilen API ise rendering ve şema biçimli çıktıyı omuzlarınızdan alır ve çağrı başına ücretlendirir — bunu fiyatlandırma sayfasına bakarak self-hosted kurulumla kıyaslayabilirsiniz.
Web Verisi Çekmek İçin Thunderbit’i Deneyin
Nihai karar
Botasaurus, hepsi bir arada bir Python framework’ü istiyor ve bağımlılık footprint’ini kabul ediyorsanız makul bir aday. Üç-decorator tasarımı temiz, driver yüzeyi geniş ve classifier’larının iddia ettiğinden daha yeni Python sürümlerinde kurulum ile import smoke test’inden geçti. Yerel fixture’ımda varsayılan snapshot, load’dan 300 ms sonra enjekte edilen içeriği de yakaladı; diğer test edilen stack’ler bunu 100 ms’de kaçırıyordu. Bu, fixture sonucu; genel bir sıralama değil.
Ama iddiaları doğru boyutlandırın. Bu, driver’ın yaklaşık 4 MB, geri kalanının ise numpy, lxml, gevent ve benzeri olduğu 122 MB’lık, 44 paketli bir kurulum — yani odaklanmış bir sürücüye göre yaklaşık 7x ağır; bu ağırlık hem container imajınıza hem cold-deploy sürenize yansır. 0,08 ms’lik üst seviye import, hafif bir framework değil, boş bir ön kapıdır; gerçek faturayı çıkaran yaklaşık 135 ms’lik motor import’udur. O yumuşak varsayılan okuma da her navigasyonda yaklaşık 250 ms maliyet ekler. Ve gerçekten cevap verebildiğim varsayılan ifşa sorusunda tablo, pazarlamanın ima ettiğinden daha dardır: stock Puppeteer’a göre yalnızca bir boolean farklıdır, headless user-agent hâlâ HeadlessChrome der ve ölçtüğüm diğer her özellik dört stack arasında aynıdır. Aracı satmak için kullanılan anti-detection vaadi ise bu incelemenin puanlamadığı tek şeydir — bu metotların var olduğunu doğruladım, sürücüyü kendi makinemdeki bir sayfaya karşı çalıştırdım ve orada durdum; bilerek. Footprint’i bilin, aldatıcı import sayısını görmezden gelin ve stealth pazarlamasını açık bir soru olarak kabul edin; o zaman Botasaurus, bir framework’ün yapması gereken şeyi yapan adil bir framework olarak kalır. Bir tüy kadar hafif sürücü bekliyorsanız, docker build süresi sizi şaşırtır.
Web Verisi Çekmek İçin Thunderbit’i Deneyin Get Started Free
Sık Sorulan Sorular
Botasaurus ücretsiz mi ve hangi lisansla geliyor?
Evet, ücretsiz ve MIT lisanslıdır — hem botasaurus meta-package’i hem de botasaurus-driver motoru OSI onaylı MIT classifier’ını taşır. MIT permisif bir lisans olduğundan copyleft yükümlülüğü yoktur ve ticari kullanıma uygundur; bu, benzer anti-detect sürücülerin AGPL-3.0 ile gelmesine kıyasla önemli bir farktır. Ancak bir uyarı: MIT, Omkar Cloud’un kendi paketlerini kapsar; kurulumun çektiği yaklaşık 40 transitif bağımlılığı otomatik olarak kapsamaz. Bu yüzden bütün ağacı kurumsal olarak benimsemeden önce kendi lisans taramanızı yapın.
Botasaurus kurulumu ne kadar büyük ve import botasaurus neden yine de anlık gibi görünüyor?
Temiz bir pip install botasaurus, benim makinemde 44 paket boyunca 122,3 MB’lık bir site-packages ağacı oluşturdu. Browser driver’ın kendisi yalnızca yaklaşık 4 MB; ağırlık, meta-package’in geniş bir bağımlılık ağını getirmesinden kaynaklanıyor. Başını çekenler numpy (30,9 MB), lxml (19,2 MB), botasaurus_requests (12,6 MB), gevent (11,3 MB) ve pygments (8,4 MB). Aynı makinede nodriver gibi odaklanmış bir sürücüye göre yaklaşık 7x footprint. Buradaki hiçbir şey bir kusur değil; bu, “batteries included” yaklaşımının bedeli ve en çok da container imaj boyutunda hissediliyor. Import süresi bu footprint’in gizlendiği yer: import botasaurus yaklaşık 0,08 ms ölçülüyor, ama bunun nedeni üst seviye paketin neredeyse boş olması — __version__ yok, public isimler neredeyse yok, dolayısıyla import neredeyse hiçbir şey yapmıyor. Sizi gerçekten ilgilendiren import ise motor: from botasaurus_driver import Driver yaklaşık 135 ms sürüyor; bunun ardından, herhangi bir browser başlamadan önce resident memory yaklaşık 29–30 MB. Serverless cold start boyutlandırıyorsanız, üst seviye boş import’u değil motor import’unu ölçün.
Botasaurus kendisi hakkında ne açığa vuruyor ve gerçek anti-bot sistemlerine karşı test edildi mi?
İlk kısım ölçüldü; ikinci kısım ise bilerek ölçülmedi. 127.0.0.1 üzerinden servis ettiğim bir sayfada, kontrol grubu ile aynı Chrome build’i kullanılırken: navigator.webdriver false dönüyor; stock Playwright ve stock Puppeteer ise true veriyor. Bu değer property’yi yamalayarak değil, tarayıcı açılışında ayarlanıyor — descriptor hâlâ Chrome’un kendi native getter’ı. Bu boolean dışında neredeyse her şey kontrol gruplarıyla aynıydı: platform string’i, beş plugin, on iki çekirdek, 16 GB bildirilen cihaz belleği, aynı window.chrome şekli, Permissions API çelişkisi yok, document ve window üzerinde cdc_ tarzı kalıntı yok. Headless çalıştırmalarda user-agent hâlâ HeadlessChrome/151.0.0.0 diye duyuruluyor; bu da iki kontrol grubunda da aynı. Driver constructor’ında user_agent parametresi var, ama onu sizin yerinize ayarlayan bir şey yok. Etkinliğe gelince: sürücüyü hiçbir zaman canlı bir siteye yönlendirmedim, bir anti-bot servisine bağlanmadım ve CAPTCHA ile etkileşmedim. Sürücüde anti-detection isimli bir grup metot var; varlıklarını doğruladım, ama bunları hiçbir hedef üzerinde çalıştırmadım, davranışlarını ölçmedim ya da bir mekanizmayı tarif etmedim. Yukarıdaki ifşa tablosu size stack’in ne söylediğini anlatır; kimlerin dinlediğini ya da ne yaptığını değil.
Botasaurus JavaScript ile render edilen içeriği doğru işliyor mu?
Evet, ayrıca varsayılanı çoğu araçtan daha affedici. Üç içerik sınıflı bir fixture üzerinde driver.get() + driver.page_html, 800 ms enjeksiyon gecikmesinde 3’ten 2’sini döndürdü — JavaScript’i doğru çalıştırıyor, ama çok geç gelen içeriği okumadan önce snapshot alıyor — ve driver.wait_for_element() 3’ten 3’ünü verdi. Fark yaratan nokta, varsayılan okumanın ne zaman pes ettiği: Botasaurus, load’dan 300 ms sonra enjekte edilen içeriği hâlâ yakalıyor; nodriver, Playwright ve Puppeteer ise bunu 100 ms’de kaybediyor. Bunun sebebi constructor’daki wait_for_complete_page_load=True; bedeli de navigasyon başına yaklaşık 250 ms.
Kurulumdan sonra Botasaurus’u nasıl import edip kullanırım?
Muhtemelen tahmin ettiğiniz gibi değil. Üst seviye botasaurus namespace’i neredeyse boş, bu yüzden gerçek API alt modüllerde: from botasaurus.browser import browser, Driver, from botasaurus.request import request ve from botasaurus.task import task. Düz bir fonksiyonu @browser, @request ya da @task ile süslersiniz; framework çevresindeki sürücü, cache ve çıktı işini halleder. botasaurus.__version__ olmadığı için, hangi build’i çalıştırdığınızı loglamak istiyorsanız importlib.metadata kullanın.


