Ulasan Heritrix: Fidelitas WARC dan Biaya Operasional untuk Archival Crawling

Terakhir diperbarui pada August 17, 2026
Ulasan Heritrix: Fidelitas WARC dan Biaya Operasional untuk Archival Crawling
Ringkasan AI
Heritrix adalah crawler arsip open-source milik Internet Archive — penerus perangkat lunak di balik Wayback Machine, dan sudah dipakai di produksi selama dua dekade. Tugasnya adalah merekam apa yang disajikan sebuah situs ke dalam file WARC dengan setia, sehingga bisa diputar ulang bertahun-tahun kemudian. Di balik layar, ini adalah mesin Java, di mana setiap crawl berupa graf bean Spring yang ditulis dalam XML, dan seluruh siklus kerja dijalankan lewat REST API. Ini bukan scraper: tidak ada sintaks selector, tidak ada pemetaan field, dan tidak ada baris data di akhir.

Heritrix adalah crawler arsip open-source milik Internet Archive — penerus software yang jadi fondasi Wayback Machine, dan sudah dipakai di produksi selama dua dekade. Tugas utamanya adalah merekam apa yang ditampilkan sebuah situs ke dalam file WARC dengan setia, supaya bisa diputar ulang bertahun-tahun kemudian. Di balik layar, ini adalah mesin Java, di mana setiap crawl berbentuk graf bean Spring yang ditulis dalam XML, dan seluruh alur kerjanya dijalankan lewat REST API. Ini bukan scraper: tidak ada sintaks selector, tidak ada pemetaan field, dan tidak ada baris data di akhir.

Saya menguji versi 3.16.0 terhadap fixture lokal yang terkontrol dan menghitung apa yang benar-benar ditulisnya, record demi record. Yang paling menonjol adalah kelengkapannya: dua puluh URI yang di-fetch menghasilkan enam puluh satu record WARC, lengkap dengan payload digest dan IP capture pada setiap response, serta setiap request terhubung kembali ke response yang sesuai, tanpa perlu menyentuh satu pun pengaturan konfigurasi. Namun pengalaman mengoperasikannya justru kebalikannya — paket distribusi 41 MB, 114 jar (lib/ berisi 142 file; 28 sisanya adalah teks LICENSE dan NOTICE bawaan), dan file job config sekitar 750 baris sebelum fetch pertama — meskipun semua crawl di sini dijalankan secara headless lewat curl, tanpa satu klik pun di UI web.

Hasil penyimpanan menunjukkan default yang tidak langsung kelihatan. Dua URL fixture mengembalikan konten yang identik byte-per-byte, dan profil bawaan mengambil serta mengarsipkan keduanya secara penuh: dua response record dan nol revisit record, meskipun kedua response diberi payload digest yang sama. Deduplication berbasis content-digest baru bekerja setelah history processor ditambahkan; fitur ini tidak aktif di profil bawaan, dan manfaatnya adalah menghemat storage, bukan bandwidth.

Sebenarnya Heritrix itu apa

Mengarsipkan bukan sama dengan scraping, dan kebingungan kategori inilah yang paling perlu diluruskan. Heritrix tidak memberi kamu baris data. Tidak ada CSV di akhir. Output-nya adalah percakapan HTTP itu sendiri — header, body, dan metadata capture — yang disimpan dalam format untuk preservasi, dan ini adalah implementasi referensi untuk kategori pekerjaan tersebut. Memintanya membuat daftar harga produk sama saja seperti meminta juru tulis pengadilan memberi ringkasan.

Angka terkini per 27 Juli 2026: repositori ini memiliki 3.285 bintang dengan 36 isu terbuka, dan 3.16.0 adalah rilis terbaru, diterbitkan pada 2026-07-03. Itulah build yang saya uji, jadi tidak ada keluhan soal versi usang di sini. Soal lisensi ada sedikit catatan: file LICENSE sendiri adalah Apache-2.0 biasa, tetapi detektor bawaan GitHub menampilkan "Other" karena beberapa file pihak ketiga yang dibundel membawa ketentuan masing-masing. Jika Heritrix akan masuk ke produk komersial, ini layak mendapat perhatian legal selama lima menit, bukan sekadar lirik singkat ke badge di sidebar.

Ada satu fakta struktural yang memengaruhi semuanya: Heritrix tidak mengendalikan browser. Ia melakukan fetch lewat HTTP dan mengekstrak tautan dari byte yang diterima. Saudara modernnya dalam dunia arsip, Browsertrix Crawler, melakukan kebalikannya — memakai Chromium sungguhan dan merekam apa yang benar-benar dilakukan browser. Keduanya menulis WARC, tetapi ulasan ini hanya mengukur jalur non-browser milik Heritrix; saya tidak membandingkan skala atau throughput keduanya.

Chain, bean, dan SURT: bagaimana sebuah crawl sebenarnya dirangkai

System diagram: Chains, beans, and SURT

Di balik layar, job Heritrix adalah application context Spring. Bukan sekadar "dikonfigurasi dengan Spring" — ia memang graf bean Spring yang ditulis dalam XML, dan setiap bagian crawl adalah bean yang bisa diganti.

Frontier menyimpan antrean URI, dipartisi berdasarkan host. Karena partisi inilah politeness bekerja seperti yang kita lihat, dan ini penting nanti.

Processor chain mengerjakan tiga tahap: candidate chain (apakah URI yang baru ditemukan ini layak dijadwalkan?), fetch chain (DNS, robots, fetch HTTP, ekstraksi tautan), dan disposition chain (menulis ke WARC, memperbarui state). Menambahkan kemampuan ke Heritrix biasanya berarti menyisipkan bean processor di titik yang tepat dalam chain yang tepat — dan itulah cara saya mengaktifkan dedup.

Scope adalah tumpukan DecideRule yang beroperasi pada SURT — Sort-friendly URI Reordering Transform, yang mengubah http://www.example.com/a menjadi http://(com,example,www,)/a agar prefiks hostname tersusun seperti hierarki saat diurutkan. Scope default dibuat dari prefiks SURT seed kamu. Rule menerima atau menolak secara berurutan, dan keputusan terakhir menang.

WARC writer berada di disposition chain, sedangkan politeness hidup di frontier sebagai tiga angka: delayFactor, minDelayMs, maxDelayMs. Kepatuhan robots ditentukan lewat string policy pada fetcher.

Dan semuanya bisa dikendalikan lewat REST API, yang ternyata jauh lebih penting daripada yang saya kira.

Setup adalah bagian paling berat dari seluruh pengalaman

Yang harus kamu deploy sebelum fetch pertama:

Dimensi setupHeritrix 3.16.0
Tarball distribusisekitar 41 MB
File dalam lib/ setelah diekstrak142 total: 114 file .jar dan 28 teks LICENSE/NOTICE
Apa yang dijalankan saat startmesin Java plus UI web Jetty tertanam di https://localhost:8443 dengan sertifikat self-signed
Waktu sampai siap untuk REST, di mesin sayasekitar sepuluh detik
Job config bawaan (crawler-beans.cxml)sekitar 750 baris XML bean Spring

Sebagian besar job config itu takkan pernah kamu ubah. Tapi kamu tidak bisa melewatinya begitu saja, dan ada dua field yang wajib diisi sebelum crawler mau mengambil apa pun: seed kamu, dan metadata.operatorContactUrl. Nilai bawaan cuma placeholder, dan crawler tidak akan berjalan sampai kamu menggantinya dengan URL sungguhan yang mengidentifikasi siapa yang menjalankan crawl.

Persyaratan itu menciptakan jejak akuntabilitas: operator harus menyediakan contact URL sebelum crawler berjalan. Ini tidak membuktikan identitasnya benar, crawl-nya berwenang, atau patuh pada aturan yang berlaku, tetapi membuat informasi kontak menjadi bagian dari job, bukan sekadar kebiasaan opsional.

Ada dua temuan setup yang benar-benar mengejutkan saya.

Ia berjalan pada JDK yang lebih baru daripada minimum di dokumentasi. Dokumentasi Getting Started meminta Java 17 atau lebih baru. Heritrix 3.16.0 berhasil boot, melayani REST API, dan menyelesaikan semua crawl pada fixture ini di OpenJDK 26.0.1, tanpa --add-opens, tanpa --enable-preview, dan tanpa workaround Security Manager. Ini memang hasil di satu mesin macOS arm64, bukan matriks kompatibilitas, tetapi setidaknya menegaskan bahwa build yang diuji tidak cuma terbatas pada JDK 17 di host ini.

Kamu sama sekali tidak perlu menyentuh UI web. Seluruh siklus job dijalankan lewat REST, dan saya mengotomatiskan semuanya dengan curl: membuat job, PUT file beans, build, launch, unpause, polling sampai state controller menunjukkan FINISHED, lalu terminate dan teardown. Itulah jawaban nyata untuk pertanyaan "apakah Heritrix bisa dioperasikan dalam pipeline" — ya, secara headless, tanpa klik browser sama sekali. Banyak tulisan hanya menampilkan screenshot UI Jetty dan seolah-olah itu satu-satunya antarmuka. Padahal itu cuma kemudahan, bukan keharusan.

Satu catatan deployment yang spesifik ke host: Mac ini menjalankan proxy HTTP sistem lewat Surge. Klien Java milik Heritrix mewarisi proxy itu dan bahkan mengirim traffic fixture 127.0.0.1 melewatinya, sehingga menghasilkan response 503 meskipun ada exception list OS dan NO_PROXY. Menjalankan JVM dengan -Djava.net.useSystemProxies=false mengubah hasil dari 2×503 menjadi 18×200. Ini adalah interaksi lingkungan, bukan bug Heritrix; flag tersebut relevan hanya jika mewarisi pengaturan proxy sistem memang tidak diinginkan.

Apa yang benar-benar masuk ke arsip

Saya menjalankan profil default bawaan terhadap fixture terkontrol — sebuah server lokal dengan set endpoint yang sudah diketahui, termasuk halaman HTML, chain tiga level kedalaman, robots.txt dan sitemap, serta route 404 dan 500 yang sengaja disiapkan — lalu mem-parsing hasil WARC record demi record, alih-alih mempercayai satu baris ringkasan.

Dua puluh URI yang di-fetch menghasilkan enam puluh satu record:

Jenis WARC recordJumlahIsinya
warcinfo1provenance tingkat crawl, ditulis sekali per file
response20respons HTTP lengkap, header dan body
request20request persis yang dikirim Heritrix
metadata20anotasi capture milik Heritrix

Rasio 1:1:1 yang rapi untuk response/request/metadata per URI, langsung dari awal, tanpa konfigurasi apa pun dari saya. Dan kelengkapan per record tetap terjaga saat diperiksa:

Pemeriksaan per recordJumlahMengapa penting
Payload digest berawalan sha1: pada response20/20
WARC-IP-Address pada response20/20IP asal konten yang benar-benar menyajikannya — jenis informasi yang sangat kamu butuhkan bertahun-tahun kemudian ketika domain sudah berpindah tangan
Record request terhubung ke response lewat WARC-Concurrent-To20/20Bukan "sebagian besar terhubung". Semuanya.

Dan status HTTP dipertahankan apa adanya, termasuk yang jelek: 200 OK, 404 Not Found, dan 500 Internal Server Error semuanya muncul sebagai status line sungguhan dalam response yang tersimpan, bukan dibuang sebagai kegagalan.

Poin terakhir ini memisahkan archiving dari scraping lebih tegas daripada yang lain. Scraper menganggap 500 sebagai error yang harus diulang atau dilewati. Archiver memperlakukannya sebagai apa yang dikatakan server pada saat itu, dan itu adalah fakta yang layak disimpan. Wiki Heritrix Output menjelaskan struktur record ini; yang belum saya lihat di mana pun adalah multiplicity yang terukur dan linkage 20/20 pada set endpoint yang diketahui. Ternyata memang konsisten.

Hasil dedup, diukur dari dua sisi

Measured results chart: WARC records with and without digest history

Fixture saya menyajikan /dup/one dan /dup/two dengan body yang identik byte. URL berbeda, konten sama — kasus persis yang dituju content-digest dedup untuk dikompakkan. Saya menjalankannya dua kali: sekali dengan profil bawaan, sekali lagi setelah menyisipkan chain history digest (BdbContentDigestHistory, ditambah ContentDigestHistoryLoader di fetch chain dan ContentDigestHistoryStorer setelah WARC writer).

Profil default bawaanDengan chain ContentDigestHistory
Full response record yang ditulis21
revisit record yang ditulis01
Payload digest yang samaya (keduanya)ya
Profil revisitidentical-payload-digest

Secara default, kedua response mendapat digest yang sama, tetapi tidak ada history processor yang menanganinya, sehingga kedua payload tetap ditulis penuh. Menambahkan chain tersebut mengubah capture kedua menjadi record WARC revisit yang menunjuk ke payload digest identik, yaitu perilaku yang didefinisikan spesifikasi WARC 1.1 untuk revisit.

Tidak ada yang tersembunyi di sini. Halaman wiki Duplication Reduction Processors memang menyatakan bahwa skipIdenticalDigests default-nya false dan bahwa dedup yang agnostik terhadap URL memerlukan loader dan storer bean tersebut. Ini bukan perilaku tersembunyi yang baru ditemukan; seperti hampir semua hal yang saya ukur di sini, ini adalah perilaku Heritrix yang terdokumentasi, hanya saja kali ini disertai angka dari pengujian langsung. Kesenjangannya ada antara dokumentasi dan apa yang orang percaya, dan menurut pengalaman saya, keyakinan umumnya adalah "Heritrix mendedup", titik, tanpa asterisk soal konfigurasi.

Dua konsekuensi penting untuk dipahami:

Dedup terjadi saat write, bukan saat bandwidth. Ini lebih soal mekanisme daripada sesuatu yang saya ukur terpisah, tetapi logikanya langsung mengikuti cara content digest bekerja: kamu baru bisa membandingkan digest setelah byte tiba, jadi URL kedua tetap harus di-fetch dari origin. Mengaktifkan chain mengurangi apa yang disimpan, bukan apa yang ditransfer atau apa yang harus disajikan server target. Siapa pun yang menganggarkan dedup sebagai penghemat politeness atau bandwidth sebenarnya terbalik.

Perkiraan storage yang bergantung pada asumsi "nanti bakal dedup" bisa sangat meleset. Jika kamu mengarsipkan situs dengan duplikasi template yang tinggi — PDF mirror, halaman landing boilerplate, versi print dari artikel yang sama — lalu menghitung kapasitas disk dengan asumsi body identik akan terkompresi, profil bawaan mungkin justru memakai storage jauh lebih besar daripada estimasi itu. Fixture dua URL ini hanya membuktikan perilaku default, bukan dampaknya pada skala jutaan URI; dampak nyata bergantung pada tingkat duplikasi, ukuran payload, dan desain recrawl.

Scope dan robots melakukan persis yang dijanjikan

Kata crawler tentang apa yang tidak di-fetch-nya nilainya kecil, jadi keduanya diukur lewat hit counter sisi server — target server menghitung request-nya sendiri, terlepas dari apa pun yang dicatat Heritrix.

KontrolKondisiHit sisi server pada targetYang terlihat di crawl log
ScopeScope default; saya men-seed halaman yang menaut ke host kedua dengan authority SURT yang berbeda0host di luar scope sama sekali tidak muncul — artinya ditolak saat discovery, bukan masuk antrean lalu gagal
RobotsPolicy default obey; halaman utama menaut ke /robots-denied/secret, yang dilarang oleh robots.txt fixture saya0tercatat sebagai diblokir (robots.txt sendiri tetap di-fetch)
RobotsKontrol: robotsPolicyName diubah ke ignore, lalu dijalankan ulang1

Scope. Sementara itu host yang memang berada dalam scope di-crawl secara normal, jadi scope benar-benar disiplin, bukan crawl yang rusak. Perlu catatan: di sini saya hanya menjalankan arm scope default, bukan kontrol positif dengan scope yang diperluas, jadi baca ini sebagai konfirmasi desain yang terdokumentasi, bukan bukti dua arah.

Robots. Tautannya selalu dapat dicapai; hanya policy robots yang menahannya. Kepatuhannya nyata, dan pintu keluarnya juga nyata — dan memang seharusnya begitu. Beberapa mandat pengarsipan secara sah mengesampingkan robots, dan itu harus membutuhkan pengetikan ignore secara sengaja ke file konfigurasi.

Politeness: 57,7 detik untuk merayapi dua puluh halaman lokal

Measured results chart: Same-host politeness, two configurations

Ada satu angka yang menentukan apakah Heritrix cocok untuk proyek kamu.

Fixture yang sama, perlakuan tiga kali run yang sama, pada satu host lokal dengan latensi di bawah satu milidetik:

Pengaturan politenessMedian jeda antar request pada host yang samaWall time, crawl penuh 20 URI
Default profil (delayFactor 5.0, minDelayMs 3000, maxDelayMs 30000)3.036 ms (minimum 3.021, maksimum 9.107, dari 48 jeda terukur)57,66 dtk / 57,66 dtk / 57,70 dtk (tiga run)
Politeness dimatikan2 ms27 ms (median)

Jeda yang terjadi berada tepat di lantai minDelayMs: pada origin yang latensinya di bawah satu milidetik, delayFactor × fetch-time nyaris tak berarti dan nilai minimum mendominasi secara konstruksi. Rasio antara dua baris di atas tidak terlalu berguna karena penyebut pada nol-politiness hanya puluhan milidetik dan berfluktuasi antar-run. Hasil yang stabil adalah lantai absolutnya: Heritrix bawaan menunggu sekitar tiga detik di antara request ke host yang sama dalam fixture ini, sehingga crawl 20 halaman berubah menjadi sekitar satu menit wall time.

Cara konkret membayangkannya: misalnya sebuah perpustakaan universitas harus mengarsipkan situs pemerintah berisi 50.000 halaman sebelum situs itu dimatikan, dan semuanya ada di satu host. Dengan lantai 3 detik per host, itu berarti 150.000 detik waktu tunggu paksa — sekitar 42 jam, atau hampir satu setengah hari, sebelum menghitung waktu fetch. Ini aritmetika dari lantai terukur saya sebesar 3.036 ms — 50.000 × 3,036 s = 151.800 s = 42,2 jam; bahkan pada minimum konfigurasi 3.000 ms hasilnya 41,7 jam, yang dibulatkan menjadi 42, bukan 41. Bukan crawl yang saya ukur, tetapi itulah aritmetika yang dibutuhkan rencana proyek kamu.

Untuk adilnya, politeness Heritrix bersifat per host, karena frontier mengantre berdasarkan host. Crawl luas ke ribuan domain mem-paralel-kan pekerjaan di antara antrean tersebut dan tidak mewarisi batas ini secara global. Fixture saya hanya satu host, yang merupakan kasus terburuk untuk angka ini. Jika target arsip kamu adalah satu situs besar, maka kasus terburuk itu memang kasusmu.

Dan ini memang fitur. Delay itulah yang membuat crawler arsip menjadi sesuatu yang masih ditoleransi pemilik situs, bukan langsung diblokir. Menurunkannya adalah keputusan tentang server orang lain, dan alat ini membuat keputusan itu eksplisit, bukan agresif secara default.

Apa yang tidak saya uji

Pengukuran ini hanya mencakup disiplin crawl pada fixture terkontrol, dan tidak lebih jauh dari itu. Di luar batas tersebut:

  • Dedup lintas crawl dan recrawl. Saya hanya mengukur dedup content-digest di dalam satu crawl. Mempertahankan database history URI antar crawl terpisah (FetchHistoryProcessor + PersistLog) adalah mekanisme yang berbeda dan tidak saya jalankan.
  • Skala dan stabilitas jangka panjang. Tidak ada frontier jutaan URI, tidak ada checkpoint-and-restore, dan tidak ada run multi-hari. Fixture saya mengukur disiplin, bukan daya tahan.
  • Capture yang dirender JavaScript. Capture default Heritrix bersifat non-browser, dan itulah yang saya ukur. Perilaku browser-based opsional tidak diuji di sini.
  • Politeness pada origin ber-latensi tinggi. Latensi lokal di bawah satu milidetik, jadi minDelayMs mendominasi secara konstruksi. Cara delayFactor berskala terhadap server nyata yang lambat tidak terisolasi dalam data saya.
  • Akurasi sitemap. robots.txt diminta dan directive sitemap diikuti, tetapi saya tidak menguji satu per satu apakah setiap entry <loc> benar-benar terjaring.

Apa yang harus dibuat eksplisit sebelum job produksi pertama

Profil bawaan memang panjang, tetapi keputusan yang mengubah makna arsip sebenarnya cukup ringkas. Mulailah dari scope. Seed membentuk prefiks SURT default, dan DecideRule dapat memperluas atau mempersempitnya secara berurutan. Tinjau urutan rule akhir dengan URL contoh yang in-scope dan out-of-scope, lalu verifikasi menggunakan trafik sisi server atau log request independen lainnya. Crawl report saja tidak bisa membuktikan bahwa host yang dikecualikan benar-benar tidak pernah dihubungi.

Berikutnya, putuskan apa arti policy robots dan identitas operator bagi koleksi kamu. Default yang diuji mematuhi aturan disallow pada fixture, sementara mengubah robotsPolicyName menjadi ignore membuat path yang diblokir tetap di-fetch. Peralihan ini sederhana secara mekanis, tetapi penting secara institusional. Catat siapa yang menyetujuinya dan alasannya, bersama operatorContactUrl yang valid; URL wajib itu memberi jalur kembali ke operator bagi pemilik situs, tetapi tidak memberikan alasan otorisasi.

Perencanaan storage juga butuh keputusan eksplisitnya sendiri. Jika body identik seharusnya menjadi revisit record, tambahkan dan tinjau content-digest history processor sebelum menentukan ukuran arsip. Chain yang saya uji memengaruhi representasi setelah fetch, jadi trafik ke origin tetap harus dianggarkan untuk kedua URL. Dedup lintas crawl adalah mekanisme terpisah dan tidak boleh disimpulkan dari hasil dua URL dalam satu crawl ini. Crawl validasi kecil dengan body duplikat yang sudah diketahui adalah cara murah untuk memastikan graf bean yang dipasang menghasilkan jenis record yang diinginkan.

Terakhir, perlakukan politeness sebagai input penjadwalan, bukan knob tuning yang dikerjakan di menit terakhir. Pada fixture lokal satu host, minDelayMs mendominasi total waktu. Proyek nyata harus menghitung lantai per host yang dikonfigurasi terhadap jumlah host target dan tenggat koleksi, lalu mengujinya pada latensi yang representatif. Crawl luas dan crawl satu situs memberi tekanan berbeda pada frontier yang dipartisi per host; ulasan ini hanya mengukur yang terakhir. Simpan juga lifecycle REST dalam runbook: build, launch, unpause, poll, terminate, dan teardown adalah state terpisah yang layak diamati dalam otomatisasi.

Kelebihan dan kekurangan

Kelebihan

  • Kelengkapan arsip sangat baik secara default: 20/20 response dengan payload digest, capture IP, dan link penuh request↔response, tanpa konfigurasi tambahan.
  • Menyimpan response error sebagai fakta — status 200, 404, dan 500 semuanya disimpan apa adanya.
  • Disiplin scope terbukti lewat counter sisi server: nol fetch di luar scope sementara host dalam scope di-crawl normal.
  • Kepatuhan robots benar-benar menahan fetch, dengan jalur keluar ignore yang sengaja disediakan untuk kebutuhan arsip yang diwajibkan.
  • Benar-benar headless lewat REST — create, build, launch, poll, teardown, semuanya lewat curl, tanpa klik UI.
  • Berjalan bersih di OpenJDK 26.0.1 tanpa flag JVM, yang lebih rapi untuk stack Java modern dibanding banyak codebase berumur dua puluh tahun.
  • URL contact operator yang wajib membuat crawler tidak bisa berjalan secara anonim.
  • Setiap bagian crawl adalah bean yang bisa diganti, sebab itulah mengaktifkan dedup cukup tiga sisipan bean, bukan fork.

Kekurangan

  • Content-digest dedup nonaktif secara default dan menulis payload identik secara penuh — jebakan nyata saat merencanakan storage.
  • Deployment berat: distribusi 41 MB, 114 jar, mesin Java plus Jetty, dan job config Spring sekitar 750 baris.
  • Politeness default memberlakukan lantai sekitar 3 detik per host; crawl 20 URI pada satu host memakan 57,7 detik.
  • Tidak ada rendering JavaScript pada jalur default, jadi konten yang hanya muncul di sisi klien tidak akan tertangkap.
  • Permukaan konfigurasi ini cocok untuk orang berpengalaman, tetapi menyulitkan pengguna kasual; tidak ada jalur lima menit menuju crawl pertama.
  • Tidak ada data terstruktur dalam output. Mengambil field dari WARC adalah proyek terpisah.

Siapa yang cocok memakainya, dan siapa yang sebaiknya menjauh

Heritrix cocok untuk institusi dan tim yang deliverable-nya adalah arsip itu sendiri. Perpustakaan, arsip nasional, pelestarian hukum dan kepatuhan, tim riset yang menganggap web sebagai sumber primer, siapa pun yang perlu membuktikan lima tahun lagi apa yang ditampilkan sebuah URL pada hari tertentu. Jika kata-kata "WARC," "replay," dan "provenance" sudah akrab di kamus kamu, inilah alat yang menjadi fondasi ekosistemmu, dan bebannya adalah harga dari interoperabilitas itu.

Frontier yang dipartisi per host dan pemakaian panjangnya dalam web archiving membuatnya masuk akal untuk crawl luas di banyak domain. Itu adalah pertimbangan arsitektural dan sejarah proyek, bukan hasil skala dari fixture ini; throughput jangka panjang, pemulihan checkpoint, dan perilaku jutaan URI masih belum diuji di sini.

Lewati Heritrix kalau kamu menginginkan data, bukan arsip. Kalau tujuanmu adalah spreadsheet produk, listing, atau kontak, Heritrix akan melakukan pekerjaan yang rapi dalam menangkap halaman yang kemudian masih harus kamu proses dengan pipeline terpisah — dan kamu sudah membayar mesin Java, konfigurasi Spring, dan lantai politeness 3 detik untuk itu. Lewati juga kalau targetmu adalah SPA yang dirender klien, karena fetcher non-browser hanya menangkap shell, bukan kontennya; di situ browser-based archiver adalah instrumen yang tepat. Dan lewati kalau kamu butuh hasil pertama hari ini, karena kurva setup memang nyata.

Alternatif, dan di mana API terkelola cocok

Di ranah archiving, padanan modern yang paling dekat adalah Browsertrix Crawler — archiver berbasis browser yang mengendalikan Chromium dan merekam apa yang dilakukan browser. Ia bisa menangkap konten hasil JavaScript yang tidak ada dalam response HTTP default Heritrix, tetapi dengan tambahan overhead deployment dan runtime browser. Ulasan ini tidak menjalankan benchmark head-to-head, jadi keputusan dimulai dari kebutuhan capture: state yang dihasilkan browser mengarah ke browser archiver; resource HTTP konvensional tetap jalur native Heritrix.

Ulasan terkait: ulasan Browsertrix Crawler.

Untuk jenis masalah yang sama sekali berbeda — kamu tidak ingin arsip, kamu ingin data terstruktur dari halaman — bandingkan Heritrix dengan sistem ekstraksi berdasarkan output, bukan menganggapnya crawler yang setara. Heritrix gratis dan self-hosted: kamu yang menjalankan JVM, memiliki file beans, mengatur kapasitas disk, dan menyesuaikan politeness. Model ini cocok ketika preservasi adalah deliverable.

Pengungkapan: Thunderbit adalah produk penerbit dan tidak diuji dalam fixture Heritrix ini. Ia termasuk kategori ekstraksi terkelola: output-nya adalah konten halaman atau record terstruktur, bukan file WARC berkelas preservasi. Pilih archiver ketika capture yang bisa diputar ulang dan provenance benar-benar dibutuhkan; pertimbangkan layanan ekstraksi ketika deliverable-nya adalah baris data atau teks dokumen dan operasi terkelola dapat diterima.

Pengarsipan juga membawa pertanyaan izin tersendiri, dan ini tidak sama dengan scraping. Heritrix mematuhi robots.txt secara default dan mengharuskan kamu mengidentifikasi diri sebelum mengambil satu byte pun, yang merupakan baseline yang baik — tetapi crawl yang patuh robots tidak otomatis berarti crawl yang berizin. Hak cipta, syarat layanan, data pribadi, dan mandat institusi kamu semuanya berada di atasnya, dan policy ignore memang ada untuk organisasi yang punya dasar hukum memakainya, bukan sebagai toggle kenyamanan. Kalau kamu sedang membangun program pengarsipan, selesaikan ruang otorisasi sebelum disk penuh, dan baca juga sisi legal dari web scraping dan archiving jika ini wilayah baru buat kamu.

Coba Thunderbit untuk Ekstraksi Data Web

Putusan

Perlukah memakai Heritrix? Ya — kalau output kamu adalah arsip dan ada seseorang yang mau belajar Spring bean.

Fixture ini mendukung keputusan yang jelas: profil bawaan mempertahankan response, request, dan metadata capture secara konsisten; kontrol scope dan robots memengaruhi fetch sisi server sesuai konfigurasi; dan seluruh lifecycle job berjalan lewat REST. Itu semua adalah properti yang berguna untuk pipeline arsip, dalam batas kecil satu host yang diuji di sini.

Biaya operasionalnya juga sama jelasnya: distribusi Java dan konfigurasi Spring yang besar, delay per host yang dikonfigurasi dan mendominasi crawl lokal ini, serta dedup content-digest yang memerlukan history processor tambahan. Tim yang membutuhkan fidelitas WARC mungkin akan menerima biaya tersebut; tim yang membutuhkan field terstruktur sebaiknya mulai dari kategori lain.

Sebelum crawl produksi, verifikasi chain dedup, pengaturan politeness, scope, policy robots, identitas operator, dan asumsi storage terhadap konfigurasi job yang sebenarnya. Profil bawaan hanyalah titik awal, bukan pernyataan implisit atas pilihan operasional tersebut.

Coba Thunderbit untuk Ekstraksi Data Web Get Started Free

FAQ

Apakah operatorContactUrl membuat crawl menjadi berizin? Tidak. Itu memaksa job menyertakan URL kontak, yang memberi jalur akuntabilitas bagi operator situs, tetapi tidak menetapkan izin, keakuratan identitas, status hak cipta, atau kepatuhan regulasi. Semua itu tetap keputusan deployment di luar crawler.

Apakah dedup berbasis content-digest mengurangi request ke origin? Tidak dalam konfigurasi yang diuji di sini. Kedua URL tetap di-fetch sebelum payload digest-nya bisa dibandingkan. Chain history mengubah cara payload kedua direpresentasikan dalam storage WARC; itu tidak mengubah URL kedua menjadi request jaringan yang dilewati.

Bisakah Heritrix berjalan tanpa UI web? Bisa. Lifecycle yang diuji — create, unggah konfigurasi, build, launch, unpause, poll, terminate, dan teardown — berjalan lewat REST API menggunakan curl. UI Jetty tertanam tidak diperlukan.

Apakah profil bawaan Heritrix mendedup payload identik? Tidak dalam fixture yang dikonfigurasi ini. Profil bawaan menyimpan kedua response identik sebagai full response record. Menambahkan content-digest history chain mengubah capture kedua menjadi revisit record, jadi dedup adalah pilihan pipeline yang harus kamu konfigurasi dan verifikasi, bukan default otomatis.

Bagaimana saya harus memilih delay politeness? Anggap timing lokal di sini sebagai pemeriksaan mekanisme, bukan rekomendasi produksi. Tetapkan delay berdasarkan aturan situs target, kesepakatan dengan operator, kapasitas server, tujuan crawl, dan kebijakan retry/concurrency kamu sendiri, lalu pastikan jeda request pada host yang sama benar-benar sesuai log.

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