Hampir setiap daftar “open-source scraper terbaik” punya satu kelemahan yang jarang disadari: tidak ada yang menjalankan semua tool di halaman yang sama. Scrapy diuji pada artikel berita, Playwright pada demo e-commerce, Colly pada halaman acak yang kebetulan dimiliki penulisnya — lalu semuanya langsung dibandingkan seolah angka-angka itu setara. Padahal, peringkat seperti itu lebih banyak bicara soal halamannya daripada tool-nya.
Jadi saya melakukan hal yang paling sederhana, tapi sering dilewati daftar semacam ini. Saya membuat satu set fixture dan menjalankan semua sembilan tool di atasnya: katalog statis, katalog yang dirender JavaScript, artikel yang tersembunyi di balik navigasi dan footer, error HTTP 500 yang sengaja dibuat, graf crawl link internal kecil, plus dua situs praktik publik. Ground truth-nya sama, metriknya sama, dan setiap run dilakukan dengan kondisi yang identik. Script dan output mentahnya ada di repo benchmark publik ini, jadi kamu bisa menjalankannya ulang sendiri. Hasilnya bukan leaderboard rapi seperti yang dijanjikan roundup — tidak ada pemenang tunggal. Ada tiga jenis pekerjaan, dan sembilan tool ini hampir otomatis terkelompok ke sana.
Coba Thunderbit untuk Ekstraksi Data Web
Cara benchmark ini dijalankan, dan satu batasan yang saya nyatakan terang-terangan

Semua tool diuji pada bentuk fixture yang sama: 12 produk statis yang tersebar di dua halaman, 8 produk yang disuntik lewat JavaScript setelah jeda, artikel dengan boilerplate nav/footer di sekeliling tiga paragraf asli, server 500 yang disengaja, dan graf tautan internal. Desain seperti inilah yang membuat hasilnya bisa dibandingkan — “8/8 produk dinamis” berarti hal yang sama, entah yang menjalankannya Puppeteer atau Crawlee.
Ini batasan yang paling sering dilewatkan roundup. Setiap paket tool meniru fixture miliknya sendiri, jadi jumlah karakter absolut tidak benar-benar bisa dibandingkan lintas tool — anggap saja sebagai sinyal di dalam tool itu sendiri, bukan skor antar-tool. Angka yang bisa dibandingkan adalah recall (anggap sebagai rate), hasil JavaScript lolos/gagal, dan perilaku struktural. Ada satu catatan lingkup dengan semangat yang sama: run statis Crawl4AI hanya mencakup halaman pertama, jadi 6/6 di sana berarti recall penuh pada cakupan yang lebih sempit, sedangkan tool lain merayapi dua halaman penuh untuk 12/12 — cakupannya lebih kecil, bukan miss sebagian. Penjelasan lengkapnya, fixture per fixture, ada di tulisan metodologinya.
Satu catatan lagi sebelum masuk angka. Setiap paket juga membawa skor riset sementara, tetapi saya sengaja tidak menampilkannya sebagai tabel peringkat. Itu hanya alat internal untuk mengecek setiap tool terhadap buktinya sendiri, bukan klasemen — dan menerbitkannya seperti peringkat justru akan mengulang masalah false precision yang sejak awal ingin dihindari. Ini sintesis dari apa yang ditunjukkan benchmark, bukan papan skor.
Seluruh medan, di satu benchmark
Baca dua kolom pada tabel ini — “Renders JS?” dan “Built-in crawl queue” — dan tiga jenis pekerjaannya langsung terlihat.
| Tool | Bahasa | Renders JS? | Static recall | Structured output | Built-in crawl queue | Setup weight | License |
|---|---|---|---|---|---|---|---|
| Crawl4AI | Python | Ya (browser) | 6/6 (halaman 1) | CSS schema | BFS/DFS built-in | Berat (2 stack browser) | Apache-2.0 |
| Firecrawl | Self-hosted | Ya (playwright-service) | Markdown penuh | Ya | /v1/crawl | Paling berat (6 container) | AGPL-3.0 |
| trafilatura | Python | Tidak | 3/3 artikel | Tidak (hanya teks) | Tidak | Ringan | Apache-2.0 |
| Crawlee | Node/TS | Opsional per engine | 12/12 | Via extraction | Ya (RequestQueue) | Menengah (+~80 MiB) | Apache-2.0 |
| Playwright | Node/multi | Ya | 12/12 | Manual | Tidak (BFS ditulis sendiri) | Menengah (browser) | Apache-2.0 |
| Puppeteer | Node | Ya (Chrome) | 12/12 | Manual | Tidak (BFS ditulis sendiri) | Menengah (Chrome) | Apache-2.0 |
| Scrapy | Python | Tidak | 12/12 | Feed export (JSON/CSV/XML) | Ya (bawaan) | Menengah (dependensi Twisted) | BSD-3 |
| Colly | Go | Tidak | 12/12 | Via callback | Kontrol kedalaman | Ringan (1 binary + Go) | Apache-2.0 |
| Scrapling | Python | Tidak (HTTP fetcher) | 12/12 | Ya | Tidak | Menengah ([fetchers]) | BSD-3 |

Catatan untuk metadata di tabel ini dan di bawahnya: jumlah bintang dan nomor versi diambil pada awal Juli 2026, dan keduanya cepat berubah. Silakan cek ulang di GitHub dan halaman paket masing-masing proyek sebelum menganggapnya sebagai data terkini.
Indeks ulasan untuk tiap tool
Setiap proyek di roundup ini punya ulasan mendalam yang cocok:
- Ulasan Crawl4AI
- Ulasan Firecrawl
- Ulasan trafilatura
- Perbandingan Playwright vs Puppeteer
- Ulasan Crawlee
- Ulasan Scrapy
- Ulasan Colly
- Ulasan Scrapling
Berikut sampulnya — plus dua tangkapan layar asli dari pengujian rendering JavaScript, supaya klaim “8/8 dinamis” bukan sekadar angka di halaman.










Pekerjaan 1: mengubah halaman menjadi teks siap pakai untuk LLM

Kalau yang kamu butuhkan adalah Markdown bersih untuk feed pipeline RAG, ada tiga tool yang bersaing — dan ketiganya sangat berbeda pendekatannya.
Crawl4AI pada dasarnya adalah generator Markdown yang ditopang browser, meski marketing-nya sering dibungkus cerita lain. Perlu diluruskan juga soal narasi “adaptive intelligence self-learning selector” yang sering muncul di hasil pencarian: fitur itu tidak ada di Crawl4AI — itu milik library lain (nanti kita bahas saat sampai ke Scrapling). Yang benar-benar dilakukan Crawl4AI, memang bagus. Di situs praktik Books to Scrape, tool ini menghasilkan 13.476 karakter Markdown, mendukung ekstraksi skema CSS untuk pengambilan terstruktur, dan deep crawl BFS bawaannya menelusuri 5 halaman pada fixture crawl-graph sambil merender halaman JavaScript dan mengambil screenshot. Ada dua kekurangan nyata. Markdown mentahnya tetap membawa boilerplate halaman kecuali kamu menyalakan content filter, dan error 500 yang disengaja kembali sebagai success=false — bukan karena Crawl4AI menangkap HTTP error dengan bersih, melainkan karena heuristik kontennya melihat isi error yang sangat kecil lalu menandainya sebagai minimal_text ... blocked. Setup-nya juga memasang dua stack browser ke disk kamu. Versi 0.9.0, Apache-2.0, sekitar 71 ribu bintang per awal Juli.
Firecrawl adalah yang paling berat di kelompok ini, dan self-hosting-nya benar-benar jalan — saya bilang “benar-benar” karena stack enam container-nya (api, playwright-service, redis, rabbitmq, nuq-postgres, dan foundationdb) memang berhasil naik dan menghasilkan 9.222 karakter Markdown siap LLM dari halaman Books to Scrape yang sama. Ia merender halaman JavaScript lewat playwright-service bawaan, dan kutipan Einstein yang muncul setelah script dijalankan benar-benar terlihat di output, jadi render-nya terbukti nyata. Dua hambatan yang saya temui berasal dari lingkungan, bukan Firecrawl-nya, dan saya ingin menjelaskannya presisi supaya tidak ada yang menyalin solusi yang salah: build dari source terganjal snapshotter containerd yang bermasalah saat memakai colima (saya pindah ke image prebuilt), dan rentang DNS 198.18.x.x milik colima memicu proteksi SSRF Firecrawl, yang saya atasi dengan ALLOW_LOCAL_WEBHOOKS=true — ini workaround untuk development lokal, bukan sesuatu yang seharusnya dimatikan di deployment nyata. Core self-hosted-nya juga tidak menyertakan Fire-engine, lapisan anti-block cloud, dan saya tidak menguji API cloud. Bendera besar lainnya adalah lisensinya: core self-hosted Firecrawl memakai AGPL-3.0, jadi ini benar-benar perlu ditinjau sebelum dipakai komersial, bukan sekadar catatan kaki. Sekitar 148 ribu bintang per awal Juli.
trafilatura adalah sang penentang arus di grup ini, dan justru tool yang sering terlupa oleh daftar hype AI. Tanpa browser. Tanpa baris terstruktur. Hanya teks artikel yang cepat dan bersih dalam Python murni. Pada fixture artikel, tool ini mengambil judul plus semua 3 dari 3 paragraf asli, membersihkan boilerplate sepenuhnya — tidak ada “Login,” “Subscribe,” atau “Copyright” yang lolos — dan sekaligus menangkap author serta tanggal. Di halaman produk publik, ia mengembalikan 1.324 karakter teks bersih. Batasannya persis seperti yang diisyaratkan desainnya: jika diarahkan ke katalog, ia mengembalikan 12 nama produk sebagai teks tetapi 0 baris terstruktur — teksnya ada, strukturnya tidak, dan tidak ada JavaScript yang dirender. Versi 2.1.0 (rilis saat ini), Apache-2.0, sekitar 6,2 ribu bintang. Untuk ekstraksi artikel murni, ini hal pertama yang akan saya pilih.
Dua hitungan karakter Markdown tadi — 13.476 dari Crawl4AI, 9.222 dari Firecrawl — berasal dari halaman publik yang sama, tetapi jangan dibaca sebagai selisih kualitas. Itu mencerminkan strategi Markdown yang berbeda (seberapa banyak chrome halaman yang dipertahankan), bukan vonis output mana yang lebih baik. Inilah aturan “sinyal dalam tool yang sama” tadi, yang terlihat jelas di sini.
Pekerjaan 2: merender JavaScript dengan andal

Sebagian data memang tidak ada di HTML sampai script dijalankan, dan di titik itulah browser sungguhan menjadi wajib. Tiga tool melayani pekerjaan ini — dan dua di antaranya ternyata nyaris sama saja.
Playwright dan Puppeteer seri di semua pengujian yang saya berikan. Keduanya merender 8/8 produk dinamis pada fixture lokal dan 10 pada situs Quotes JS publik, keduanya mencapai recall statis 12/12, dan keduanya menangani error 500 dengan bersih (Puppeteer mengembalikan object response alih-alih melempar error). Keduanya tidak membawa queue crawl bawaan, jadi keduanya butuh BFS yang ditulis manual, dan itu mencapai 12 halaman pada kedalaman 0–2 di graf crawl. Satu-satunya perbedaan yang benar-benar penting adalah jangkauan: Playwright mendukung Chromium, Firefox, dan WebKit serta berbicara Python dan .NET, sedangkan Puppeteer lebih Chrome-first dan hanya Node. Dua catatan penting, karena versi di sini cepat berubah: saya menguji Playwright 1.56.0 dibandingkan dengan versi terkini 1.61.1 dan hanya memakai Chromium; Puppeteer 24.16.0 dibandingkan dengan versi terkini 25.3.0 — jadi hasilnya perlu diulang atau didiskon sesuai konteks. Keduanya Apache-2.0; sekitar 92 ribu dan 95 ribu bintang masing-masing.
Crawlee adalah tool yang menyelesaikan masalah queue yang ditinggalkan dua tool tadi. Ia membungkus engine Cheerio (HTTP) dan Playwright (browser) dalam satu API, dan kontras di satu halaman menjadi inti penawarannya: engine Cheerio melihat 0 item yang disuntik JavaScript, sedangkan engine Playwright melihat semuanya 8/8 secara lokal (dan 10 di situs publik), dan berpindah di antara keduanya cukup dengan satu baris perubahan. Ia juga memberi kamu RequestQueue sungguhan, dan itulah yang membuatnya masuk ke pekerjaan ini, bukan pekerjaan ketiga. Satu hal yang jarang disebut di headline: browser engine-nya membutuhkan npx playwright install terpisah, sekitar 80 MiB yang tidak ikut diunduh lewat npm install crawlee. Versi 3.17.0, TypeScript, Apache-2.0, sekitar 24,6 ribu bintang.
Pekerjaan 3: crawl cepat tanpa browser
Kalau halaman tidak memerlukan JavaScript, memakai browser justru boros dan berlebihan. Tiga tool berbasis HTTP bersaing di sini, masing-masing mewakili filosofi bahasa yang berbeda, dan mereka punya perbedaan yang menarik.
Scrapy adalah framework paling serius di kelompok ini — spider, feed export ke JSON/CSV/XML, AutoThrottle, dan seterusnya. Ia mencapai 12/12 recall statis, mengambil 3/3 paragraf artikel, menelusuri 11 halaman pada kedalaman 0–2 di graf crawl, dan menangani 500 lewat handle_httpstatus_list. Cara pandangnya justru yang paling menarik: ia tidak merender, ia mereproduksi request. Saat diarahkan ke halaman JavaScript, hasilnya 0 node — lalu API JSON di belakang halaman yang sama langsung memberinya 8/8. Itulah filosofi Scrapy dalam satu data point: cari request yang dipakai halaman, lalu replay, jangan menggerakkan browser. Harganya adalah stack dependensi yang cukup besar (Twisted, lxml, parsel), dan saya hanya mengujinya pada fixture kecil. Versi 2.17.0, BSD-3-Clause, sekitar 63 ribu bintang.
Colly adalah jawaban dari dunia Go, dan ia sangat lugas soal apa dirinya: satu binary statis, berbasis callback lewat OnHTML, OnResponse, dan OnError, plus kontrol kedalaman. Ia menuntaskan 12/12 recall statis, mengambil 8/8 dari JSON API lewat OnResponse, menangkap 500 lewat OnError, dan mencapai 17 halaman dalam crawl kedalaman-2 — dan saya sengaja merumuskannya persis begitu, karena jumlah halaman itu adalah hitungan dari harness, bukan jaminan kelengkapan yang diberikan Colly. Yang tidak ia lakukan adalah JavaScript: fixture dinamis dan situs Quotes JS sama-sama kembali 0, memang sesuai desainnya. Kamu perlu toolchain Go untuk membangunnya, dan versi modulnya (v2.3.0) saat ini sudah lebih maju daripada release bertag (v2.2.0). Apache-2.0, sekitar 25 ribu bintang.
Scrapling adalah spesialisnya, dan label itu memang layak. Adaptive selector-nya dirancang untuk menemukan ulang elemen setelah markup berubah — jadi saat saya mengganti class HTML target dari product-name menjadi product-title, selector biasa hanya cocok 0, lalu re-match adaptif tetap berhasil mengambil elemen yang dilacak. Untuk ekstraksi HTTP biasa, ia mencapai 12/12 statis dan 8/8 pada JSON API. Tapi ada batas yang tidak disembunyikan oleh dokumentasinya sendiri: pada tes sintetis multi-elemen, ia memulihkan 1 dari 3 — ini tracking elemen yang tahan perubahan, bukan pemulihan total, jadi jangan dibesar-besarkan dalam kepala kamu. pip install scrapling dasar juga memerlukan ekstra [fetchers] agar bisa jalan, dan StealthyFetcher adalah catatan kepatuhan, bukan fitur yang akan saya pajang di slide. Versi 0.4.10 (rilis saat ini), BSD-3-Clause, sekitar 68,7 ribu bintang.
Pola di balik tiga pekerjaan ini
Kalau sembilan tool itu disejajarkan, pola yang rapi langsung muncul. Full static recall — angka datar 12/12 — adalah syarat dasar bagi semua tool HTTP-first; tidak ada satupun yang gagal di kasus mudah ini, jadi itu bukan pembeda. Tool browser baru layak memikul beban ekstra kalau JavaScript memang terlibat, dan mereka semua membayarnya lewat setup: stack browser, install tambahan, atau satu armada container. Dan kolom “built-in crawl queue” sebenarnya adalah garis pemisah antara framework dan engine — Scrapy dan Crawlee membawa orkestrasi, sedangkan Playwright dan Puppeteer mengharuskan kamu menulis BFS sendiri. Itulah bentuk sebenarnya dari medan ini. Tidak ada pemenang total karena memang tidak ada yang bermain di permainan yang sama.
Jadi, sebaiknya pilih yang mana?
Benchmark ini menolak mengangkat satu pemenang karena jawaban yang tepat bukan tool, melainkan pertanyaan — kamu sedang mengerjakan pekerjaan yang mana?
- Butuh Markdown siap LLM? Pilih trafilatura kalau yang kamu cari adalah teks artikel bersih, Crawl4AI kalau kamu juga ingin ekstraksi CSS dan rendering JavaScript dalam satu library, dan Firecrawl kalau kamu memang ingin layanan self-hosted serta siap menghadapi lisensi AGPL-3.0 dan bobot enam container.
- Butuh JavaScript dirender? Playwright atau Puppeteer untuk rendering mentah — pilih berdasarkan engine dan bahasa, karena di aspek lain mereka seri — dan Crawlee kalau kamu juga ingin orkestrasi crawl disediakan, bukan ditulis manual.
- Crawl halaman statis atau API yang bisa direproduksi dalam skala besar? Scrapy untuk framework Python penuh, Colly untuk kecepatan mentah Go dalam satu binary, dan Scrapling kalau masalah utama kamu adalah markup yang sering berubah.
Cocokkan tool dengan pekerjaannya, dan semuanya bisa jadi pilihan yang masuk akal. Ambil dari kategori yang salah — tool browser untuk halaman statis, atau parser HTTP untuk aplikasi JavaScript — dan library dengan rating tertinggi sekalipun tetap akan mengecewakan kamu.
Di mana peran API AI terkelola

Semua tool di atas gratis, open-source, dan bisa kamu jalankan sendiri. Itulah juga trade-off bersama yang terus muncul dari benchmark ini: kamu yang mengurus environment browser, kode crawl, perang melawan anti-bot, dan semua pemeliharaannya. Bagi banyak tim, kontrol seperti itu memang tujuannya, dan peta lisensi jadi penting saat kamu memutuskan jalan ini — sebagian besar medan ini permisif (Apache-2.0 untuk Crawl4AI, Crawlee, Playwright, Puppeteer, dan Colly; BSD-3 untuk Scrapy dan Scrapling), sementara core self-hosted Firecrawl yang memakai AGPL-3.0 perlu benar-benar ditinjau sebelum dipakai komersial.
Tapi perhatikan juga apa yang tidak dilakukan tool-tool ini: render, crawl, strukturkan, dan berputar saat diblokir — jarang bisa semua sekaligus, dan tidak pernah tanpa pemeliharaan dari kamu. API scraping AI terkelola menyederhanakan seluruh tumpukan itu menjadi satu panggilan. Surface developer kami di Thunderbit adalah salah satu opsinya, dan untuk audiens teknis, yang penting adalah API, MCP server, dan CLI — bukan ekstensi browser. POST /distill mengembalikan Markdown bersih dan POST /extract mengembalikan JSON berbasis skema, dengan rendering JavaScript dan anti-bot ditangani di sisi server, bukan di mesin kamu. Ada MCP server resmi untuk agen dan coding assistant — thunderbit_suggest_fields gratis untuk merencanakan ekstraksi, lalu thunderbit_distill (1 credit) dan thunderbit_extract (20 credits) yang menjalankannya — plus CLI yang bisa kamu pasang lewat npx @thunderbit/thunderbit-cli untuk terminal dan cron job. Untuk anggota tim yang non-developer, ada juga ekstensi Chrome tanpa kode, dan pricing mencakup kedua sisi kebutuhan.
Trade-off-nya tetap sama seperti yang dibahas seluruh benchmark ini: menjalankan dan memelihara hingga sembilan library sendiri dengan biaya per panggilan nol, atau menyerahkan plumbing-nya dan membayar per request. Tidak ada pilihan yang salah. Semuanya bergantung pada seberapa banyak stack yang benar-benar ingin kamu miliki. Kalau kamu ingin melihat bagaimana ekstraksinya bekerja dalam praktik, kanal YouTube Thunderbit membahasnya langkah demi langkah.
Putusan
Tidak ada satu scraper open-source terbaik, dan daftar apa pun yang dengan percaya diri memberi kamu satu nama sebenarnya sedang menyembunyikan pertanyaan yang benar-benar menentukan hasilnya: kamu sedang mengerjakan pekerjaan yang mana? Mengubah halaman menjadi teks, merender JavaScript, atau crawl cepat tanpa browser — medan ini terpisah rapi ke dalam tiga kelompok itu, dan di dalam masing-masing kelompok, pilihannya kembali ke bahasa dan beban setup, bukan juara universal.
Kalau kamu hanya mengambil satu kebiasaan dari semua ini, ambil ini: uji di halaman kamu sendiri sebelum berkomitmen pada apa pun. Setiap angka di sini bisa direproduksi di repo benchmark untuk alasan itu — karena tool yang menang di roundup umum dan tool yang bertahan di target nyata kamu tidak selalu tool yang sama.
Coba Thunderbit untuk Ekstraksi Data Web Get Started Free
FAQ
Apa open-source web scraper terbaik? Tidak ada satu jawaban tunggal — semuanya tergantung pekerjaannya. Untuk teks siap LLM, trafilatura atau Crawl4AI; untuk rendering JavaScript, Playwright, Puppeteer, atau Crawlee; untuk crawling HTTP cepat, Scrapy atau Colly. Pada benchmark yang sama, setiap tool paling kuat di kategorinya sendiri dan terlihat lebih lemah di luar itu, itulah sebabnya peringkat satu ukuran untuk semua sering menyesatkan.
Open-source scraper mana yang bisa merender JavaScript? Crawl4AI, Firecrawl, Playwright, Puppeteer, dan engine Playwright milik Crawlee semuanya bisa merender JavaScript. Scrapy, Colly, trafilatura, dan HTTP fetcher bawaan Scrapling tidak bisa — mereka perlu API yang bisa direproduksi di balik halaman (pendekatan Scrapy, yang mendapatkan 8/8 dari endpoint JSON) atau mode browser terpisah.
Apakah saya butuh headless browser untuk scraping situs? Hanya jika datanya baru muncul setelah JavaScript dijalankan. Kalau request HTTP biasa plus parser sudah bisa mencapai kontennya, browser akan jadi overkill yang mahal — Scrapy, Colly, atau Scrapling jauh lebih ringan dan cepat untuk kasus seperti itu.
Mana di antara tool ini yang paling ramah lisensi untuk penggunaan komersial? Sebagian besar permisif: Apache-2.0 (Crawl4AI, Crawlee, Playwright, Puppeteer, Colly) atau BSD-3-Clause (Scrapy, Scrapling). Pengecualiannya adalah core self-hosted Firecrawl, yang memakai AGPL-3.0 dan perlu ditinjau serius sebelum kamu membangun produk komersial di atasnya.
Apakah angka benchmark ini bisa direproduksi? Ya. Semua runner, fixture, dan hasil mentah ada di repo publik berlisensi MIT. Satu catatan penting: recall dan hasil struktural bisa dibandingkan lintas tool, tetapi jumlah karakter absolut hanya sinyal di dalam tool itu sendiri, karena tiap paket meniru fixture, bukan berbagi satu salinan kanonik — jadi bandingkan rate dan pass/fail, bukan total karakter mentah.


