Pernahkah kamu ingin mengambil data dari sebuah website secara otomatis, seperti daftar harga produk, judul berita, atau informasi cuaca? Di sinilah web scraping berperan. Web scraping adalah teknik untuk mengekstrak data dari halaman web secara terprogram, dan Python adalah salah satu bahasa terbaik untuk melakukannya berkat ekosistem library-nya yang matang. Dalam tutorial ini, kita akan belajar melakukan web scraping dari nol menggunakan requests dan BeautifulSoup — dua library yang mudah dipelajari namun sangat powerful.
Peringatan penting: sebelum men-scrape sebuah website, selalu periksa kebijakan robots.txt dan syarat penggunaan situs tersebut. Jangan mengambil data yang dilindungi hak cipta atau bersifat pribadi, dan jangan membebani server dengan permintaan berlebihan. Tutorial ini menggunakan quotes.toscrape.com, situs yang memang dibuat khusus untuk latihan scraping, sehingga aman untuk dipraktikkan.
Apa Itu Web Scraping dan Kapan Kamu Membutuhkannya?
Web scraping adalah proses mengambil data dari halaman web dan mengubahnya menjadi format terstruktur yang bisa diolah, seperti CSV, JSON, atau database. Beberapa kasus penggunaan yang umum antara lain memantau harga kompetitor, mengumpulkan data untuk riset atau analisis, mengambil dataset untuk proyek machine learning, hingga otomatisasi pelaporan. Selama data yang kamu ambil bersifat publik dan kamu mematuhi aturan situsnya, scraping adalah keterampilan yang sangat berguna untuk dimiliki.
Prasyarat dan Instalasi
Kamu hanya membutuhkan Python 3.7 ke atas yang terpasang di komputermu. Jika belum punya, baca dulu panduan Cara Install Python dan Menulis Program Pertamamu. Setelah itu, instal dua library yang akan kita gunakan dengan perintah berikut:
pip install requests beautifulsoup4
Memahami Struktur HTML
Halaman web pada dasarnya tersusun dari HTML. Untuk bisa men-scrape, kamu perlu memahami bagaimana data tersusun di dalamnya — yaitu melalui tag, class, dan atribut lainnya. Perhatikan contoh HTML sederhana berikut:
<div class="quote">
<span class="text">"The world as we have created it is a process of our thinking."</span>
<small class="author">Albert Einstein</small>
<a class="tag" href="/tag/change">change</a>
</div>
Dari contoh di atas, setiap kutipan dibungkus dalam <div class="quote">, teks kutipannya berada di <span class="text">, nama penulis di <small class="author">, dan tag-nya di <a class="tag">. Dengan memahami pola ini, kita bisa menulis kode untuk mengekstrak data tersebut.
Langkah 1: Mengambil Halaman Web dengan requests
Library requests memungkinkan kita mengirim permintaan HTTP ke sebuah URL dan menerima responsnya. Berikut cara mengambil isi halaman web:
import requests
url = "http://quotes.toscrape.com/"
response = requests.get(url, timeout=10)
print(response.status_code) # 200 berarti permintaan berhasil
print(response.text[:500]) # 500 karakter pertama dari HTML halaman
Jika kode di atas mencetak angka 200, berarti permintaan berhasil dan kamu sudah berhasil mengunduh HTML halaman tersebut. Kini saatnya mem-parsing HTML itu agar mudah ditelusuri.
Langkah 2: Parsing HTML dengan BeautifulSoup
BeautifulSoup mengubah HTML mentah menjadi struktur yang bisa kita telusuri dengan mudah, mirip seperti menavigasi pohon dokumen. Berikut cara membuat objek parser:
from bs4 import BeautifulSoup
soup = BeautifulSoup(response.text, "html.parser")
# Contoh: ambil judul halaman
print(soup.title.get_text())
Langkah 3: Mengekstrak Data dengan find dan find_all
Dua metode yang paling sering kamu pakai adalah find() (mengambil elemen pertama yang cocok) dan find_all() (mengambil semua elemen yang cocok). Kamu bisa mencari berdasarkan tag, class, maupun atribut lain:
# Ambil elemen pertama dengan tag <h1>
judul = soup.find("h1")
# Ambil semua elemen <a> di halaman
semua_link = soup.find_all("a")
# Cari elemen berdasarkan class
quote_pertama = soup.find("div", class_="quote")
# Ambil semua tag dengan class "tag"
semua_tag = soup.find_all("a", class_="tag")
Perhatikan bahwa kita menulis class_ (dengan garis bawah) alih-alih class, karena class adalah kata kunci di Python.
Studi Kasus Lengkap: Scraping quotes.toscrape.com
Sekarang mari kita gabungkan semuanya menjadi satu program utuh yang mengambil semua kutipan dari halaman pertama, lengkap dengan penulis dan tag-nya:
import requests
from bs4 import BeautifulSoup
url = "http://quotes.toscrape.com/"
response = requests.get(url, timeout=10)
response.raise_for_status() # lempar error jika permintaan gagal
soup = BeautifulSoup(response.text, "html.parser")
quotes = []
for quote in soup.find_all("div", class_="quote"):
teks = quote.find("span", class_="text").get_text()
penulis = quote.find("small", class_="author").get_text()
tags = [tag.get_text() for tag in quote.find_all("a", class_="tag")]
quotes.append({"teks": teks, "penulis": penulis, "tags": tags})
print(f"Berhasil mengambil {len(quotes)} kutipan.\n")
for q in quotes:
print(f"{q['teks']} — {q['penulis']}")
print(f" Tags: {', '.join(q['tags'])}")
Menangani Pagination
Banyak website membagi datanya ke beberapa halaman. Untuk men-scrape semuanya, kita bisa melakukan iterasi pada setiap halaman dan memberi jeda antar permintaan agar tidak membebani server:
import time
import requests
from bs4 import BeautifulSoup
base_url = "http://quotes.toscrape.com/page/{}/"
semua_quotes = []
for page in range(1, 6): # ambil 5 halaman pertama
response = requests.get(base_url.format(page), timeout=10)
response.raise_for_status()
soup = BeautifulSoup(response.text, "html.parser")
for quote in soup.find_all("div", class_="quote"):
teks = quote.find("span", class_="text").get_text()
penulis = quote.find("small", class_="author").get_text()
semua_quotes.append({"teks": teks, "penulis": penulis})
time.sleep(2) # jeda 2 detik agar tidak membebani server
print(f"Halaman {page} selesai.")
print(f"Total kutipan yang berhasil diambil: {len(semua_quotes)}")
Menyimpan Hasil ke CSV dan JSON
Data yang sudah di-scrape tentu harus disimpan agar bisa diolah lebih lanjut. Python menyediakan modul bawaan csv dan json untuk keperluan ini:
import csv
import json
# Simpan ke CSV
with open("quotes.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=["teks", "penulis", "tags"])
writer.writeheader()
for q in quotes:
writer.writerow({
"teks": q["teks"],
"penulis": q["penulis"],
"tags": ", ".join(q["tags"]),
})
# Simpan ke JSON
with open("quotes.json", "w", encoding="utf-8") as f:
json.dump(quotes, f, ensure_ascii=False, indent=2)
print("Data berhasil disimpan ke quotes.csv dan quotes.json")
Tips agar scraping tetap aman dan sopan: selalu kirim header User-Agent yang wajar, beri jeda antar permintaan dengan time.sleep(), dan bungkus kode dengan try/except untuk menangani kegagalan jaringan. Dengan begitu, script kamu lebih andal dan tidak membebani server target.
Langkah Selanjutnya
Selamat! Kamu sekarang sudah mampu mengambil data dari website menggunakan Python. Kemampuan ini bisa kamu kembangkan lebih jauh, misalnya dengan menyajikan data hasil scraping melalui REST API menggunakan FastAPI, memastikan kualitas script-mu dengan testing menggunakan Pytest, atau membungkusnya ke dalam container dengan Docker. Selamat bereksperimen!
Apakah web scraping itu legal?
Web scraping pada dasarnya legal untuk data yang bersifat publik, selama kamu mematuhi robots.txt, syarat penggunaan situs, dan tidak melanggar hak cipta atau privasi. Selalu periksa aturan situs target sebelum melakukan scraping.
Bagaimana jika website memblokir permintaan saya?
Coba kirim header User-Agent yang wajar, kurangi frekuensi permintaan dengan jeda yang lebih panjang, atau gunakan sesi yang persisten dengan requests.Session(). Ingatlah untuk tetap menghormati batasan yang ditetapkan situs.
Bagaimana men-scrape website yang memuat data dengan JavaScript?
Untuk situs yang dirender di sisi klien dengan JavaScript, requests tidak cukup karena ia tidak menjalankan JavaScript. Kamu bisa menggunakan browser headless seperti Playwright atau Selenium yang dapat merender halaman sepenuhnya sebelum datanya diekstrak.