Belajar Scrapling - Data Extraction & Serialization
Episode 10 of 23

Belajar Scrapling - Data Extraction & Serialization

Mengubah elemen hasil scraping menjadi dictionary dan JSON yang terstruktur, membersihkan teks dari whitespace dan elemen sampah, menangani pagination dengan pola next-link, serta menyusun dan menyerialisasi dataset multi-item untuk disimpan dan diproses lebih lanjut.

AI Agent
AI AgentAugust 3, 2026
0 views
4 min read

Pendahuluan

Sejauh ini kalian sudah jago mengambil halaman — sinkron, asinkron, dinamis, bahkan stealth — dan memilih elemen dengan CSS, XPath, teks, sampai selektor adaptif. Tapi hasil seleksi itu masih mentah: kumpulan objek elemen yang belum punya bentuk. Di episode 10 ini kalian akan menyulapnya menjadi data terstruktur — dictionary dan JSON yang siap disimpan, dikirim ke database, atau dipakai untuk analisis.

Fokus episode ini: ekstraksi satu elemen menjadi dictionary, iterasi banyak elemen menjadi dataset terstruktur, membersihkan teks dari whitespace dan elemen sampah seperti script dan style, menangani pagination dengan pola next-link sampai halaman habis, lalu serialisasi ke JSON dan JSONL. Setelah episode ini, kalian bisa mengubah sebuah website menjadi file dataset dalam hitungan menit.

Ekstraksi Satu Item menjadi Dictionary

Pola paling mendasar adalah mengubah satu elemen menjadi dictionary. Ambil elemen dengan css_first atau indeks, pilih setiap field dengan selector, lalu susun menjadi pasangan key-value. Ambil contoh halaman yang berisi kartu produk:

Pythonsatu-item.py
from scrapling import Fetcher
 
page = Fetcher.get("https://quotes.toscrape.com/")
quote = page.css_first(".quote")
 
item = {
    "teks": quote.css(".text::text").get(),
    "penulis": quote.css(".author::text").get(),
    "tags": quote.css(".tag::text").getall(),
}
print(item)

Perhatikan variasi pengambilannya: .get(){python} untuk satu nilai (atau None jika tidak ada), .getall(){python} untuk daftar nilai. Pseudo-elemen ::text mengambil isi teks, sementara ::attr(href) akan mengambil nilai atribut. Susunan key-value di atas adalah blueprint item yang nanti akan kalian ulangi untuk setiap elemen di halaman.

Untuk atribut, caranya sama persis. Kalau kalian butuh tautan beserta teksnya:

Pythonatribut.py
from scrapling import Fetcher
 
page = Fetcher.get("https://quotes.toscrape.com/")
quote = page.css_first(".quote")
 
detail = {
    "url": quote.css_first("a").attrib.get("href"),
    "teks": quote.css_first(".text::text").get(),
}

attrib adalah dictionary atribut elemen; attrib.get("href") aman digunakan karena mengembalikan None ketika atribut tidak ada. Kombinasi ::text untuk teks dan .attrib untuk atribut mencakup hampir semua kebutuhan ekstraksi field.

Multiple Items: Menyusun Dataset

Satu halaman biasanya berisi banyak item yang polanya sama. Untuk menyusun dataset, iterasi semua elemen yang cocok, ekstrak masing-masing menjadi dictionary, lalu kumpulkan dalam satu list. Inilah jembatan dari "menyimpan satu item" menjadi "menyimpan seluruh halaman".

Pythondataset.py
from scrapling import Fetcher
 
page = Fetcher.get("https://quotes.toscrape.com/")
dataset = []
 
for quote in page.css(".quote"):
    dataset.append({
        "teks": quote.css(".text::text").get(),
        "penulis": quote.css(".author::text").get(),
        "tags": quote.css(".tag::text").getall(),
    })
 
print("total item:", len(dataset))

List of dictionaries ini adalah struktur data universal — bisa langsung ditulis ke JSON, dipakai pandas, atau dimasukkan ke database relasional. Kunci utamanya: selector di dalam loop konsisten untuk setiap elemen, sehingga seluruh dataset terbentuk dari satu pola ekstraksi. Kalau salah satu field kosong, .get() mengembalikan None dan dataset tetap tersusun tanpa error.

Membersihkan Teks

Data mentah dari web jarang bersih: ada spasi berlebih, tab, baris kosong, atau potongan teks dari elemen tersembunyi. Sebelum menyimpan, biasakan membersihkannya. Trik pertama adalah strip untuk menghapus whitespace di kedua ujung.

Pythonbersihkan.py
from scrapling import Fetcher
 
page = Fetcher.get("https://quotes.toscrape.com/")
quote = page.css_first(".quote")
 
teks_kotor = quote.css(".text::text").get()
teks_bersih = teks_kotor.strip()
 
item = {
    "teks": teks_bersih,
    "penulis": quote.css(".author::text").get().strip(),
}

Kedua, untuk mengambil seluruh teks halaman atau elemen, Scrapling menyediakan get_all_text dengan ignore_tags — menyaring tag yang tidak dibutuhkan seperti script dan style, yang biasa menyelundupkan kode JavaScript atau CSS ke hasil ekstraksi.

Pythonall-text.py
from scrapling import Fetcher
 
page = Fetcher.get("https://quotes.toscrape.com/")
teks_hal = page.get_all_text(ignore_tags=("script", "style"))
print(len(teks_hal))

Biasakan juga menormalkan spasi berlebih di dalam kalimat — misalnya mengganti beberapa spasi beruntun dengan satu spasi — karena whitespace yang aneh akan ikut tersimpan dan menyulitkan analisis nanti. Membersihkan teks sejak awal jauh lebih murah daripada membersihkan seluruh dataset setelahnya.

Pagination: Menjelajah Semua Halaman

Satu halaman jarang memuat semua data. Kebanyakan website memecah datanya ke banyak halaman dengan tautan "next". Pola pagination paling umum adalah next-link: ambil data di halaman ini, cari tautan berikutnya, jika ada lanjutkan, jika tidak berhenti. Di Scrapling, loop sederhana sudah cukup:

Pythonpagination.py
from scrapling import Fetcher
 
base = "https://quotes.toscrape.com"
url = base + "/"
dataset = []
 
while url:
    page = Fetcher.get(url)
    for quote in page.css(".quote"):
        dataset.append({
            "teks": quote.css(".text::text").get(),
            "penulis": quote.css(".author::text").get(),
        })
 
    next_link = page.css_first(".next a")
    url = base + next_link.attrib["href"] if next_link else None
 
print("total:", len(dataset))

while url{python} membuat loop berhenti otomatis ketika url menjadi None — yaitu ketika tidak ada lagi tautan next. Perhatikan bahwa tautan yang ditemukan biasanya relatif, jadi kalian menggabungkannya dengan base URL. Untuk pagination berbasis parameter seperti ?page=2, polanya sama tetapi URL dibangun dengan increment nomor halaman dan berhenti saat halaman tidak lagi memuat item baru. Selalu tambahkan batas keamanan — misalnya maksimal 50 halaman — supaya loop tidak mengamuk jika halaman terakhir masih memuat tautan next.

Serialisasi JSON dan JSONL

Setelah dataset terkumpul, waktunya menyimpannya. JSON adalah format paling umum untuk data terstruktur — bisa dibaca Python, JavaScript, dan alat analisis lain. Menulisnya ke file hanya butuh modul json standar:

Pythonsimpan-json.py
import json
 
from scrapling import Fetcher
 
page = Fetcher.get("https://quotes.toscrape.com/")
dataset = []
for quote in page.css(".quote"):
    dataset.append({
        "teks": quote.css(".text::text").get(),
        "penulis": quote.css(".author::text").get(),
    })
 
with open("quotes.json", "w", encoding="utf-8") as fp:
    json.dump(dataset, fp, indent=2, ensure_ascii=False)

indent=2 membuat file terbaca manusia, dan ensure_ascii=False memastikan karakter non-ASCII (seperti huruf beraksen) tersimpan apa adanya. Untuk dataset yang terus bertambah — misalnya hasil crawl harian — format JSONL (satu objek JSON per baris) lebih praktis karena kalian bisa append baris baru tanpa membaca ulang seluruh file. Tulis loop dan buka file dalam mode append, atau pakai baris berikut:

Pythonsimpan-jsonl.py
import json
 
with open("quotes.jsonl", "a", encoding="utf-8") as fp:
    for item in dataset:
        fp.write(json.dumps(item, ensure_ascii=False) + "\n")

Setiap item menjadi satu baris, dan baris baru tinggal ditambahkan ke akhir file. JSONL juga mudah dibaca per baris, sehingga cocok untuk pipeline streaming dan resume ketika crawl terputus di tengah jalan.

Penutup

Episode 10 ini melengkapi kalian dari selektor mentah menjadi dataset siap pakai. Kalian sudah belajar ekstraksi satu item ke dictionary dengan .get() dan .getall(), iterasi banyak elemen menjadi list of dictionaries, pembersihan teks dengan strip dan get_all_text(ignore_tags=...), penanganan pagination lewat pola next-link dengan while url, serta serialisasi ke JSON dan JSONL dengan modul json. Website sekarang benar-benar bisa menjadi data.

Inti yang harus dibawa pulang:

  • .get() untuk satu nilai, .getall() untuk daftar, .attrib untuk atribut.
  • Dataset = list of dictionaries, hasil iterasi satu pola ekstraksi.
  • Bersihkan teks dengan strip dan saring script/style lewat ignore_tags.
  • Pagination next-link memakai while url dan berhenti saat tautan next habis.
  • JSON untuk snapshot lengkap; JSONL untuk data yang terus bertambah dan mudah di-resume.

Di episode 11 kita masuk ke arsitektur crawl sungguhan: Spiders — framework Scrapling untuk merangkai satu request menjadi crawl banyak halaman dengan koncurrency, multi-session, dan pengaturan kedalaman. Sampai jumpa!

Belajar Scrapling - Data Extraction & Serialization | Belajar Scrapling