Scraping data dari marketplace lokal kayak Tokopedia adalah skill yang powerful untuk data analyst dan developer — entah untuk riset pasar, monitoring harga, atau bahkan fine-tuning machine learning model. Bedanya dengan scraping static HTML biasa adalah Tokopedia pakai JavaScript untuk render konten dinamis, jadi kita perlu browser automation tool seperti Selenium.
Di guide ini, kita akan build bot scraping nyata yang bisa dijalankan langsung, plus tips menghindari block dan selalu menghormati terms of service marketplace.
Setup Selenium dan ChromeDriver
Langkah pertama adalah install library yang kita butuh. Buka terminal dan jalankan:
pip install selenium pandas webdriver-manager
webdriver-manager adalah lifesaver — ia otomatis download dan manage ChromeDriver yang sesuai dengan versi Chrome kamu, jadi tidak perlu manual setup PATH.
Pastikan kamu sudah install Python 3.8+ dan Chrome browser. Verifikasi instalasi dengan:
python --version
google-chrome --version # atau 'chrome --version' di Windows
Kalau sudah, kita bisa lanjut ke kode berikutnya.
Memahami Structure Tokopedia dan Dynamic Content
Tokopedia menggunakan lazy loading — artinya produk hanya di-render saat user scroll ke bawah. Ini penting karena dengan just requests library, kita tidak akan mendapat data produk (HTML yang di-return cuma skeleton kosong).
Selenium solve ini dengan menjalankan JavaScript di browser real, jadi konten fully render. Strategi kita:
- Buka halaman search Tokopedia dengan Selenium WebDriver
- Scroll ke bawah berkali-kali untuk trigger lazy loading
- Extract HTML dari DOM setelah semua konten loaded
- Parse dengan BeautifulSoup untuk ambil data spesifik
- Simpan ke DataFrame pandas, export ke CSV
Script Python Lengkap untuk Scraping Tokopedia
Berikut adalah script utuh yang kamu bisa langsung copy-paste dan jalankan. Script ini scrape halaman search Tokopedia untuk keyword yang kamu tentukan:
import time
import random
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service
from bs4 import BeautifulSoup
import pandas as pd
# Setup Chrome options dengan user-agent agar tidak terdeteksi bot
chrome_options = Options()
chrome_options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36")
chrome_options.add_argument("--disable-blink-features=AutomationControlled")
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
chrome_options.add_experimental_option('useAutomationExtension', False)
# Setup driver
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service, options=chrome_options)
def scrape_tokopedia(keyword, num_scrolls=5):
"""Scrape produk dari Tokopedia berdasarkan keyword"""
# Construct URL search
url = f"https://www.tokopedia.com/search?q={keyword}"
print(f"[*] Membuka {url}...")
driver.get(url)
# Wait untuk halaman load
time.sleep(random.uniform(2, 4))
# Scroll berkali-kali untuk load lebih banyak produk
print(f"[*] Melakukan {num_scrolls} scroll untuk trigger lazy loading...")
for i in range(num_scrolls):
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
wait_time = random.uniform(1.5, 3) # Random delay untuk avoid detection
print(f" Scroll {i+1}/{num_scrolls}, tunggu {wait_time:.1f}s...")
time.sleep(wait_time)
# Get page source setelah fully loaded
print("[*] Mengekstrak HTML dari DOM...")
html = driver.page_source
# Parse dengan BeautifulSoup
soup = BeautifulSoup(html, 'html.parser')
# Find product containers (CSS selector ini valid untuk Tokopedia struktur terkini)
products = []
product_items = soup.find_all('div', {'data-testid': 'lstcol_product_list_item'})
print(f"[*] Ditemukan {len(product_items)} produk. Parsing data...")
for item in product_items:
try:
# Extract nama produk
name_tag = item.find('span', {'data-testid': 'lstcol_product_name'})
name = name_tag.get_text(strip=True) if name_tag else "N/A"
# Extract harga
price_tag = item.find('div', {'data-testid': 'lstcol_product_price'})
price = price_tag.get_text(strip=True) if price_tag else "N/A"
# Extract rating dan jumlah review
rating_tag = item.find('span', {'data-testid': 'lstcol_product_rating'})
rating = rating_tag.get_text(strip=True) if rating_tag else "N/A"
review_tag = item.find('span', {'data-testid': 'lstcol_product_review_count'})
review_count = review_tag.get_text(strip=True) if review_tag else "N/A"
# Extract URL produk
link_tag = item.find('a', href=True)
product_url = link_tag['href'] if link_tag else "N/A"
if product_url and not product_url.startswith('http'):
product_url = "https://www.tokopedia.com" + product_url
products.append({
'Nama Produk': name,
'Harga': price,
'Rating': rating,
'Jumlah Review': review_count,
'URL': product_url
})
except Exception as e:
print(f"[!] Error parsing item: {e}")
continue
driver.quit()
return products
# Main execution
if __name__ == "__main__":
keyword = input("Masukkan keyword yang mau dicari (misal: 'laptop'): ")
print("\n[!] DISCLAIMER PENTING:")
print(" - Scraping hanya untuk riset pribadi, bukan komersial")
print(" - Hormati Terms of Service Tokopedia")
print(" - Jangan overload server dengan request terlalu cepat")
print(" - Gunakan dengan bijak dan bertanggung jawab\n")
# Jalankan scraper
products_data = scrape_tokopedia(keyword, num_scrolls=5)
if products_data:
# Konversi ke DataFrame
df = pd.DataFrame(products_data)
# Simpan ke CSV
filename = f"tokopedia_{keyword}_{int(time.time())}.csv"
df.to_csv(filename, index=False, encoding='utf-8-sig')
print(f"\n[+] Scraping berhasil!")
print(f"[+] Total produk: {len(products_data)}")
print(f"[+] File disimpan: {filename}")
print(f"\nPreview data:")
print(df.head())
else:
print("\n[!] Tidak ada data yang berhasil di-scrape.")
Tips Menghindari Block dan Rate Limiting
Tokopedia (dan marketplace lainnya) memiliki sistem deteksi bot. Berikut strategi agar script kamu tetap "stealth":
- User-Agent Rotation — Script di atas sudah include user-agent Chrome modern. Kalau ingin lebih advanced, pakai library seperti
fake-useragentuntuk randomize di setiap request. - Random Delays — Jangan langsung scroll-scroll-scroll. Tambahkan
random.uniform(1.5, 3)antara setiap aksi untuk menyamar jadi human behavior. - Batasi Jumlah Request — Scrape hanya sesuai kebutuhan. Jangan jalankan 100 kali dalam 1 jam. Spread over beberapa jam atau hari.
- Headless Mode Hati-hati — Sambil testing, hindari headless mode dulu (karena lebih mudah terdeteksi). Gunakan headless hanya saat production dan sudah tested.
- Proxy (Optional) — Untuk scale besar, pertimbangkan rotate IP menggunakan proxy. Tapi untuk skala kecil (riset pribadi), biasanya tidak perlu.
Parsing Data dan Export ke CSV
Script di atas sudah include pandas untuk convert data ke DataFrame dan export CSV. File CSV bisa langsung dibuka di Excel atau Google Sheets untuk analisis lebih lanjut.
Kalau kamu perlu format data berbeda, bisa modify bagian parsing:
# Contoh: Clean harga string menjadi angka integer
def clean_price(price_str):
# Hapus "Rp", ".", dll
import re
cleaned = re.sub(r'[^0-9]', '', price_str)
return int(cleaned) if cleaned else 0
df['Harga Numeric'] = df['Harga'].apply(clean_price)
Disclaimer Etis dan Legal
Penting banget untuk kamu ingat: scraping data dari website punya tanggung jawab etis dan legal. Berikut hal-hal yang harus kamu perhatikan:
- Baca Terms of Service — Tokopedia mungkin punya clause tentang automated access. Jika dilarang, hormati itu. Scraping untuk riset pribadi biasanya OK, tapi untuk komersial atau distribusi data perlu izin.
- Jangan Overload Server — Dengan delays random antara request, kita sudah minimize impact. Tapi tetap pastikan server tidak terbeban.
- Gunakan Responsibly — Hasil scraping untuk analisis pribadi, riset akademis, atau kebutuhan non-profit. Jangan jual atau distribusikan data mentah tanpa izin.
- Respect robots.txt — Cek
tokopedia.com/robots.txtuntuk lihat apa yang boleh di-crawl. Kalau ada instruksi khusus, ikuti.
Kesimpulan
Dengan Selenium dan Python, kamu bisa scrape data dinamis dari Tokopedia dengan relatively simple. Script di atas sudah production-ready untuk kebutuhan riset kecil-menengah — install dependencies, set keyword, dan jalankan. Output langsung ke CSV yang siap dianalisis.
Kunci sukses: kombinasi user-agent yang proper, random delays, dan respect terhadap ToS marketplace. Jangan abuse, dan gunakan knowledge ini untuk hal-hal yang bermanfaat — apakah itu price monitoring, market analysis, atau skripsi data science kamu. Happy scraping responsibly! 🚀