Tutorial 9: Scrapy + BeautifulSoup - Pengumpulan Data untuk ML
Daftar Isi
Pendahuluan
Model machine learning hanya sebaik data yang digunakan untuk melatihnya. Meskipun banyak dataset yang sudah dikurasi tersedia, proyek ML di dunia nyata sering kali memerlukan pengumpulan data kustom dari web. Baik Anda membutuhkan ulasan produk untuk analisis sentimen, artikel berita untuk klasifikasi teks, atau lowongan kerja untuk analisis pasar, web scraping adalah keterampilan penting bagi praktisi ML.
Tutorial ini membahas dua alat Python yang paling kuat untuk web scraping: BeautifulSoup untuk mem-parsing HTML dan Scrapy untuk membangun web crawler yang skalabel dan siap produksi. Anda akan belajar cara mengekstrak data terstruktur dari situs web, membersihkannya, menyimpannya dalam berbagai format, dan mengubahnya menjadi dataset yang siap untuk ML, sambil tetap menghormati pedoman scraping yang etis.
Prasyarat
- Python 3.9 atau lebih tinggi
- Pemahaman dasar tentang struktur HTML dan CSS selector
- Keakraban dengan struktur data Python
Instal paket yang diperlukan:
pip install scrapy beautifulsoup4 lxml requests pandas sqlalchemy
pip install scrapy-playwright # Untuk halaman yang di-render JavaScript
Dasar-Dasar BeautifulSoup
Mem-parsing Dokumen HTML
from bs4 import BeautifulSoup
import requests
Ambil halaman web
url = "https://quotes.toscrape.com/"
response = requests.get(url)
soup = BeautifulSoup(response.text, "lxml")
Tampilkan judul halaman
print(f"Judul halaman: {soup.title.string}")
Menavigasi Pohon DOM
# Temukan elemen berdasarkan tag
semuadiv = soup.findall("div")
print(f"Ditemukan {len(semuadiv)} elemen div")
Temukan berdasarkan nama kelas
kutipan = soup.findall("div", class="quote")
print(f"Ditemukan {len(kutipan)} kutipan di halaman")
Temukan berdasarkan ID
spesifik = soup.find(id="main-content")
Temukan dengan CSS selector
penulis = soup.select("small.author")
for p in penulis:
print(f"Penulis: {p.gettext()}")
Mengekstrak Data
# Ekstrak data terstruktur dari setiap kutipan
data = []
for kutipan in soup.findall("div", class="quote"):
teks = kutipan.find("span", class="text").gettext()
penulis = kutipan.find("small", class="author").gettext()
tag = [t.gettext() for t in kutipan.findall("a", class="tag")]
data.append({
"teks": teks,
"penulis": penulis,
"tag": tag,
})
for item in data[:3]:
print(f'"{item["teks"][:60]}..." - {item["penulis"]}')
print(f" Tag: {', '.join(item['tag'])}")
Bekerja dengan Atribut dan Tautan
# Ekstrak semua tautan dari halaman
tautan = []
for atag in soup.findall("a", href=True):
href = atag["href"]
tekstautan = atag.gettext(strip=True)
tautan.append({"url": href, "teks": tekstautan})
Ekstrak sumber gambar
gambar = []
for img in soup.findall("img"):
src = img.get("src", "")
alt = img.get("alt", "Tidak ada teks alt")
gambar.append({"src": src, "alt": alt})
Ekstrak atribut data
elemen = soup.findall(attrs={"data-category": True})
for el in elemen: