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:

bash
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:

html
<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:

python
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:

python
# 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:

python
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:

python
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:

python
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.