Ulasan Botasaurus: Driver 4 MB, Instalasi 122 MB, dan Angka 0,08 ms yang Sebaiknya Tidak Anda Kutip

Terakhir diperbarui pada August 14, 2026
Ulasan Botasaurus: Driver 4 MB, Instalasi 122 MB, dan Angka 0,08 ms yang Sebaiknya Tidak Anda Kutip
Ringkasan AI

Botasaurus adalah framework web scraping berbasis Python dari Omkar Cloud yang dipasarkan sebagai paket all-in-one untuk membangun scraper. Anda cukup menulis fungsi biasa, lalu menambahkan dekorator @browser, @request, atau @task, dan framework ini akan merangkai driver browser, HTTP client yang menyerupai browser, caching, paralelisme, serta output multi-format di sekelilingnya. Ini adalah meta-package, dan justru itu inti ceritanya: pip install botasaurus tidak hanya memasang satu library ke lingkungan Anda, melainkan menyusun satu keluarga kecil wheel milik mereka sendiri beserta pohon dependensi turunan yang cukup besar. Detail mekanis ini justru menjadi hal paling menarik yang bisa saya ukur dengan jujur.

Botasaurus adalah framework web scraping berbasis Python dari Omkar Cloud yang dipasarkan sebagai paket all-in-one untuk membangun scraper. Kamu cukup menulis fungsi biasa, lalu menambahkan dekorator @browser, @request, atau @task, dan framework ini akan menyusun driver browser, HTTP client yang menyerupai browser, caching, paralelisme, serta output multi-format di sekelilingnya. Ini adalah meta-package, dan justru itu inti ceritanya: pip install botasaurus tidak hanya memasang satu library ke lingkunganmu, melainkan menyusun satu keluarga kecil wheel milik mereka sendiri beserta pohon dependensi turunan yang cukup besar. Detail mekanis ini justru jadi hal paling menarik yang bisa saya ukur dengan jujur.

Botasaurus memasarkan dirinya dengan fokus pada anti-detection, dan itulah satu aspek yang tidak saya uji dalam ulasan ini. Saya menginventarisasi framework ini — apa saja yang terpasang, apa yang diimpor, metode apa yang tersedia, seberapa besar ukurannya, dan berlisensi di bawah apa — alih-alih membenturkannya langsung dengan pertahanan live apa pun. Semua angka footprint dan import di bawah ini berasal dari pip, dari python -c "import ...", dan dari introspeksi kelas yang dibuat tetapi tidak pernah diminta mengambil halaman; tidak ada browser yang dijalankan untuk menghasilkan data tersebut. Memang nanti saya menjalankan browser, tetapi hanya ke halaman yang saya buat dan saya hosting sendiri di 127.0.0.1, untuk melihat apa yang diungkapkan driver tentang dirinya dan apakah ia bisa mengambil konten dari halaman yang dibangun sendiri dengan JavaScript. Tidak ada website live yang terlibat sama sekali, tidak ada layanan anti-bot yang dihubungi atau diukur, dan tidak ada CAPTCHA yang disentuh. Efektivitas terhadap website nyata memang sengaja di luar cakupan, dan saya lebih memilih menjelaskannya sejak awal daripada memberi kesan seolah-olah saya menjalankan benchmark yang sebenarnya tidak saya lakukan.

Dengan batasan itu, temuan utamanya adalah soal footprint, dan kabarnya cukup baik. Instalasi bersih menghasilkan direktori site-packages sebesar 122,3 MB dengan total 44 paket, di mesin tempat browser driver yang jadi inti sistem ini hanya sekitar 4 MB. Framework ini bukan berat karena drivernya berat; ia berat karena label "all-in-one" berarti ia ikut membawa numpy, lxml, gevent, dan belasan komponen lain untuk pekerjaan sekadar mengambil HTML. Lalu separuh temuan berikutnya adalah angka yang sering dikutip sebagai keunggulan, tetapi sebaiknya jangan dipercaya mentah-mentah: import botasaurus tercatat hanya 0,08 ms, yang terdengar seperti framework super ringan, padahal sebenarnya cuma pintu depan yang kosong.

Apa sebenarnya Botasaurus

Botasaurus — omkarcloud/botasaurus di GitHub, dengan 5.561 bintang, 486 fork, dan 58 issue terbuka saat metadata saya ambil pada 14 Juli 2026 — adalah framework Python, bukan library yang hanya punya satu fungsi. Versi yang saya uji adalah botasaurus 4.0.97 untuk meta-package dan botasaurus-driver 4.0.92 untuk mesin di baliknya. Meta-package ini menyatakan requires-python >=3.7 (driver-nya >=3.5), dan classifier PyPI-nya hanya mengklaim dukungan sampai Python 3.11. Di mesin saya, instalasi dan smoke test import berhasil pada Python 3.14.2. Itu bukti untuk instalasi ini, bukan jaminan kompatibilitas untuk semua fitur.

Label kategorinya penting untuk dipertegas, karena dari situlah kita menentukan arti kata "bagus". Botasaurus berada di sisi framework dari spektrum, satu lingkungan yang sama dengan Scrapy dan Crawlee — kamu mengadopsi strukturnya, dekoratornya, dan konvensinya, lalu sebagai gantinya ia mengurus plumbing di belakang layar. Itu berbeda dengan driver yang lebih fokus seperti nodriver, yang memberi kamu koneksi Chrome DevTools Protocol lalu mundur. Botasaurus memang membundel driver (botasaurus-driver), tetapi membungkusnya dengan task runner, caching layer, serializer output, dan request client. Jadi yang kamu beli bukan sekadar driver; kamu membeli workflow yang sudah diberi opini, lengkap dengan driver di dalamnya.

Tiga dekorator itu pada dasarnya adalah desainnya dalam bentuk ringkas, dan ketiganya benar-benar ada — saya memastikan botasaurus.browser.browser, botasaurus.request.request, dan botasaurus.task.task semuanya tersedia dan bisa diimpor. @browser menjalankan fungsi kamu di atas browser driver yang dibuat agar tampak lebih manusiawi. @request menjalankannya di atas HTTP client ringan yang dibentuk agar menyerupai browser. @task adalah pembungkus umum untuk semua hal yang bukan jelas termasuk dua yang pertama. Cukup tambahkan dekorator, dan Botasaurus akan menyediakan mekanisme di sekelilingnya: eksekusi paralel, reuse driver, caching hasil, serta writer untuk JSON, CSV, Excel, dan HTML. Ini ide yang koheren. Pertanyaannya, apakah kamu memang menginginkan sebanyak itu framework di sekitar scraper kamu — dan itu lebih soal selera daripada cacat.

Kesimpulan, dan batasannya

Botasaurus kompeten, bentuknya rapi, dan melakukan hal yang memang seharusnya dilakukan framework: mempersingkat kasus umum. Model dekoratornya bersih. Lisensi MIT-nya benar-benar ramah. Instalasinya juga berjalan tanpa drama. Jika saya menilai ergonomi permukaan API-nya, nilainya bagus.

Namun saya terus kembali pada satu hal: headline utama framework ini — anti-detection — justru satu-satunya aspek yang tidak bisa saya nilai secara bertanggung jawab tanpa mengarahkannya ke sistem pertahanan produksi milik orang lain. Driver ini memang memiliki permukaan API yang secara eksplisit berlabel anti-detection: metode-metode yang keberadaannya saya konfirmasi, tetapi perilakunya tidak saya uji terhadap target mana pun. Itu seluruh klaim yang berani saya buat tentangnya. Saya tidak mengarahkannya ke website yang dilindungi, tidak mengukur tingkat keberhasilan, tidak merekayasa balik mekanismenya, dan tidak akan menyiratkan salah satu dari tiga hal itu lewat pilihan kata. Metode-metode itu memang ada di kelas. Apa yang mereka lakukan di dunia nyata adalah ulasan terpisah, dan ini bukan itu.

Apa yang mengikuti di bawah ini adalah inventaris kemampuan, instalasi, resource, dan lisensi, plus apa yang driver lakukan pada halaman yang saya kontrol sendiri — klaim yang jauh lebih sempit daripada kebanyakan ulasan alat ini, dan justru penyempitan itulah intinya.

Apa yang diumumkan Botasaurus tentang dirinya sendiri

Measured results chart: Default browser disclosures by stack

Ada satu pertanyaan yang bisa dijawab tanpa mendekati pertahanan nyata: saat Botasaurus menggerakkan browser, apa saja yang browser itu ungkapkan tentang dirinya kepada halaman yang sedang dibuka? Saya membuat halaman yang membaca hal-hal yang paling jelas — navigator.webdriver, user-agent, platform, bahasa, jumlah plugin dan hardware, bentuk window.chrome, hasil Permissions API, serta geometri window dan screen — lalu meng-host-nya di 127.0.0.1, kemudian menguji empat stack: Botasaurus, nodriver, serta Playwright dan Puppeteer standar sebagai kontrol. Keempatnya menggerakkan build Chrome yang sama (Chrome for Testing 151.0.7922.10), jadi kalau ada perbedaan, itu berasal dari library-nya, bukan browser-nya. Saya menjalankannya dalam mode headless dan headed, masing-masing tiga kali. Semua nilai di bawah ini konsisten di ketiga pengulangan.

StackModenavigator.webdriverToken user-agentnavigator.languages
Botasaurus 4.0.92headlessfalseHeadlessChrome/151.0.0.0["en-US"]
Botasaurus 4.0.92headedfalseChrome/151.0.0.0["en-US"]
nodriver 0.50.3headless / headedfalseHeadlessChrome/151 / Chrome/151["en-US"]
Playwright 1.56.0headless / headedtrueHeadlessChrome/151 / Chrome/151["en-US","en"]
Puppeteer 24.16.0headless / headedtrueHeadlessChrome/151 / Chrome/151["en-US"]

Perbedaannya bergantung pada kontrol mana yang dipakai. Dibandingkan Puppeteer standar, Botasaurus mengubah navigator.webdriver; daftar bahasa dan geometri window berukuran nol tetap sama, sedangkan user-agent hanya berbeda pada format versi. Dibandingkan Playwright standar, delta yang terlihat juga mencakup daftar bahasa dan geometri window. Dibandingkan nodriver, nilai boolean dan bahasa cocok, sementara yang berbeda hanya format user-agent pada field yang ditampilkan di sini. Ini adalah observasi default disclosure, bukan skor anti-detection.

Ada dua detail yang membuatnya lebih menarik daripada sekadar nilai false. Detail pertama adalah bagaimana nilainya bisa muncul. Di keempat stack, properti itu tetap berasal dari getter native browser sendiri pada Navigator.prototype — function get webdriver() { [native code] } — bukan sebagai own-property yang ditempel pada instance, dan bukan pula fungsi yang diganti. Jadi Botasaurus tidak menulis ulang properti itu setelah halaman dimuat; nilainya ditentukan saat browser start, dan propertinya sendiri tidak disentuh.

Detail kedua adalah hal yang mengoreksi klaim pemasaran. Dalam mode headless, user-agent Botasaurus tetap menampilkan HeadlessChrome/151.0.0.0 — identik dengan Puppeteer standar, identik dengan Playwright standar. Jika dijalankan headed, ia menjadi Chrome/151.0.0.0, juga identik. Konstruktor Driver memang memiliki parameter user_agent, jadi kamu bisa mengisinya lewat keyword argument, tetapi konfigurasi default-nya tidak menyamarkan string identifikasi diri yang paling terkenal dalam automasi browser.

Hampir semua hal lain sama di keempat stack, dan ini layak disebutkan dengan tegas karena mempersempit ceritanya — setiap properti di bawah ini dibaca sama pada Botasaurus, nodriver, Playwright, dan Puppeteer:

PropertiNilai, identik di semua empat stack
platformMacIntel
vendorGoogle Inc.
Pluginslima
MIME typesdua
pdfViewerEnabledtrue
Logical coresdua belas
Reported device memory16 GB
Touch pointsnol
window.chromeada, dengan app/csi/loadTimes dan tanpa runtime
String renderer WebGLidentik di keempatnya

Kisah lama soal Permissions API dan Notification.permission yang saling bertentangan juga tidak muncul di mana pun — keempatnya sama-sama melaporkan default dan prompt tanpa konflik. Saya juga memindai document dan window untuk sisa-sisa bergaya cdc_ yang dulu dikenal pada stack WebDriver lama: kosong di keempatnya.

Satu hal terakhir yang layak diketahui sebelum kamu memasang ini ke produksi: meskipun ukurannya 122 MB, Botasaurus tidak menyertakan atau mengunduh browser. find_chrome_executable() akan menunjuk ke Chrome yang memang sudah terpasang di mesin kamu — pada saya, /Applications/Google Chrome.app, versi 150.0.7871.187 — dan itulah versi yang kemudian diungkapkan oleh user-agent. Fleet kamu akan mengumumkan versi Chrome apa pun yang kebetulan terpasang di fleet tersebut, dan untuk framework yang cukup opinionated, default ini justru surprisingly tidak banyak opini.

Jadi sebut saja apa adanya, dan jangan melebih-lebihkan. Ini adalah catatan tentang apa yang diungkapkan stack otomatis ketika tidak diminta untuk menyamarkan diri — berguna jika kamu berada di sisi pertahanan, berguna juga jika kamu ingin tahu apa yang dibocorkan oleh tool kamu sendiri. Ini bukan ukuran apakah semua itu berarti bagi layanan tertentu. Saya tidak mengujinya, dan tidak ada baris di atas yang layak dibaca sebagai indikasi hasil apa pun.

Pembacaan default yang lebih longgar pada fixture ini

Mengumumkan diri sendiri itu satu hal; mengembalikan HTML yang tepat adalah hal lain. Saya menjalankan Botasaurus pada fixture tiga kelas konten yang sama seperti yang digunakan benchmark repo ini, sehingga angkanya bisa disejajarkan dengan tool lain yang diukur di sini. Halaman itu memuat tiga hal: A, link statis dengan penanda yang memang literal di bytes yang disajikan; B, node yang dibangun oleh inline script saat parsing, dengan penanda dan URL dirakit dari potongan-potongan sehingga hanya dengan mengeksekusi JavaScript kamu bisa melihatnya; dan C, node yang disuntikkan 800 ms setelah event load, dengan cara perakitan yang sama. Kelas C adalah yang paling adversarial — pembacaan pada event load tidak akan bisa melihatnya.

StackPembacaan defaultDengan explicit wait
Botasaurus 4.0.922 dari 3 (A + B, melewatkan C)3 dari 3
nodriver 0.50.32 dari 33 dari 3
Playwright 1.56.02 dari 33 dari 3
Puppeteer 24.16.02 dari 33 dari 3

Botasaurus mendarat di tempat yang sama dengan para pemain besar. driver.get() lalu langsung driver.page_html memberi snapshot pada saat load: JavaScript dirender dengan benar — kelas B membuktikannya, karena kelas B tidak ada di bytes yang disajikan — tetapi untuk konten yang datang 800 ms kemudian, kelas C terlewat. Tambahkan driver.wait_for_element("#delayed-injected"), dan kamu mendapat ketiganya. Hasilnya stabil dalam tiga pengulangan dan tiga run terpisah untuk seluruh suite, tanpa flake.

Bagian menariknya muncul ketika saya menyapu delay injeksi untuk mencari titik di mana pembacaan default tiap stack mulai gagal:

Kelas C disuntikkan setelahBotasaurusnodriverPlaywrightPuppeteer
0 msditemukanditemukanditemukanditemukan
100 msditemukan———
200 msditemukan———
300 msditemukan———
400 ms ke atas————

Semua stack lain kehilangan kelas C begitu injeksi terjadi 100 ms atau lebih setelah load. Botasaurus masih menangkapnya pada 300 ms, dan baru menyerah pada 400 ms. Inilah Botasaurus sebagai framework, dan penyebabnya ada di konstruktor: wait_for_complete_page_load=True adalah default-nya, jadi get() selesai secara bermakna lebih lambat daripada sekadar event load. Secara konkret, pembacaan default-nya memakan 401–431 ms wall clock, sementara nodriver hanya 119–129 ms dan Puppeteer 125–171 ms.

Pada fixture lokal dengan injeksi tertunda ini, trade-off-nya kira-kira 250 ms per navigasi untuk snapshot default yang lebih lambat. Itu menangkap konten yang disuntikkan hingga 300 ms setelah load dalam run ini; tetapi itu tidak membuktikan Botasaurus lebih benar pada semua situs. Jika kamu menulis scraper cepat tanpa kondisi wait yang eksplisit, bantalan ini bisa mencegah node yang datang terlambat terlewat. Namun pada volume navigasi tinggi, atau ketika kamu sudah menunggu kondisi yang spesifik, ini hanyalah overhead.

Dua timing lagi untuk skala. Menyalakan browser membuat Botasaurus praktis setara dengan nodriver dan Puppeteer, serta jauh di belakang Playwright:

StackWaktu browser launch, lintas run
Botasaurus 4.0.92986–1151 ms
nodriver 0.50.3910–1583 ms
Puppeteer 24.16.0969–1008 ms
Playwright 1.56.0282–365 ms

Dan wait_for_element() tidak menambah biaya ekstra sampai delay 300 ms — get() sudah lebih dulu selesai melewati injeksi — lalu melonjak ke sekitar 1,42 detik pada 400–800 ms dan 2,43 detik pada 1500 ms.

Pertanyaan 122 MB: apa yang sebenarnya dipasang oleh meta-package

Measured results chart: Heaviest installed dependencies

Berikut aritmetikanya, karena ini bagian paling berguna yang bisa saya berikan. pip install botasaurus yang bersih di virtual environment baru menghasilkan tree site-packages sebesar 122,3 MB yang mencakup 44 paket dist-info. Jika pip sendiri dikeluarkan (10,9 MB, karena itu overhead venv, bukan sesuatu yang diminta Botasaurus), sisanya sekitar 111 MB adalah framework dan dependensinya. Browser driver — komponen yang benar-benar melakukan otomasi browser — hanya sekitar 4 MB dari total itu. Jadi kira-kira 107 MB sisanya adalah semua hal lain yang dianggap perlu oleh meta-package ini.

Larinya ke mana? Lima dependensi turunan yang paling besar saja sudah menyerap porsi terbesar (setiap baris di bawah adalah entri install_footprint.heaviest_deps_mb pada artifacts/raw/runs/resource_baseline.run1.json; totalnya adalah penjumlahan saya, bukan field di file):

PaketUkuran di disk
numpy30,9 MB
lxml19,2 MB
botasaurus_requests12,6 MB
gevent11,3 MB
pygments8,4 MB
Lima paket digabung82,4 MB (30,9 + 19,2 + 12,6 + 11,3 + 8,4)

numpy menjadi item tunggal terbesar, dan itu yang membuat saya mengangkat alis — ini library aljabar linear yang berada di dalam tool yang tugasnya mengambil dan mengurai halaman web. Bukan salah, tepatnya; framework memang sering menumpuk dependensi utilitas, dan rupanya ada sesuatu di dalam tree ini yang membutuhkan operasi array. Hanya saja, untuk urusan sekadar mengambil halaman, itu banyak sekali mesin yang dibawa.

Sebagai pembanding skala, driver yang fokus seperti nodriver bobotnya sekitar 17,2 MB dengan 6 paket di mesin yang sama — bisa dibilang sekitar 7x lebih ringan. (Angka itu bukan dari paket ini: itu adalah install_footprint.site_packages_total_mb milik nodriver pada artifacts/raw/runs/resource_baseline.run1.json sendiri, diukur dalam run terpisah yang di-stagger pada host yang sama, dan 122,3 ÷ 17,2 = 7,1.) Tidak ada dari kedua angka itu yang merupakan cacat, dan ini juga bukan ranking kemampuan; ini hanyalah perbedaan biaya mekanis antara framework serba ada dan driver yang fokus. Dalam container, footprint site-packages yang terukur akan berkontribusi ke lapisan aplikasi. Itu bukan ukuran penuh image, dan pengujian ini tidak mengukur waktu build atau cold-deploy.

Satu lagi catatan footprint: saat introspeksi, penggunaan pertama from botasaurus.request import request memicu unduhan satu kali sekitar 12,8 MB. Run yang tertangkap tidak mengidentifikasi artefak dan tujuannya dengan cukup baik untuk menganggap angka itu sebagai kenaikan footprint instalasi yang stabil. Namun ini menunjukkan bahwa path kode tersebut mungkin memerlukan akses jaringan pada penggunaan pertama, dan itu layak kamu reproduksi di image sendiri sebelum melakukan deployment yang terisolasi dari jaringan.

Angka import yang menipu

Timing import cold-start adalah tempat pembacaan angka yang terlalu sederhana bisa keliru. Diukur pada tujuh subprocess baru, import botasaurus di level atas berada pada median 0,08 ms. Kalau angka ini dikutip sendirian, framework ini terdengar seperti yang paling ringan di kategorinya.

Padahal bukan begitu. Ia cepat karena hampir tidak ada isi di sana. Paket tingkat atas botasaurus tidak mengekspos __version__ dan namespace publiknya hampir kosong — impor itu nyaris tidak melakukan apa-apa karena isinya memang nyaris tidak ada. Angka yang benar-benar penting untuk tool CLI atau cold start serverless adalah impor mesin intinya: from botasaurus_driver import Driver memakan sekitar 135 ms, stabil dalam selisih hanya beberapa milidetik antar-run. Itulah biaya tetap yang benar-benar kamu bayar sebelum satu halaman pun diambil. Dan setelah modul driver diimpor, memori resident berada di sekitar 29–30 MB — lagi-lagi, sebelum ada proses Chrome apa pun. Begitu browser nyata dijalankan, angkanya naik cukup signifikan; saya tidak mengukur memori saat browser hidup, jadi saya tidak akan menempelkan angka di sana.

Pelajarannya kecil tapi tajam: import botasaurus yang terasa instan adalah sifat dari paket tingkat atas yang kosong, bukan karena framework-nya murah. Kalau kamu menghitung cold start, ukur impor yang memang akan kamu andalkan.

Bentuk API: 99 metode di balik pintu depan yang hampir kosong

System diagram: API shape: behind a near-empty front door

Kelas Driver pada mesin ini mengekspos 99 metode publik — permukaan yang luas untuk navigasi, query elemen, cookie dan local storage, aksi mouse dan keyboard, screenshot, manajemen tab, passthrough CDP, serta upload file. Konstruktor menerima 18 parameter, yang cukup mewakili permukaan yang bisa diatur: 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, dan beberapa lainnya. Sebagai API saat konstruksi, ini mencakup kontrol umum yang biasanya dibutuhkan wrapper browser.

Keanehan bentuknya ada di level atas, dan ini memang tidak merusak apa pun, tetapi nyata. import botasaurus memberi kamu namespace yang hampir kosong — tidak ada __version__, praktis tidak ada nama publik di level atas. Semua yang benar-benar kamu pakai ada di submodule: from botasaurus.browser import browser, Driver, from botasaurus.request import request, from botasaurus.task import task. Kalau kamu mencari botasaurus.__version__ untuk mencatat build mana yang sedang dipakai, kamu tidak akan menemukannya; kamu harus memakai importlib.metadata. Tidak ada yang rusak di sini. Hanya saja, susunannya bukan yang biasanya langsung diharapkan oleh developer Python, dan mengetahui hal itu bisa menyelamatkan lima menit kebingungan di hari pertama.

Satu observasi dokumentasi tentang metode yang saya sorot tadi masih adil dan tetap berada dalam batas saya: dari metode-metode berlabel anti-detection yang memang ada, hanya 2 yang memiliki docstring di dalam kode. Sisanya hanya menjelaskan diri lewat nama, sementara dokumentasi per-metode ada di situs docs eksternal, bukan di source yang terpasang. Itu catatan tentang lokasi dokumentasi, bukan penilaian kualitas — banyak library bagus yang memang menyimpan prosa dokumentasinya di luar kode — tetapi kalau alur kerja kamu adalah "baca source untuk memahami method", sebagian besar permukaan ini hanya akan memberi nama, bukan penjelasan perilaku.

Lisensi: MIT, hingga ke driver-nya

Baik meta-package maupun botasaurus-driver sama-sama berlisensi MIT, dengan classifier standar License :: OSI Approved :: MIT License. MIT bersifat permisif: tidak ada kewajiban copyleft, tidak ada keharusan membuka kode kamu sendiri, dan hambatan minimal untuk adopsi komersial. Ini benar-benar perbedaan yang signifikan dibanding nodriver, driver anti-detect di kelas yang berdekatan, yang dirilis di bawah AGPL-3.0 — lisensi copyleft dengan klausul penggunaan via jaringan yang sering membuat departemen legal waspada. Jika lisensi adalah faktor penentu untuk kamu, posisi MIT Botasaurus adalah poin nyata di kolom plus.

Catatannya adalah bentuk meta-package itu sendiri. MIT yang permisif tersebut berlaku untuk wheel milik Omkar Cloud. Itu tidak otomatis mewakili sekitar 40 paket turunan yang ikut terpasang, masing-masing dengan lisensinya sendiri. Saya telah mengonfirmasi MIT di paket tingkat atas yang diterbitkan Omkar Cloud; saya tidak mengaudit lisensi setiap dependensi di tree tersebut. Untuk proyek hobi, perbedaan ini jarang penting. Untuk adopsi menyeluruh di perusahaan yang peduli pada software bill of materials, tree 40 paket itu adalah sesuatu yang perlu kamu lempar ke license scanner sendiri sebelum komit — bukan karena saya menemukan masalah, melainkan karena saya tidak memeriksanya, dan meta-package justru tempat paling umum lisensi tak terduga bersembunyi.

Kelebihan dan kekurangan

Kelebihan:

  • Desain tiga dekorator yang rapi (@browser / @request / @task), dan ketiga entry point memang ada — framework ini mempersingkat kasus umum.
  • Lisensi MIT untuk meta-package dan drivernya, kontras nyata dengan AGPL-3.0 milik driver sekelas. Permisif, ramah komersial, tanpa copyleft.
  • Permukaan driver yang luas: 99 metode publik dan konstruktor 18 parameter mencakup kebutuhan otomasi browser yang umum.
  • Berhasil dipasang dan lulus smoke test import pada Python 3.14.2 dan 3.12.13, melampaui daftar classifier-nya sendiri (yang berhenti di 3.11); kompatibilitas runtime tidak dibuktikan.
  • Jendela default-read paling toleran dari semua stack yang saya ukur: masih menangkap konten yang disuntikkan 300 ms setelah load, sementara nodriver, Playwright, dan Puppeteer semuanya kehilangan konten itu pada 100 ms. wait_for_complete_page_load=True benar-benar bekerja.
  • Secara default melaporkan navigator.webdriver sebagai false, sementara kontrol standar melaporkan true, tanpa mem-patch properti — descriptor tetap native getter milik browser.
  • Serba ada sejak desain: caching, paralelisme, reuse driver, serta output JSON/CSV/Excel/HTML sudah termasuk, bukan tambahan belakangan.

Kekurangan:

  • Berat di disk: 122,3 MB dalam 44 paket, kira-kira 7x lebih berat daripada driver fokus, terutama didorong dependensi seperti numpy (30,9 MB) dan lxml (19,2 MB), bukan oleh driver ~4 MB itu sendiri.
  • Import 0,08 ms di level atas menyesatkan; impor engine yang benar-benar kamu andalkan sekitar 135 ms, dan memori setelah import sekitar 29–30 MB sebelum browser apa pun dijalankan.
  • Jendela default-read yang lebih longgar itu tidak gratis: 401–431 ms per navigate-and-read dibanding 119–129 ms untuk driver yang lebih ramping pada halaman dan Chrome yang sama.
  • Run headless tetap mengumumkan HeadlessChrome di user-agent secara default, persis seperti kontrol standar; parameter constructor user_agent memang ada, tetapi tidak diset otomatis untuk kamu.
  • Untuk ukuran 122 MB, ia tetap tidak menyertakan browser — ia menggerakkan Chrome yang sudah ada di host, sehingga versi browser yang diumumkan adalah versi yang memang sudah terpasang di fleet kamu.
  • Penggunaan pertama @request memicu unduhan sekali sekitar 12,8 MB pada run ini; artefak dan tujuannya tidak tertangkap cukup jelas untuk menyebutnya kenaikan footprint instalasi yang stabil.
  • Paket tingkat atas hampir kosong dan tidak mengekspos __version__; API utama dan versinya berada di tempat yang tidak terlalu langsung terlihat.
  • Sebagian besar metode yang dinamai anti-detection tidak memiliki docstring di dalam kode, jadi membaca source hanya memberi nama, bukan perilaku.

Di luar cakupan semua angka ini, dan karena itu tidak diuji di sini: seluruh efektivitas anti-bot di dunia nyata (sengaja di luar cakupan), memori per halaman, penanganan proxy dan profile, throughput skala besar, serta platform selain macOS arm64. Angka footprint dan import dihasilkan tanpa menjalankan browser sama sekali; angka recall dan disclosure berasal dari browser yang hanya pernah berbicara dengan fixture di 127.0.0.1.

Untuk siapa alat ini, dan siapa yang sebaiknya melewatinya

Botasaurus cocok jika kamu menginginkan framework, bukan sekadar komponen. Jika kamu memulai proyek scraping dari file kosong dan lebih suka mengadopsi struktur ketimbang merakitnya sendiri — dekorator untuk entry point, caching dan paralelisme yang sudah diurus, writer output yang sudah built-in — ini adalah opsi yang koheren dan berlisensi MIT. MIT itu permisif, tetapi model penggunaan dan distribusi kamu tetap layak menjalani review kepatuhan yang normal. Tim yang sudah berpikir dalam kerangka Scrapy atau Crawlee akan merasa pendekatannya familiar.

Lewatkan, atau setidaknya pikirkan dua kali, jika target deployment kamu sensitif terhadap ukuran. Instalasi 122 MB dengan numpy dan gevent di tree adalah beban besar untuk dimasukkan ke container ramping ketika kebutuhan nyata kamu hanyalah "jalankan browser dan ambil beberapa field." Driver yang fokus memberi kamu otomasi dengan bobot jauh lebih kecil, dengan harga kamu harus menulis plumbing pendampingnya sendiri. Dan lewatkan sepenuhnya jika yang kamu cari adalah keputusan tentang efektivitas anti-detection, karena itu satu-satunya hal yang memang sengaja tidak saya uji — kamu akan mempercayai klaim pemasaran yang tidak saya konfirmasi maupun bantah.

Alternatif, dan posisi Thunderbit

Pertama, framing yang jujur: Botasaurus gratis, berlisensi MIT, dan self-hosted. Kamu yang menjalankan fleet-nya, kamu yang mengurus update-nya, dan kamu yang memikul seluruh dependency tree — 44 paket semuanya — termasuk patching, kepatuhan lisensi, dan apa pun yang akan dilakukan numpy di rilis mendatang. Bagi banyak tim, kepemilikan seperti itu justru memang yang mereka inginkan, dan tidak ada managed service yang bisa mengalahkan "framework yang sudah kamu miliki" dari sisi biaya mentah.

Dalam ranah open source, perbandingan yang relevan adalah soal bentuk. Jika kamu berada di sisi framework seperti Botasaurus, Scrapy dan Crawlee adalah sesama kandidat yang paling masuk akal untuk dibandingkan — matang, punya opini, dan masing-masing membawa konvensinya sendiri untuk diadopsi. Jika yang kamu inginkan adalah Markdown siap LLM dari sebuah halaman, bukan framework untuk menyusun crawler, Crawl4AI dan Trafilatura yang fokus pada konten memang dirancang untuk pekerjaan itu. Jika kamu suka pendekatan Python plus anti-detect tetapi menginginkan sesuatu yang lebih ringan daripada meta-package, Scrapling layak dilihat; dan jika bahasa terkompilasi masuk perhitungan, library Go Colly menukar rendering JavaScript demi kecepatan dan footprint yang kecil. Opsi apa pun yang menggerakkan browser, termasuk Botasaurus, mewarisi profil biaya yang dijelaskan dalam perbandingan Playwright vs Puppeteer kami — browser nyata memang tidak murah dijalankan, dan itulah salah satu alasan framework di atasnya punya bobot seperti sekarang.

Saat API terkelola masuk ke jalur yang sama, kita sedang membahas titik lain dalam pipeline yang sama. Botasaurus adalah stack developer yang di-host sendiri; Thunderbit menjual versi terkelolanya, yang diarahkan ke developer yang sama. Open API-nya terdiri dari dua endpoint. POST /distill (1 kredit) mengembalikan halaman sebagai Markdown bersih yang siap untuk LLM, dengan rendering dan anti-bot ditangani di sisi server, sehingga kamu tidak perlu menyiapkan browser atau dependency tree sama sekali. POST /extract (20 kredit) mengembalikan JSON terstruktur berdasarkan JSON Schema yang kamu definisikan, dengan renderMode diatur ke none, basic, atau full tergantung seberapa banyak browser yang benar-benar dibutuhkan halaman itu. Keduanya punya versi batch untuk hingga seratus URL sekaligus. Ada juga server MCP untuk agent dan coding assistant — thunderbit_suggest_fields gratis dan memberi tahu kamu apa yang diekspos halaman sebelum kamu membayar apa pun — serta CLI lewat npx @thunderbit/thunderbit-cli untuk cron dan CI. Untuk non-developer yang tidak ingin menyentuh semua itu, ekstensi Chrome menjalankan engine yang sama sebagai alat no-code, dan panduan di channel YouTube Thunderbit mencakup workflow yang umum.

Trade-off-nya adalah di mana pekerjaan itu berada, bukan tool mana yang lebih baik. Botasaurus mempertahankan framework, browser fleet, dependensi, infrastruktur, dan maintenance di sisi kamu tanpa biaya vendor per request; tetapi compute, bandwidth, proxy, dan operasional tetap menghabiskan uang. API terkelola mengambil beban rendering dan output yang berbentuk schema dari pundak kamu dan menagih per panggilan — kamu bisa membandingkannya dengan setup self-hosted di halaman harga.

Coba Thunderbit untuk Ekstraksi Data Web

Putusan akhir

Botasaurus adalah kandidat yang masuk akal jika kamu menginginkan framework Python all-in-one dan menerima footprint dependensinya. Desain tiga dekoratornya rapi, permukaan drivernya luas, dan ia lulus smoke test instalasi/import pada versi Python yang lebih baru daripada yang diklaim classifier-nya. Pada fixture lokal saya, snapshot default-nya juga menangkap konten yang disuntikkan 300 ms setelah load, sementara stack lain yang saya uji kehilangan konten itu pada 100 ms; itu adalah hasil pada fixture, bukan peringkat umum.

Tetapi ukuran klaimnya harus tepat. Ini instalasi 122 MB dengan 44 paket, di mana drivernya hanya sekitar 4 MB dan sisanya adalah numpy, lxml, gevent, dan kawan-kawan — kira-kira 7x driver fokus, dan bobot itu akan terasa pada ukuran image container dan waktu cold-deploy kamu. Import 0,08 ms di level atas adalah pintu depan yang kosong, bukan framework yang ringan; import engine sekitar 135 ms adalah angka yang benar-benar kamu bayar. Default read yang lebih toleran itu menambah sekitar 250 ms pada setiap navigasi. Dan pada pertanyaan default disclosure yang memang bisa saya jawab, gambarnya lebih sempit daripada yang dipasarkan: satu boolean berbeda dari Puppeteer standar, user-agent headless tetap berkata HeadlessChrome, dan semua properti lain yang saya ukur identik di keempat stack. Klaim anti-detection yang jadi daya jual alat ini justru satu-satunya hal yang tidak saya nilai — saya mengonfirmasi metode-metode itu ada, menjalankan driver ke halaman di mesin saya sendiri, lalu berhenti di situ, memang sengaja. Kenali footprint-nya, abaikan angka import yang terlalu memuji, dan anggap pemasaran stealth sebagai pertanyaan terbuka, maka Botasaurus adalah framework yang fair dan melakukan persis apa yang seharusnya dilakukan sebuah framework. Jika kamu berharap driver se-ringan bulu, kamu akan kaget saat docker build.

Coba Thunderbit untuk Ekstraksi Data Web Get Started Free

FAQ

Apakah Botasaurus gratis, dan berlisensi apa? Ya, gratis dan berlisensi MIT — baik meta-package botasaurus maupun engine botasaurus-driver sama-sama membawa classifier MIT yang disetujui OSI. MIT bersifat permisif, jadi tidak ada kewajiban copyleft dan cocok untuk penggunaan komersial, yang merupakan kontras penting dengan driver anti-detect sebanding yang dirilis di bawah AGPL-3.0. Satu catatan: MIT hanya mencakup paket milik Omkar Cloud sendiri, bukan otomatis sekitar 40 dependensi turunan yang ikut terpasang, jadi jalankan scan lisensi sendiri sebelum adopsi menyeluruh di perusahaan.

Seberapa besar instalasi Botasaurus, dan kenapa import botasaurus terlihat instan? pip install botasaurus yang bersih menghasilkan tree site-packages sebesar 122,3 MB dengan 44 paket di mesin saya. Browser drivernya sendiri hanya sekitar 4 MB — bobotnya datang dari meta-package yang menarik tree dependensi besar, dipimpin oleh numpy (30,9 MB), lxml (19,2 MB), botasaurus_requests (12,6 MB), gevent (11,3 MB), dan pygments (8,4 MB). Ukurannya kira-kira 7x footprint driver fokus seperti nodriver di mesin yang sama. Tidak ada yang salah di situ; itu harga dari "batteries included," dan dampaknya paling terasa pada ukuran image container. Timing import adalah tempat footprint itu tersembunyi: import botasaurus hanya sekitar 0,08 ms, tetapi itu karena paket tingkat atasnya hampir kosong — tidak ada __version__, hampir tidak ada nama publik, jadi impor itu nyaris tidak melakukan apa-apa. Impor yang benar-benar membebani kamu adalah engine, from botasaurus_driver import Driver, sekitar 135 ms, dengan memori resident sekitar 29–30 MB setelah import itu dan sebelum browser apa pun berjalan. Kalau kamu sedang menghitung serverless cold start, ukur engine import, bukan top-level yang kosong.

Apa yang diungkapkan Botasaurus tentang dirinya, dan apakah ia diuji melawan sistem anti-bot nyata? Bagian pertama diukur; bagian kedua memang sengaja tidak diuji. Pada halaman yang saya host dari 127.0.0.1, dengan menggerakkan build Chrome yang sama seperti kontrol: navigator.webdriver kembali false, sedangkan Playwright standar dan Puppeteer standar sama-sama melaporkan true. Nilai itu ditentukan saat browser diluncurkan, bukan dengan mem-patch properti — descriptor-nya tetap native getter milik Chrome. Di luar boolean itu, hampir semuanya cocok persis dengan kontrol: string platform sama, lima plugin, dua belas core, device memory 16 GB yang dilaporkan, bentuk window.chrome sama, tidak ada kontradiksi Permissions API, dan tidak ada sisa bergaya cdc_ pada document atau window. Run headless tetap mengumumkan HeadlessChrome/151.0.0.0 di user-agent, sama seperti kedua kontrol — constructor Driver memang punya parameter user_agent, tetapi tidak diisi otomatis. Soal efektivitas: saya tidak pernah mengarahkannya ke situs live, tidak pernah menghubungi layanan anti-bot, dan tidak pernah menyentuh CAPTCHA. Driver ini memang punya sekumpulan metode yang dinamai untuk anti-detection, keberadaannya saya konfirmasi, tetapi saya tidak memanggilnya, tidak menguji perilakunya pada target apa pun, tidak mengukur tingkat keberhasilan, dan tidak menjelaskan mekanismenya. Tabel disclosure di atas memberi tahu apa yang diumumkan stack, dan tidak mengatakan apa-apa tentang siapa yang mendengarnya atau apa yang mereka lakukan.

Apakah Botasaurus menangani konten yang dirender JavaScript dengan benar? Ya, dan default-nya lebih longgar daripada kebanyakan. Pada fixture dengan tiga kelas konten, driver.get() + driver.page_html menghasilkan 2 dari 3 pada delay injeksi 800 ms — JavaScript dirender dengan benar, tetapi pembacaan dilakukan sebelum konten yang sangat terlambat sempat masuk — sedangkan driver.wait_for_element() menghasilkan 3 dari 3. Bagian yang khas adalah batas default read-nya: Botasaurus masih menangkap konten yang disuntikkan 300 ms setelah load, sementara nodriver, Playwright, dan Puppeteer semuanya kehilangan konten itu pada 100 ms. Itu berasal dari wait_for_complete_page_load=True di konstruktor, dan biayanya sekitar 250 ms per navigasi.

Bagaimana cara import dan memakai Botasaurus setelah instalasi? Tidak seperti yang mungkin kamu duga. Namespace tingkat atas botasaurus hampir kosong, jadi API yang sebenarnya ada di submodule: from botasaurus.browser import browser, Driver, from botasaurus.request import request, dan from botasaurus.task import task. Kamu cukup mendekorasi fungsi biasa dengan @browser, @request, atau @task, lalu framework mengurus driver, caching, dan output di sekelilingnya. Karena tidak ada botasaurus.__version__, gunakan importlib.metadata jika kamu perlu mencatat build mana yang sedang berjalan.

Ke
Ke
CTO di Thunderbit | Senior Data Scientist & Expert ML Dengan pengalaman hampir satu dekade di bidang machine learning dan data science, Ke Shen adalah lulusan Columbia University dan mantan Senior Data Scientist di Walmart Labs. Dengan keahlian mendalam yang diakui sejawat dalam Python, R, Java, dan Statistik, ia membagikan wawasan teruji lapangan tentang bagaimana membawa algoritma AI yang kompleks dari teori ke arsitektur siap produksi.
Daftar Isi
Thunderbit · Agen data web AI

Ekstrak data dari halaman apa pun dalam 1 klik

Dipercaya oleh 250.000+ pengguna
tersedia paket gratis
Dari halaman web ke spreadsheet
Jelaskan apa yang kamu butuhkan — AI Agent Thunderbit akan men-scrape dan mengekspornya ke Excel, Google Sheets, Airtable, atau Notion. Gratis untuk memulai.
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week