Web Scraping Terstruktur dengan BeautifulSoup: Ekstraksi Data dari HTML ke DataFrame
Banyak data berharga tersebar di halaman web, namun tidak selalu tersedia dalam format yang mudah diolah. Web scraping adalah teknik untuk mengekstrak informasi dari HTML secara otomatis. Dataset yang tersedia secara publik sering kali tidak mencakup niche spesifik yang kita butuhkan untuk analisis. Dengan kombinasi requests, BeautifulSoup, dan Pandas, kita dapat mengubah data tidak terstruktur di browser menjadi DataFrame yang siap untuk eksplorasi dan pemodelan machine learning.
Memahami Struktur HTML Target
Sebelum menulis kode, kita perlu memahami struktur halaman web yang akan di-scrape. Gunakan Developer Tools di browser untuk inspeksi elemen. Perhatikan tag HTML, class, dan id yang membungkus data yang ingin diekstrak. Tanpa pemahaman ini, selector yang kita buat akan rapuh dan mudah rusak saat website diperbarui. Amati juga apakah konten dimuat secara dinamis melalui JavaScript, karena hal tersebut memerlukan pendekatan berbeda seperti Selenium atau Playwright. Untuk konten statis, requests dan BeautifulSoup sudah cukup powerful.
Setup Environment dan Instalasi Library
Untuk proyek ini, kita membutuhkan tiga library utama: requests untuk mengambil halaman web, beautifulsoup4 untuk parsing HTML, dan pandas untuk manipulasi data.
!pip install requests beautifulsoup4 pandas
import requests
from bs4 import BeautifulSoup
import pandas as pdLibrary requests menangani HTTP request dan response dengan API yang bersih dan pythonic. BeautifulSoup menyediakan parser yang intuitive untuk navigasi dan pencarian elemen HTML dalam struktur tree. Pandas akan mengubah data hasil ekstraksi menjadi tabel terstruktur yang familiar bagi praktisi Data Science. Kombinasi ketiga library ini menjadi stack standar untuk web scraping di ekosistem Python.
Mengambil Konten Halaman Web
Langkah pertama adalah mengirimkan HTTP GET request ke URL target dan memeriksa status response. Server web dapat mengembalikan berbagai status code yang mengindikasikan hasil request.
url = "https://example.com/products"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
}
response = requests.get(url, headers=headers)
print(response.status_code)
soup = BeautifulSoup(response.content, "html.parser")Penggunaan User-Agent dalam headers penting untuk menghindari pemblokiran oleh server. Beberapa website menolak request tanpa identifikasi browser yang valid dan mengembalikan status 403 Forbidden. Setelah konten diperoleh dengan status 200, kita pass response content ke BeautifulSoup dengan parser html.parser yang sudah built-in di Python dan tidak memerlukan dependensi tambahan.
Navigasi dan Seleksi Elemen dengan BeautifulSoup
Data Science with Python
Master the art of data analysis, visualization, and predictive modeling.
Project: E-commerce Sales Dashboard
BeautifulSoup menyediakan beberapa metode untuk menemukan elemen dalam dokumen HTML. Method find() mengembalikan elemen pertama yang cocok dengan kriteria, sementara find_all() mengembalikan semua elemen yang cocok dalam bentuk list. Selector dapat berdasarkan tag name, class, id, atau kombinasi atribut HTML.
# Mengambil semua card produk dari halaman
cards = soup.find_all("div", class_="product-card")
for card in cards:
title = card.find("h2", class_="title").get_text(strip=True)
price = card.find("span", class_="price").get_text(strip=True)
print(f"{title}: {price}")Method get_text(strip=True) membersihkan whitespace berlebih dan newline dari teks yang diekstrak. Pendekatan ini memisahkan logic parsing dari logic pengolahan data, sehingga kode lebih mudah di-maintain dan di-debug. Jika selector terlalu spesifik, kita bisa menggunakan CSS selector dengan method select() yang mendukung sintaks seperti .product-card > h2.title.
Ekstraksi Data Terstruktur ke List of Dicts
Untuk menyiapkan data agar compatible dengan Pandas, kita simpan hasil ekstraksi dalam bentuk list of dictionaries. Setiap dictionary merepresentasikan satu row data dengan key sebagai nama kolom dan value sebagai data yang diekstrak dari elemen HTML.
data = []
for card in cards:
record = {
"product_name": card.find("h2", class_="title").get_text(strip=True),
"price": card.find("span", class_="price").get_text(strip=True),
"rating": card.find("div", class_="rating").get_text(strip=True),
"link": card.find("a")["href"]
}
data.append(record)
print(f"Total records diekstrak: {len(data)}")Struktur list of dicts ini menjadi jembatan antara data tidak terstruktur di HTML dan format tabular di Pandas. Validasi jumlah record setelah ekstraksi membantu kita mendeteksi jika ada elemen yang terlewat atau jika struktur halaman berubah di tengah proses. Penambahan key link dengan mengakses atribut href menunjukkan cara ekstrak data dari atribut HTML, bukan hanya text content.
Konversi ke DataFrame Pandas
Setelah data terkumpul dalam list, konversi ke DataFrame menjadi sangat straightforward. Method pd.DataFrame() secara otomatis mengubah list of dicts menjadi tabel dengan kolom yang terdefinisi dari key dictionary.
df = pd.DataFrame(data)
print(df.head())
print(df.info())DataFrame yang dihasilkan dapat langsung dianalisis, difilter, atau diekspor ke berbagai format seperti CSV atau Excel. Jika terdapat missing values akibat elemen yang tidak ditemukan di beberapa card, kita bisa menangani dengan fillna() sebelum analisis lanjutan. Type data kolom price mungkin masih berupa string, sehingga perlu dilakukan data cleaning untuk mengkonversi ke numerical type sebelum analisis statistik.
Handling Pagination dan Multiple Pages
Website modern sering membagi konten ke dalam beberapa halaman untuk meningkatkan performance dan user experience. Untuk scrape data dalam skala besar, kita perlu mengidentifikasi pola URL pagination dan mengulang proses ekstraksi di setiap halaman secara iteratif.
import time
all_data = []
for page in range(1, 6):
url = f"https://example.com/products?page={page}"
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.content, "html.parser")
cards = soup.find_all("div", class_="product-card")
for card in cards:
record = {
"product_name": card.find("h2", class_="title").get_text(strip=True),
"price": card.find("span", class_="price").get_text(strip=True),
"rating": card.find("div", class_="rating").get_text(strip=True)
}
all_data.append(record)
time.sleep(2)
df = pd.DataFrame(all_data)
print(f"Total data dari semua halaman: {len(df)}")Penambahan delay antar request menggunakan time.sleep() direkomendasikan untuk menghindari overload server dan mengurangi risiko IP address diblokir oleh mekanisme rate limiting. Rate limiting yang etis menunjukkan profesionalisme dalam praktik web scraping dan menjaga hubungan baik dengan pemilik website. Pattern loop ini dapat dikembangkan lebih lanjut dengan penanganan exception untuk request yang gagal.
Best Practices dan Etika Web Scraping
Beberapa prinsip fundamental dalam web scraping harus selalu diperhatikan. Selalu periksa file robots.txt website untuk memahami bagian mana yang diperbolehkan untuk di-scrape oleh bot. Hindari mengirimkan request terlalu cepat dalam volume besar, dan gunakan data yang diekstrak secara bertanggung jawab sesuai dengan ketentuan yang berlaku. Jika website menyediakan API resmi, prioritaskan penggunaan API dibandingkan scraping langsung karena API lebih stabil dan didesain untuk programmatic access.
Struktur HTML dapat berubah kapan saja tanpa pemberitahuan. Gunakan error handling dengan try-except untuk menangani elemen yang tidak ditemukan, dan dokumentasikan selector yang digunakan dalam komentar atau dokumentasi proyek. Scraping yang terstruktur dan maintainable akan menghemat waktu debugging di masa depan ketika website target melakukan redesign atau update layout.
Mau memperdalam skill Data Science dan Web Scraping secara sistematis? Bergabunglah dengan Data Science Bootcamp di Rumah Coding. Kurikulum praktis dengan proyek real-world dan mentorship dari praktisi industri.
Course Terkait
Data Science with Python
Master the art of data analysis, visualization, and predictive modeling.
E-commerce Sales Dashboard
- Data Cleaning Pipeline
- Interactive Charts
- Sales Forecasting Model
Deep Learning Bootcamp
A beginner-friendly, highly interactive bootcamp designed to take you from foundational concepts to deploying real-world Artificial Intelligence applications. Through a completely project-based approach, you will master the core of Deep Learning, Artificial Neural Networks, and Computer Vision using Python and TensorFlow, ultimately building a professional-grade AI web application for your portfolio.
GreenGuard: Intelligent Plant Disease Diagnosis Web App
- Interactive Image Upload UI: A clean, user-friendly interface built with Streamlit that supports drag-and-drop image uploads directly from a computer or mobile phone.
- Real-Time AI Inference: Utilizes a lightweight, optimized CNN model (like MobileNetV2) to process the image and return a diagnosis in seconds without heavy server load.
- Confidence Scoring Dashboard: Visually displays the model's prediction probability (e.g., "95% confident this is Tomato Late Blight") using interactive progress bars or charts.
LLM Bootcamp
This project-based bootcamp is designed for beginners to dive practically into the world of Large Language Models (LLMs). Through hands-on building, you will learn how to interact with top-tier AI APIs, master prompt engineering, orchestrate complex workflows using LangChain, and implement Retrieval-Augmented Generation (RAG) to query your own documents. By the end of this course, you will have the skills to build, test, and deploy a fully functional, custom AI web application.
Domain-Specific AI Knowledge Assistant
- Dynamic Document Processing: A sidebar interface allowing users to upload new PDF or TXT files, which the app automatically chunks, embeds, and stores in the vector database.
- Context-Aware Chat UI: A modern chat interface built with Streamlit that maintains conversation history, allowing users to ask follow-up questions naturally.
- Strict Guardrails (Anti-Hallucination): System instructions designed so the AI politely declines to answer questions that fall outside the context of the uploaded documents.