Ulasan Colly: HTML Statis, JSON Langsung, dan Batas Browser

Terakhir diperbarui pada August 17, 2026
Ulasan Colly: HTML Statis, JSON Langsung, dan Batas Browser
Ringkasan AI
Saya membuat situs fixture untuk menguji bagian Colly yang tidak bisa dijawab hanya dengan jumlah halaman atau reputasi kecepatan: apakah callback-nya mengekstrak record yang diharapkan, mengarahkan error HTTP, mengikuti grafik yang dibatasi, dan menampilkan konten yang dikirim di luar HTML hasil render. Ini adalah ulasan soal akurasi dan batas kemampuan, bukan benchmark throughput. Pada fixture yang dikontrol, Colly berhasil mengekstrak semua record statis yang diharapkan, mengarahkan satu respons 500 ke OnError, dan mengunjungi 17 URL dalam grafik dengan depth yang dibatasi. Hasilnya 0 elemen target pada dua halaman yang elemennya baru muncul setelah JavaScript dijalankan.

Saya membangun sebuah situs fixture untuk menguji bagian Colly yang tidak bisa dijawab oleh reputasi jumlah halaman atau kecepatan: apakah callback-nya benar-benar mengekstrak record yang diharapkan, menangani error HTTP, menelusuri graf yang dibatasi, dan mengambil konten yang dikirim di luar HTML yang dirender. Ini adalah tinjauan soal akurasi dan batas kemampuan, bukan benchmark throughput.

Pada fixture yang dikendalikan, Colly berhasil mengekstrak semua record statis yang diharapkan, meneruskan satu respons 500 ke OnError, dan mengunjungi 17 URL dalam graf dengan batas kedalaman yang sudah dikonfigurasi. Hasilnya 0 elemen target pada dua halaman yang elemennya baru muncul setelah JavaScript dijalankan. Endpoint JSON yang bisa diakses langsung tetap dapat dipakai tanpa browser, perbedaan penting dibanding merender UI klien.

Apa sebenarnya Colly itu

Colly single Go binary

Colly menyebut dirinya sebagai “elegant scraper and crawler framework for Golang,” dan deskripsi itu memang lebih bermakna daripada yang terlihat. Ini adalah library Go — sekitar 25.300 bintang GitHub dan 1.850 fork — berlisensi Apache-2.0. Ini bukan CLI yang tinggal diunduh lalu diarahkan ke sebuah URL. Anda menulis kode Go, mengimpor Colly, mendaftarkan beberapa callback, lalu mengompilasinya menjadi satu executable.

Model mentalnya berbasis event. Anda menautkan handler ke sebuah Collector: OnHTML menjalankan logika ekstraksi untuk CSS selector yang cocok, OnResponse menyediakan body respons mentah, dan OnError menangani kegagalan request. Handler link memanggil Visit() pada URL yang ditemukan, sementara MaxDepth membatasi penelusuran. Host target tidak memerlukan runtime Go atau browser yang dipasang terpisah untuk jalur HTTP-only ini; apakah executable yang dihasilkan benar-benar statis bergantung pada flag build dan penggunaan CGO, dan itu tidak dicatat dalam pengujian ini.

Fitur utama, dan cara kerjanya di balik layar

System diagram: Key features, and how they run under the hood

Model callback adalah hal yang paling penting dipahami, karena itulah alasan Colly terasa berbeda dari skrip request-and-parse. Tiga callback ini menjalankan semua pengujian yang saya lakukan.

OnHTML(selector, handler) adalah pekerja utamanya. Daftarkan pada .product atau article p, dan Colly akan memanggil handler Anda satu kali untuk setiap elemen yang cocok saat DOM diparse. Di sinilah ekstraksi terstruktur dilakukan, dan hasilnya mudah dibaca — Anda menjelaskan apa yang ingin diambil, bukan menulis loop parsing.

OnResponse(handler) berada satu tingkat lebih rendah dan memberi Anda byte mentah. Saat target mengembalikan JSON alih-alih HTML, Anda bisa melewati DOM sepenuhnya dan melakukan unmarshal body sendiri. Satu callback inilah yang membuat Colly menangani API JSON dengan bersih dalam pengujian saya, tanpa parsing HTML sama sekali.

OnError(handler) menangani kegagalan request dan dapat mengekspos status respons ke kode pemanggil. Dalam pengujian ini, satu respons fixture dengan status 500 sampai ke callback yang terdaftar. Retry, timeout, kegagalan DNS, reset koneksi, panic di callback, persistence, dan alerting tidak diuji.

Di atas callback tersebut ada dua fitur operasional. MaxDepth membatasi penelusuran link sesuai semantik kedalaman Colly. Executable Go yang dikompilasi juga menghindari kebutuhan runtime bahasa yang dipasang terpisah pada host target. Run ini tidak mencatat flag build atau status CGO, jadi tidak dapat mengklaim bahwa setiap binary yang dihasilkan benar-benar statis.

Persiapan: toolchain Go yang diperlukan

Cerita dependensinya singkat, tapi nyata, jadi saya jelaskan dulu sebelum Anda memasang apa pun. Mesin yang saya gunakan untuk pengujian belum memiliki Go, dan Colly adalah library Go — jadi langkah pertama adalah memasang toolchain Go di mesin tersebut (saya memasang Go 1.26.5 lewat Homebrew). Jika tim Anda belum hidup di ekosistem Go, di situlah friksinya: bukan Colly-nya, melainkan lingkungan bahasa yang dibutuhkan sebelum satu baris pun bisa dikompilasi.

Setelah Go tersedia, go get github.com/gocolly/colly/v2 ter-resolve ke v2.3.0. Jalur yang diuji tidak memerlukan browser atau headless Chrome.

Ada satu bagian versi yang bisa membingungkan. Module Go ter-resolve ke v2.3.0 (dirilis Desember 2025), sementara entri terbaru yang terlihat di UI GitHub Releases saat dicek adalah v2.2.0 (Maret 2025). Perbedaannya ada pada versi module/repository versus entri GitHub Release, bukan module versus Git tag. Saya menguji v2.3.0.

Praktik langsung: ekstraksi dan batas operasional

Colly static and JSON results

Saya menjalankan Colly pada server fixture mandiri (Go httptest) ditambah dua situs demo publik. Direktori benchmark dan results/colly-test-summary.json yang terbaru menampilkan artefak, tetapi kedua tautan itu mengikuti branch yang bergerak. Artikel ini tidak menyertakan commit yang diuji, command yang persis, flag build, atau seed fixture, jadi ini belum menjadi resep reproduksi yang benar-benar tetap.

TesTargetHasil
Katalog statis + paginationfixture lokal12/12 produk yang diharapkan berhasil diekstrak
Ekstraksi artikelfixture lokaljudul + 3/3 paragraf
Respons JSON langsungfixture lokal8/8 item yang diharapkan lewat OnResponse
Penanganan HTTP 500fixture lokaldiarahkan ke OnError, status 500
Graf crawl (MaxDepth 2)fixture lokal17 halaman
Books to Scrapedemo publik20 produk
Halaman dinamis (tanpa JS)fixture lokal0 kartu (sesuai harapan)
Quotes JS (tanpa render)demo publik0 (sesuai harapan)

Pada fixture statis yang terkontrol, selector yang dikonfigurasi menghasilkan 12 dari 12 record produk yang diharapkan dan seluruh tiga paragraf artikel yang diharapkan. Respons JSON langsung tidak menyentuh parser HTML: OnResponse menyediakan body, lalu harness mendecode semua delapan item yang diharapkan. Satu fixture 500 sampai ke OnError dengan statusnya terekspos dan tidak menyebabkan run tersebut crash; itu tidak membuktikan reliabilitas tanpa pengawasan. Pada halaman publik Books to Scrape, selector mengembalikan 20 produk sebagai smoke test situs publik.

Untuk traversal, collector dikonfigurasi dengan MaxDepth(2) memakai konvensi seed-depth dari harness dan mengunjungi 17 URL dalam graf fixture. Hasil ini adalah cakupan crawl, bukan kecepatan. Trace yang diamati — bukan klaim yang lebih luas tentang graf apa pun — ada di results/local_crawl_graph.json.

Colly JavaScript zero result

Colly tidak menjalankan JavaScript. Fixture yang dirender oleh JavaScript menghasilkan 0 kartu target, dan halaman publik Quotes to Scrape JS menghasilkan 0 kutipan target. Jika elemen hanya ada setelah browser dieksekusi dan tidak ada endpoint pendukung yang bisa diakses untuk menyediakannya, jalur HTTP-only tidak akan melihat elemen itu sebagai DOM yang sudah dirender. Pasangkan dengan renderer, atau panggil endpoint pendukung langsung jika tersedia, seperti yang ditunjukkan fixture JSON.

Saya tidak menguji kolektor async, rate limiting atau konfigurasi politeness, rotasi proxy, retry, maupun backend queue dan storage. Tidak ada waktu total, throughput, concurrency, CPU, memori, latensi target, atau baseline pembanding yang diukur. Karena itu, artikel ini tidak membuat klaim kecepatan maupun reliabilitas tanpa pengawasan.

Cara menafsirkan hasil fixture

Tiga jalur konten yang berhasil menguji kontrak yang berbeda. Kasus katalog dan artikel menguji pemilihan CSS pada HTML yang dikirim server. Penyebutnya adalah ekspektasi fixture yang ditulis sebelum ekstraksi: dua belas record produk dan tiga paragraf artikel. Melaporkannya sebagai “expected records extracted” memang disengaja. Run ini tidak mendefinisikan fuzzy matching, penanganan duplikasi, toleransi field parsial, atau metrik recall di seluruh korpus, jadi hasilnya tidak boleh dipromosikan menjadi akurasi ekstraksi umum.

Kasus JSON melewati seleksi DOM. Colly menerima byte respons lewat OnResponse, lalu harness melakukan decoding JSON. Inilah alasan “Colly tidak merender JavaScript” tidak berarti setiap situs yang bergantung pada client tidak bisa diakses. Jika sumber data yang dipakai client adalah endpoint yang bisa dipanggil langsung dan request-nya dapat direproduksi di luar browser, crawler HTTP mungkin sudah cukup. Autentikasi, signature yang dibangkitkan, state khusus browser, dan kontrol anti-bot bisa mengubah jawaban itu; tidak ada yang diuji di sini.

Rute 500 menguji dispatch, bukan recovery. Ini menunjukkan callback OnError yang terdaftar menerima respons fixture tersebut beserta statusnya. Crawler produksi tetap memerlukan kebijakan eksplisit untuk kode yang bisa di-retry, backoff, kegagalan terminal, persistence, dan alerting. Pengujian ini tidak memberi bukti untuk pilihan-pilihan itu, dan “callback terpanggil” tidak boleh dibaca sebagai “job bisa dipercaya tanpa pengawasan.”

Colly depth-2 crawl graph

Graf 17 URL juga terbatas. Ini hanya mengonfirmasi himpunan URL yang dikunjungi oleh fixture ini, seed convention ini, dan MaxDepth(2). Ini tidak membuktikan pages per second, fairness antar host, pertumbuhan memori, atau perilaku pada siklus dan bentuk URL duplikat. Hal-hal itu memerlukan workload dan pengujian queue yang terpisah.

Checklist pemilihan yang didasarkan pada run ini

Mulailah dengan melihat respons yang benar-benar diterima Colly. Jika field yang dibutuhkan memang ada di HTML dari server, gunakan OnHTML dan validasi jumlah field atau key yang wajib sebelum menerima sebuah record. Jika responsnya JSON, tangani body lewat OnResponse dan validasi skemanya. Jika HTML-nya hanya shell aplikasi, periksa apakah request pendukung yang bisa diakses menyimpan datanya sebelum menambahkan browser.

Isi responsJalur CollyPemeriksaan penerimaan
Field wajib ada di HTML dari serverselector OnHTMLkey wajib dan jumlah record yang diharapkan
Payload JSON yang bisa dipanggil langsungOnResponse plus decoding JSONvalidasi schema dan field wajib
Shell HTML yang didukung request yang bisa direproduksirequest ke endpoint pendukungstatus respons, schema, dan kelengkapan
Data yang dibuat hanya setelah browser dijalankantambah renderer atau pilih browser crawlerkesiapan dan kelengkapan spesifik target

Jika eksekusi browser memang diperlukan, perlakukan itu sebagai komponen lain, bukan mengharapkan satu flag Colly untuk mengaktifkan rendering. Browser harus menetapkan kesiapan, mengekspos konten yang sudah dirender atau respons pendukung, lalu meneruskan data ke pipeline berikutnya. Review ini tidak menguji integrasi seperti itu.

Untuk deployment, catat versi Go, versi module, flag build, status CGO, command yang persis, seed fixture, dan commit repository. Detail-detail itu tidak ada pada tautan publik saat ini, dan itulah perbedaan antara artefak yang bisa diperiksa dan reproduksi yang tahan lama. Untuk operasional, tambahkan matriks kegagalan dan ukur workload yang benar-benar Anda pedulikan sebelum menyebut sistem ini cepat atau andal.

Kelebihan dan kekurangan

Kelebihan:

  • Mengekstrak 12/12 produk katalog yang diharapkan dan 3/3 paragraf artikel yang diharapkan lewat OnHTML.
  • Penanganan JSON berjalan bersih lewat OnResponse, tanpa perlu parsing DOM — 8/8 item API.
  • Respons 500 yang diuji sampai ke OnError dengan status terekspos.
  • Crawl dengan batas kedalaman mencapai 17 halaman dari satu collector.
  • Dikompilasi menjadi executable Go; target tidak memerlukan runtime Go yang dipasang terpisah untuk jalur yang diuji.
  • Lisensi Apache-2.0 yang permisif.

Kekurangan:

  • Tidak menjalankan JavaScript — konten yang dirender client hasilnya 0, titik.
  • Memerlukan toolchain Go; tim non-Go menanggung biaya setup itu sebelum menulis scraper apa pun.
  • Module yang diuji (v2.3.0) lebih maju daripada entri GitHub Release terbaru yang diamati (v2.2.0).
  • Output adalah kode Anda sendiri — Colly memberi callback, bukan exporter dataset/feed bawaan seperti Scrapy.
  • Backend async, rate limiting, proxy, dan queue memang ada, tetapi tidak diuji di sini; throughput dan skala belum diukur.

Cocok untuk siapa — dan siapa yang sebaiknya lewat

Colly no-browser boundary

Colly cocok jika Anda sudah menulis Go dan menarget HTML yang dirender server atau JSON yang bisa diakses langsung. Model callback memisahkan match terstruktur, payload mentah, dan kegagalan request. Executable yang dikompilasi juga menghindari kebutuhan lingkungan bahasa yang dipasang terpisah di mesin target, meskipun linking statis penuh tidak diverifikasi di sini.

Tambahkan renderer ketika elemen target yang dibutuhkan hanya muncul setelah browser dijalankan dan tidak ada endpoint pendukung yang bisa dipakai. Endpoint JSON langsung tetap bisa diminta tanpa rendering. Colly juga kurang cocok untuk tim yang tidak ingin toolchain Go, atau yang ingin layanan ekstraksi mengurus pembentukan schema dan pemeliharaan selector.

Alternatif, termasuk posisi Thunderbit

Colly adalah software open-source yang Anda jalankan sendiri. Tidak ada biaya lisensi vendor, tetapi compute, bandwidth, proxy, storage, observability, dan engineering tetap menjadi biaya Anda. Anda sendiri yang mengelola perilaku request, callback parsing, logika crawl, dan integrasi browser jika target memerlukan rendering.

Layanan ekstraksi terkelola memindahkan sebagian tanggung jawab itu ke vendor. Kami membangun Thunderbit, tetapi tidak mengujinya terhadap fixture ini, jadi artikel ini tidak membuat perbandingan rendering, anti-bot, kualitas, latensi, atau biaya. Distingsi yang bisa dipastikan adalah kepemilikan: Colly mengekspos respons HTTP dan callback di proses Go Anda; layanan terkelola bisa mengambil alih pengambilan data dan pembentukan schema dengan biaya per panggilan.

Ulasan benchmark terkait: perbandingan lengkap scraper open-source, ulasan crawler Python Scrapy, dan ulasan selector adaptif Scrapling.

Coba Thunderbit untuk Ekstraksi Data Web

Putusan

Colly adalah kandidat kuat untuk tim Go yang menarget HTML yang dirender server atau JSON langsung dan bersedia mengelola kode ekstraksinya sendiri. Fixture ini mendukung ekstraksi record yang diharapkan, satu trace crawl yang dibatasi, dan satu callback 500 yang teramati — bukan kecepatan, skala, atau reliabilitas tanpa pengawasan. DOM hasil render browser membutuhkan jalur lain kecuali data dasarnya bisa dipanggil langsung.

Coba Thunderbit untuk Ekstraksi Data Web Get Started Free

FAQ

Apakah review ini mengukur kecepatan Colly? Tidak. Yang diukur adalah ekstraksi record yang diharapkan, penanganan JSON langsung, satu callback error, dan cakupan graf crawl fixture. Tidak ada pengukuran waktu total, throughput, concurrency, CPU, memori, atau baseline pembanding.

Apakah Colly bisa men-scrape halaman yang dirender JavaScript? Colly tidak mengeksekusi JavaScript pada halaman. Karena itu, jalur HTTP yang diuji tidak menemukan elemen target yang hanya muncul di DOM hasil render. Colly tetap bisa meminta endpoint JSON pendukung yang bisa diakses langsung, seperti yang ditunjukkan fixture JSON. Gunakan renderer bila eksekusi memang diperlukan dan tidak ada request pendukung yang bisa direproduksi untuk menyediakan data.

Apakah saya perlu tahu Go untuk memakai Colly? Ya. Colly adalah library Go, bukan CLI mandiri — Anda mengimpor library-nya, mendaftarkan callback (OnHTML, OnResponse, OnError), lalu mengompilasi. Mesin yang saya uji belum memiliki Go, jadi setup dimulai dengan memasang toolchain Go (1.26.5). Jika tim Anda belum berada di ekosistem Go, lingkungan itu adalah biaya setup yang sesungguhnya.

Kenapa versi yang saya install tidak sama dengan release GitHub terbaru Colly? Module Go ter-resolve ke v2.3.0 (Desember 2025), sementara entri GitHub Release terbaru yang diamati adalah v2.2.0 (Maret 2025). Saya menguji v2.3.0; ini adalah perbedaan antara permukaan versi, bukan bukti instalasi rusak.

Apakah Colly gratis untuk penggunaan komersial? Ya, lisensinya Apache-2.0, jadi cukup permisif dan ramah untuk penggunaan komersial. Seperti biasa, pastikan lisensi terkini di repo sebelum Anda membangun di atasnya.

Sebelum dipakai di produksi, tambahkan pengujian yang sesuai dengan risiko operasional, bukan sekadar memperpanjang hasil fixture lewat analogi. Ukur crawl berulang pada target yang representatif, catat CPU dan peak memory, uji kegagalan yang bisa diretry maupun yang terminal, dan verifikasi politeness di bawah concurrency. Jika persistence penting, hentikan lalu lanjutkan crawl sambil memeriksa penanganan duplikat dan status queue. Jika kesederhanaan deployment penting, catat konfigurasi compiler dan linker yang tepat dan periksa dependensi runtime dari executable yang dihasilkan. Tidak ada satu pun dari pemeriksaan itu yang mengubah apa yang ditetapkan oleh fixture saat ini; pemeriksaan itulah yang menentukan apakah konfigurasi library yang sama cocok untuk pekerjaan produksi tertentu.

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 250.000+ pengguna
tersedia paket gratis
Dari halaman web ke spreadsheet
Jelaskan kebutuhanmu — Agen AI Thunderbit akan men-scrape lalu mengekspor ke Excel, Google Sheets, Airtable, atau Notion. Gratis untuk memulai.
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week