Pengenalan Web Scraping

Etika, robots.txt, dan penguraian halaman sederhana dengan BeautifulSoup.

Daftar isi

Web scraping adalah pengambilan data langsung dari halaman web ketika API dan berkas tidak menyediakannya, dan keterampilannya terbagi dua bagian yang harus dibaca berurutan, yaitu izin sebelum kode dan penguraian sesudahnya. Topik ini membahas aturan mainnya, memperagakan penguraian halaman statis dengan BeautifulSoup pada halaman contoh milik sendiri, dan menegaskan batas teknisnya pada halaman dinamis. Setelah membacanya, sebuah tabel pada halaman HTML dapat diubah menjadi DataFrame dengan rantai langkah yang sah.

Etika dan izin sebelum kode#

Aturan pertama scraping adalah bertanya dulu apakah diizinkan, dan sumber jawabannya berlapis. Berkas robots.txt pada akar situs menyatakan jalur mana yang boleh diakses pengambil otomatis beserta batas lajunya, dan berkas itu dibaca lebih dahulu, misalnya situs-tujuan.com/robots.txt. Ketentuan layanan (terms of service) berada di lapis kedua dan dapat melarang pengambilan otomatis sepenuhnya, sedangkan hukum perlindungan data berada di lapis ketiga, terutama ketika halaman memuat data pribadi.

Sopan santun teknisnya menyertai aturan tersebut, yaitu jeda antar permintaan sebagaimana dibahas pada topik API, identitas yang jujur melalui User-Agent yang menyebut tujuan, serta cache agar halaman yang sama tidak diambil ulang. Data yang berhasil dikumpulkan juga tetap tunduk pada etika penggunaannya, sebagaimana dibedah pada modul etika dan privasi.

Menguraikan halaman statis#

Halaman statis berarti isinya sudah lengkap pada HTML yang dikirim server, sehingga penguraian cukup dilakukan lokal tanpa peramban. Topik ini memakai halaman contoh milik sendiri, yaitu halaman_contoh.html berisi satu tabel jadwal acara, agar setiap langkah dapat diulang tanpa menyentuh situs siapa pun. BeautifulSoup membaca HTML itu menjadi pohon objek yang dapat dicari dengan find dan find_all.

python scraping_sederhana.py
"""Menguraikan halaman lokal dengan BeautifulSoup dan menyusunnya jadi tabel."""
import pandas as pd
from bs4 import BeautifulSoup

with open("halaman_contoh.html", encoding="utf-8") as berkas:
    soup = BeautifulSoup(berkas, "html.parser")

tabel = soup.find("table", id="jadwal")
header = [th.get_text() for th in tabel.find_all("th")]
isi_baris = [
    [td.get_text() for td in tr.find_all("td")]
    for tr in tabel.find_all("tr")[1:]
]

jadwal = pd.DataFrame(isi_baris, columns=header)
print(jadwal.to_string(index=False))
print()
print(jadwal["ruang"].value_counts().to_string())
text Keluaran
   tanggal                 acara         ruang
2026-03-05   Kelas literasi data    Ruang Baca
2026-03-12  Diskusi buku bulanan Ruang Diskusi
2026-03-19       Jam cerita anak    Pojok Baca
2026-03-26 Bimbingan tugas akhir    Ruang Baca

ruang
Ruang Baca       2
Ruang Diskusi    1
Pojok Baca       1

Pola tiga langkah pada skrip tersebut adalah bentuk umum scraping, yaitu mencari wadahnya dengan atribut yang stabil seperti id, memetakan baris judul dan baris isi menjadi daftar, lalu menyusunnya menjadi DataFrame. Kolom tanggal pada hasil masih berupa teks, dan konversinya ke tipe datetime mengikuti cara yang sama dengan topik membaca berkas.

Mengambil halaman yang sebenarnya#

Apabila halamannya milik situs yang mengizinkan, tahap membuka berkas lokal diganti permintaan HTTP dengan requests, dan sisanya identik.

python Contoh: mengganti berkas lokal dengan halaman daring
# tidak-dijalankan
import requests

jawab = requests.get(
    "https://situs-tujuan.example/jadwal",
    headers={"User-Agent": "peneliti-akademik/1.0"},
    timeout=30,
)
jawab.raise_for_status()
soup = BeautifulSoup(jawab.text, "html.parser")

Pemilihan parser "html.parser" bawaan cukup untuk halaman yang rapi, dan peringatan bila struktur HTML tidak tertutup sempurna adalah sinyal untuk memeriksa ulang hasilnya. Pencarian elemen juga tidak terbatas pada tabel, misalnya find_all("h2", class_="judul") mengumpulkan seluruh judul bagian, dan pola daftar-dari-elemen inilah yang menyusun dataset dari halaman apa pun.

Halaman dinamis dan batas yang jujur#

Sebagian besar situs modern merender isinya dengan JavaScript di peramban, sehingga HTML mentah yang diterima requests belum berisi datanya. Situasi ini memiliki dua jalan, dan urutannya menunjukkan kematangan praktik. Jalan pertama adalah memeriksa jaringan pada peramban, karena banyak situs yang sebenarnya mengambil data dari API internal yang bisa diminta langsung dan jauh lebih stabil daripada HTML-nya. Jalan kedua adalah alat yang menjalankan peramban sejati, seperti Selenium atau Playwright, yang berada di luar lingkup jalur ini karena kebutuhan lingkungannya.

Batas yang jujur juga mencakup pemeliharaan. Halaman berubah tata letaknya, sehingga scraper yang berjalan lama membutuhkan pemeriksaan rutin atas keluarannya, dan pencarian berdasarkan id yang stabil lebih tahan lama daripada deretan kelas CSS yang sering diganti.

Kesalahan umum#

Kesalahan pertama adalah scraping tanpa memeriksa robots.txt dan ketentuan layanan. Hasilnya dapat berupa pemblokiran alamat atau kerugian yang lebih besar, sedangkan pemeriksaannya hanya membutuhkan satu permintaan ke /robots.txt.

Kesalahan kedua adalah memilih elemen dengan struktur yang rapuh, misalnya find_all("tr")[3] yang bergeser setiap kali halaman menambah baris. Pencarian berdasarkan atribut bermakna seperti id="jadwal" membuat penguraian tahan terhadap perubahan kecil.

Kesalahan ketiga adalah menganggap teks hasil scraping sudah bersih. Spasi ganda, karakter tak kasatmata, dan tanggal berformat campur menempel pada hasilnya, sehingga pembersihan pada modul berikutnya adalah kelanjutan yang wajar, bukan pekerjaan ulang.

Ringkasan#

  • Izin diperiksa berlapis sebelum kode, dari robots.txt, ketentuan layanan, sampai perlindungan data, dan sopan santunnya berupa jeda serta identitas yang jujur.
  • Penguraian halaman statis memakai pola tiga langkah, yaitu cari wadah, petakan baris, dan susun DataFrame.
  • Halaman yang mengizinkan diambil dengan requests, sedangkan halaman dinamis lebih baik dijawab lewat API internalnya daripada peramban otomatis.
  • Hasil scraping adalah data mentah yang tetap melewati pemeriksaan tipe dan pembersihan seperti sumber lainnya.

Referensi#