Mengaktifkan fitur auto_save dan auto_match supaya selektor menyesuaikan diri saat struktur DOM website berubah. Memahami mekanisme self-healing berbasis skor kemiripan elemen, storage SQLite, dan parameter identifier serta automatch_domain untuk pengelolaan lintas domain.

Selama tujuh episode terakhir kalian membangun scraper yang cepat dan mampu menembus anti-bot. Tapi ada satu musuh yang belum dibahas: perubahan struktur website. Class berubah, markup dirombak, elemen dipindah — dan scraper yang kemarin sempurna besok pagi mengembalikan list kosong tanpa error. Inilah masalah yang membuat banyak engineer frustrasi, dan di episode 9 ini Scrapling menjawabnya dengan auto-match dan adaptive selectors.
Di episode ini kalian akan belajar: apa itu DOM drift dan kenapa selektor konvensional rapuh, alur kerja auto_save lalu auto_match, cara mengaktifkan fitur dengan benar beserta batasannya, mekanisme self-healing berbasis skor kemiripan elemen dan storage, serta parameter identifier dan automatch_domain. Kuncinya: semua ini bekerja tanpa AI — hanya mesin similarity yang cerdas dan penyimpanan lokal.
DOM drift adalah kondisi ketika struktur HTML sebuah halaman berubah sementara selektor kalian tetap. Contoh paling sederhana: selector .product-card tiba-tiba berhenti menghasilkan data karena class-nya diganti menjadi .product-item atau karena elemennya dipindah ke dalam container baru. Pada website besar, perubahan seperti ini terjadi terus — desain ulang, migrasi framework, atau A/B testing.
Dampaknya tidak sebatas data kosong. Sebuah scraper yang berjalan di malam hari mungkin menyimpan set data yang tidak lengkap selama berhari-hari sebelum ada yang menyadari. Di sinilah pendekatan konvensional berhenti: kalian buka DevTools, inspeksi elemen, tulis selektor baru, dan berharap tidak ada perubahan lagi. Auto-match mengotomatiskan proses itu.
Konsepnya sederhana: pada hari pertama kalian menyimpan fingerprint elemen target, dan di hari-hari berikutnya mencocokkan elemen itu ke lokasi barunya. Pemakaiannya dua tahap. Tahap pertama, saat struktur masih normal, aktifkan auto_save pada selektor untuk merekam ciri-ciri unik elemen.
from scrapling import Fetcher
page = Fetcher.get("https://example.com/products")
produk = page.css(".product-card", auto_save=True)
print(len(produk))Setelah auto_save=True{python} dijalankan, Scrapling menyimpan profil elemen ke penyimpanan lokal. Suatu hari website berganti struktur — class product-card tidak ada lagi. Kalian cukup mengganti flag pemanggilan selektor menjadi auto_match=True, dan Scrapling akan menemukan elemen yang setara di halaman baru.
from scrapling import Fetcher
page = Fetcher.get("https://example.com/products")
produk = page.css(".product-card", auto_match=True)
print(len(produk))Secara teknis kalian bisa menjadikan keduanya sebagai jalur fallback: coba selektor biasa, dan jika hasilnya kosong, baru aktifkan auto_match. Pola ini membuat scraper kalian tetap menghasilkan data saat terjadi perubahan, tanpa perlu menulis ulang kode.
Fitur ini punya beberapa aturan yang wajib dipahami supaya tidak berjalan di tempat. Pertama, auto-match harus diaktifkan pada level objek, bukan hanya pada pemanggilan selektor. Aktifkan lewat argumen auto_match=True saat membuat Adaptor atau fetcher, atau lewat atribut kelas.
from scrapling import Fetcher
Fetcher.auto_match = True
page = Fetcher.get("https://example.com/products")
produk = page.css(".product-card", auto_save=True)Kedua, auto_match dan auto_save hanya bekerja pada satu elemen (Adaptor), bukan pada sekumpulan elemen. Memanggil page.css("body").css(".product-card", auto_match=True) akan error karena yang menerima pemanggilan adalah daftar, bukan elemen tunggal. Gunakan css_first untuk mengambil elemen pertama lalu seleksi lagi.
Ketiga, penyimpanan hanya dibuat jika fitur benar-benar dipakai. Ini sengaja demi performa — database SQLite tidak dibuka sampai kalian memakai auto_save atau auto_match, jadi menyalakan auto_match=True tanpa selektor ber-flag tidak akan membuat storage percuma.
Warning
Auto-match bukan sihir untuk elemen yang benar-benar hilang. Jika sebuah elemen dihapus total dari halaman, tidak ada yang bisa dicocokkan. Fitur ini menangani elemen yang berubah atau berpindah — bukan elemen yang tidak ada lagi.
Bagaimana Scrapling menemukan elemen yang sama tanpa AI? Jawabannya adalah sistem skor kemiripan. Saat auto_save dijalankan, Scrapling mengekstrak ciri-ciri elemen: nama tag, isi teks, atribut (nama dan nilai), nama tag saudara kandung (siblings), dan path dari akar dokumen. Ciri-ciri ini disimpan di database SQLite yang dikunci dengan domain website.
Saat auto_match dijalankan, Scrapling mengambil profil tersimpan lalu membandingkannya dengan semua elemen di halaman baru. Perbandingan tidak eksak — setiap elemen diberi skor berdasarkan seberapa mirip cirinya, termasuk urutan penulisan class. Elemen dengan skor tertinggi di atas ambang batas itulah yang dipilih. Inilah kenapa class product-card yang berubah menjadi product-item tetap dikenali: atribut, teks, dan posisi strukturnya masih mirip.
from scrapling import Fetcher
page = Fetcher.get("https://example.com/products")
first = page.css_first(".product-card")
if first:
first.css(".title", auto_save=True)
page_baru = Fetcher.get("https://example.com/products")
judul = page_baru.css_first(".product-card").css(".title", auto_match=True)
print(judul.text)Skema di atas mencontohkan alur dua kali kunjungan: kunjungan pertama menyimpan profil elemen judul, dan kunjungan berikutnya mencocokkannya lewat auto_match meskipun struktur sudah berubah. Karena penyimpanan dikunci per domain, halaman berbeda di domain yang sama tetap bisa saling mencocokkan.
Dua parameter ini mengontrol bagaimana profil elemen disimpan dan dicari. identifier adalah nama kunci yang dipakai untuk menyimpan profil. Default-nya string selector itu sendiri, tapi kalian bisa menggantinya — berguna saat selector berubah tapi ingin memakai profil yang sama.
automatch_domain memaksa domain yang dianggap sama. Berguna ketika kalian menguji dengan dua URL yang beda host tapi sama website-nya (misalnya www versus tanpa www), atau saat memakai data contoh dari satu domain untuk dipakai di domain lain.
from scrapling import Adaptor
html = open("salinan_halaman.html", encoding="utf-8").read()
page = Adaptor(html, url="https://example.com/products")
page.css(".product-card", identifier="kartu-produk", auto_save=True)
page_baru = Adaptor(html, url="https://example.com/products")
hasil = page_baru.css(".product-card", identifier="kartu-produk", auto_match=True)
print(len(hasil))Perhatikan pemakaian Adaptor langsung dari string HTML — teknik ini berguna saat kalian menyimpan salinan halaman untuk pengujian offline. Dengan identifier yang sama, auto_match menemukan profil yang tersimpan meskipun selector-nya berubah. Pasangan url dan identifier inilah kunci yang menentukan profil mana yang diambil dari database.
Episode 9 ini memberi scraper kalian kemampuan menyembuhkan diri. Kalian sudah paham DOM drift dan kenapa selektor statis rapuh, alur auto_save lalu auto_match, cara aktivasi beserta batasannya (level objek, elemen tunggal, storage lazily dibuat), mekanisme skor kemiripan berbasis tag, teks, atribut, dan siblings yang bekerja tanpa AI, serta identifier dan automatch_domain untuk kontrol penyimpanan. Mulai sekarang, desain ulang website bukan lagi mimpi buruk.
Inti yang harus dibawa pulang:
auto_save=True merekam fingerprint elemen saat struktur masih normal.auto_match=True menemukan ulang elemen ketika struktur berubah, tanpa AI.Adaptor/fetcher dan hanya untuk elemen tunggal.identifier dan automatch_domain mengendalikan kunci penyimpanan profil elemen.Di episode 10 kita merapikan hasil buruan kalian: data extraction dan serialization — mengubah elemen menjadi dictionary dan JSON, membersihkan teks, menangani pagination, dan menyusun dataset terstruktur. Sampai jumpa!