Menjaga scraper tetap sehat dalam jangka panjang: interactive shell dan inspeksi tree untuk debugging, verifikasi selector, auto-match untuk stabilitas saat struktur berubah, serta CI regression dan monitoring perubahan website.

Di episode 19 kalian menggabungkan Scrapling dengan AI dan LLM untuk ekstraksi yang fleksibel. Sekarang saatnya membahas apa yang membuat scraper tetap hidup bertahun-tahun: testing, debugging, dan maintenance. Scraper yang ditulis sekali dan dilupakan pasti rusak — website berubah, struktur DOM bergeser, dan anti-bot makin ketat. Episode 20 ini membangun budaya pemeliharaan yang mencegah kejutan itu.
Roadmap episode ini: pertama kita pakai interactive shell untuk debugging cepat, lalu inspeksi tree dan verifikasi selector, selanjutnya menulis test untuk selector, dan terakhir monitoring perubahan website, auto-match untuk stabilitas, serta CI untuk regression.
Saat selector tidak mengembalikan apa yang diharapkan, jangan langsung menebak. Gunakan interactive shell — repl IPython yang menyediakan shortcut untuk fetch, mengubah selector, dan mencoba ulang secepat mungkin. Luncurkan dengan scrapling shell setelah memasang extra scrapling[shell]:
pip install "scrapling[shell]"
scrapling install
scrapling shellDi dalam shell, kalian bisa mengeksekusi kode seperti di notebook:
>>> from scrapling import Fetcher
>>> page = Fetcher().get("https://quotes.toscrape.com/")
>>> page.css(".quote .text::text").getall()[:2]Siklus kerja yang direkomendasikan: fetch halaman, coba selector beberapa varian, cek hasil, lalu tempel selector final ke kode utama. Karena semua berjalan interaktif, iterasi jauh lebih cepat daripada menulis script, menjalankannya, lalu mengubahnya lagi.
Ketika hasil kosong, pertanyaan pertamanya: salah selector, atau salah fetch? Untuk menjawabnya, inspeksi tree yang sebenarnya terkirim. Cek tag, atribut, dan struktur di sekitar elemen yang dicari.
>>> card = page.css(".quote").first()
>>> print(card.tag)
>>> print(card.attrib)
>>> print(card.get_all_text(separator=" | ")[:120])Jika selector berhasil menemukan elemen, kalian juga bisa meminta Scrapling menghasilkan selector path yang menunjuk balik ke elemen itu — cara cepat untuk mendapatkan selector stabil berbasis struktur aktual alih-alih menebak dari DevTools. Kombinasikan dengan langkah verifikasi: pastikan jumlah hasil masuk akal, bukan sekadar tidak nol. Sepuluh elemen tak terduga bisa jadi tanda selector terlalu longgar.
Test paling berharga untuk scraper adalah regression test selector: test kecil yang memastikan selector masih menemukan elemen yang benar. Simpan cuplikan HTML sebagai fixture agar test bisa berjalan offline tanpa jaringan — dan tetap bisa mendeteksi perubahan kontrak data.
from scrapling import Fetcher
def test_quotes_selector():
page = Fetcher().get("https://quotes.toscrape.com/")
quotes = page.css(".quote .text::text").getall()
assert len(quotes) > 0
assert all(q.startswith("“") for q in quotes)
def test_quote_structure():
page = Fetcher().get("https://quotes.toscrape.com/")
first = page.css(".quote").first()
assert first.css(".author::text").get()Gunakan fixtures lokal untuk halaman yang proteksinya berat — snapshot HTML lalu test selector terhadap file itu. Dengan begitu, alur CI tidak perlu menembus anti-bot setiap kali; test fokus pada logika seleksi, bukan pada jaringan.
Website tidak memberitahu kalian saat berubah. Karena itu, monitoring harus proaktif:
Prinsipnya: deteksi dini selalu lebih murah daripada perbaikan darurat. Scraper yang gagal saat jam kerja lebih baik daripada gagal diam-diam di tengah malam tanpa log.
Salah satu alasan Scrapling diciptakan adalah untuk mengurangi frekuensi patahnya selector. Fitur auto-match membuat selector menyesuaikan diri ketika struktur DOM berubah — bukan menebak, melainkan mencari ulang elemen berdasarkan kesamaan struktur. Kalian sudah mengenalnya sejak episode 9; di sini kita menempatkannya sebagai bagian strategi maintenance.
from scrapling import Fetcher
page = Fetcher().get("https://shop.example.com/products")
page.auto_match = True
title = page.css(".product-title").get()Dengan auto_match aktif, jika class berubah tapi struktur tetap mirip, Scrapling tetap menemukan elemennya. Ini bukan pengganti test — justru pelengkapnya: auto-match menjaga scrapter tetap bekerja di antara dua cycle pemeliharaan, sementara test memastikan hasilnya tetap benar.
Success
Pola maintenance terbaik adalah kombinasi: auto-match untuk ketahanan, test regression untuk validasi, dan monitoring untuk deteksi. Satu saja tanpa yang lain membuat scraper rapuh atau tidak terverifikasi.
Manual testing tidak akan konsisten dilakukan manusia. Pindahkan ke CI sehingga setiap perubahan kode otomatis memvalidasi semua selector. Contoh workflow yang menjalankan test secara terjadwal dan saat file scraper berubah:
name: selector-regression
on:
schedule:
- cron: "0 2 * * 1"
push:
paths: ["scrapers/**"]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.12"
- run: pip install "scrapling[all]"
- run: scrapling install
- run: pytest tests/ -qDua pemicu itu melengkapi: push mendeteksi regression saat kode berubah, dan jadwal mingguan mendeteksi perubahan di sisi website. Gabungkan dengan langkah dry-run release agar perubahan versioning tidak menggagalkan alur ini.
Episode ini melengkapi sisi pemeliharaan: interactive shell dan inspeksi tree untuk debugging cepat, test selector untuk kepastian, monitoring untuk deteksi dini, auto-match untuk ketahanan, dan CI untuk eksekusi otomatis. Scraper yang dikelola dengan pola ini bisa bertahan berbulan-bulan dengan sedikit intervensi manual.
Inti yang harus dibawa pulang:
scrapling shell mempercepat iterasi selector secara drastis.Di episode 21, kita naik ke tahap produksi: CLI, Shell, MCP & Production Tooling — perintah scrapling, ekstraksi dari terminal, Docker image siap pakai, dan deployment terisolasi. Sampai jumpa!