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.
"""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()) 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 1Pola 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.
# 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#
- Beautiful Soup Documentation — Beautiful Soup — dokumentasi resmi penguraian HTML yang dipakai di topik ini.
- Robots Exclusion Protocol, RFC 9309 — IETF — spesifikasi resmi berkas robots.txt.
- Requests: HTTP for Humans — requests documentation — dokumentasi resmi pengambilan halaman yang menyertai BeautifulSoup.