Sebagian besar tutorial scraping eBay umurnya cuma sekitar tiga bulan. Saya tahu, karena tim kami di Thunderbit sering melihat para developer muter-muter ngikutin potongan kode yang sudah rusak, CSS selector yang basi, dan repo GitHub yang katanya “masih jalan”, padahal diam-diam sudah nggak berfungsi sejak eBay dua kali redesign lalu.
eBay punya sekitar 2,5 miliar listing aktif — basis data harga long-tail terbesar di web terbuka setelah Amazon. Data ini dipakai untuk banyak hal, mulai dari pricing reseller sampai competitive intelligence. Tapi mengambilnya secara programatis itu tantangan yang terus berubah: frontend eBay berbasis React sering ganti nama class CSS, A/B test menampilkan struktur DOM yang berbeda untuk pengguna yang berbeda, dan Akamai Bot Manager berdiri di antara Anda dan HTML. Panduan ini memberi Anda kode Python yang bisa dipakai hari ini, menjelaskan kenapa scraper sering rusak supaya Anda bisa bikin yang lebih tahan banting, membahas keputusan eBay API vs scraping secara jujur, dan menunjukkan jalan keluar tanpa kode saat Python terasa nggak sepadan dengan setup-nya.
Apa Artinya Scrape eBay dengan Python?
Web scraping eBay dengan Python berarti menulis script yang secara programatis mengunduh halaman eBay, mem-parse HTML-nya (atau JSON tersembunyi), lalu mengekstrak data terstruktur — seperti judul, harga, info penjual, tanggal terjual, detail varian — ke format yang benar-benar bisa Anda pakai, misalnya CSV, spreadsheet, atau database.
Anda bisa melakukan scraping pada beberapa jenis halaman eBay:
- Hasil pencarian (misalnya semua listing “AirPods Pro”)
- Halaman detail produk individual (spesifikasi lengkap, gambar, info penjual)
- Listing sold/completed (harga dan tanggal transaksi yang benar-benar terjadi)
- Profil penjual dan ulasan
Python adalah bahasa yang paling sering dipakai untuk pekerjaan ini. Ekosistemnya — Requests, BeautifulSoup, lxml, pandas — bikin proses ambil halaman, parse HTML, dan olah data jadi cukup gampang. Tapi ada perbedaan penting antara scraping HTML website dan memakai API resmi eBay — dan itu akan saya bahas berikutnya.
Kenapa Scrape eBay? Contoh Penggunaan Nyata untuk Tim Bisnis
Kalau Anda sedang baca ini, kemungkinan besar Anda sudah punya alasannya. Tetap saja, ada baiknya diskusi ini dipagari dengan nilai bisnis yang konkret, karena ROI data eBay memang mengesankan. Bain menemukan bahwa perbaikan 1% pada realized price menghasilkan kenaikan profit 11,1% di ribuan bisnis. McKinsey mengaitkan dynamic pricing di ritel dengan kenaikan penjualan hingga 5% dan perbaikan margin 2–7%.
Use case yang paling sering saya lihat:
| Use Case | Data yang Dibutuhkan | Hasil Bisnis |
|---|---|---|
| Pantau harga & repricing | Harga listing aktif, ongkir, kondisi barang | Harga tetap kompetitif, margin terlindungi |
| Analisis kompetitor | Assortment produk, promosi, syarat pengiriman | Posisi strategis, celah katalog terlihat |
| Riset pasar & deteksi tren | Kecepatan listing, tren kategori, pola permintaan | Identifikasi produk baru, prediksi permintaan |
| Penentuan harga reseller / appraisal | Harga terjual, tanggal terjual, kondisi barang | Nilai pasar yang wajar, keputusan buy-box |
| Analisis sentimen | Ulasan, rating, kebijakan retur | Insight kualitas produk, kepuasan pelanggan |
| Lead generation | Profil penjual, info toko, detail kontak | Outreach B2B ke penjual dengan GMV tinggi |

Intinya jelas: eBay punya datanya, tapi datanya terkunci di dalam halaman web.
Scraping adalah cara untuk mengubahnya jadi keunggulan kompetitif.
API Resmi eBay vs Python Web Scraping: Mana yang Sebaiknya Dipilih?
Ini pertanyaan yang saya harap lebih banyak tutorial jawab dengan jujur. eBay menyediakan API resmi — terutama Browse API — dan banyak orang bertanya-tanya apakah lebih baik pakai API atau langsung scraping. Jawabannya sepenuhnya tergantung pada data yang Anda butuhkan.
| Kriteria | eBay Browse/Finding API | Python Web Scraping |
|---|---|---|
| Listing sold/completed | Terbatas — Marketplace Insights API ada, tapi aksesnya sering ditolak | Akses penuh lewat parameter URL LH_Sold=1&LH_Complete=1 |
| Batas request | 5.000 panggilan/hari pada tier dasar | Dikelola sendiri (tergantung proxy) |
| Field data | Sudah ditentukan (judul, harga, kategori, dasar info penjual) | Apa pun yang terlihat di halaman (ulasan, spesifikasi lengkap, matriks varian) |
| Kompleksitas setup | OAuth 2.0, registrasi aplikasi, API key | pip install + kode |
| Stabilitas | Endpoint stabil | Rusak saat HTML berubah |
| Biaya | Ada tier gratis, bayar untuk volume tinggi | Kode gratis, tapi biaya proxy muncul saat skala besar |
| Data varian/MSKU | Sebagian — seringnya hanya parent SKU | Lengkap (lewat parsing JSON tersembunyi) |
| Kedalaman pagination | Batas keras 10.000 item | Secara teori tak terbatas |
Catatan cepat: Finding API lama (yang punya findCompletedItems) sudah dihentikan total pada Februari 2025. Kalau Anda pakai ebaysdk-python atau library apa pun yang memanggil modul Finding, saat ini itu sudah rusak di production.
Rekomendasi saya: pakai Browse API untuk kueri katalog yang stabil, volume sedang, dan terstruktur pada listing aktif. Pakai scraping Python saat Anda butuh harga sold, ulasan, data varian, atau field apa pun yang tidak diekspos API. Banyak tim memakai keduanya.
Tools dan Library yang Dibutuhkan untuk Scrape eBay dengan Python
Sebelum nulis kode, ini toolkit-nya. Anda nggak perlu headless browser untuk sebagian besar halaman eBay — datanya sudah tertanam di HTML yang dirender server.
| Library | Fungsi |
|---|---|
requests atau httpx | HTTP client untuk mengunduh halaman eBay |
curl_cffi | HTTP client dengan TLS fingerprint browser asli (penting untuk menembus Akamai) |
beautifulsoup4 | HTML parser untuk ekstraksi CSS selector |
lxml | Backend parser yang cepat untuk BeautifulSoup |
jmespath | Bahasa query untuk mem-parse blob JSON bertingkat |
pandas | Manipulasi data dan ekspor CSV/Excel |
gspread | Integrasi Google Sheets |
Install semuanya sekaligus:
pip install requests httpx curl_cffi beautifulsoup4 lxml jmespath pandas gspread
Pakai Python 3.11+ — pandas 3.0 butuh 3.10+, dan 3.11 kasih peningkatan kecepatan 10–60% untuk pekerjaan yang banyak I/O.
Satu library layak dapat perhatian khusus: curl_cffi adalah upgrade paling berdampak yang bisa dipakai scraper eBay di 2026. eBay memakai Akamai Bot Manager, dan vektor deteksi utamanya adalah TLS fingerprinting. requests biasa menghasilkan fingerprint gaya Python yang langsung ketahuan. curl_cffi meniru handshake TLS browser Chrome asli, dan ini menangani sekitar 90% target yang dilindungi Akamai tanpa perlu headless browser.
Coba Thunderbit untuk situs apa pun
Langkah demi Langkah: Cara Scrape Hasil Pencarian eBay dengan Python
Ini tutorial intinya. Kita akan melakukan scraping halaman hasil pencarian eBay untuk listing produk.
- Tingkat Kesulitan: Pemula–Menengah
- Waktu yang Dibutuhkan: ~30 menit untuk scrape pertama yang berhasil
- Yang Anda Perlukan: Python 3.11+, library di atas, terminal, dan URL pencarian eBay target
Langkah 1: Siapkan Project Python Anda
Buat direktori project dan install dependency:
mkdir ebay-scraper && cd ebay-scraper
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install requests curl_cffi beautifulsoup4 lxml pandas
Buat file bernama scrape_ebay.py. Itu workspace Anda.
Langkah 2: Bangun URL Pencarian eBay
Struktur URL pencarian eBay cukup simpel. Parameter kuncinya adalah _nkw (keyword):
import urllib.parse
keyword = "airpods pro"
base_url = "https://www.ebay.com/sch/i.html"
params = {
"_nkw": keyword,
"_ipg": "120", # items per page: 60, 120, atau 240 (240 bisa memicu flag bot)
"_pgn": "1", # nomor halaman
}
url = f"{base_url}?{urllib.parse.urlencode(params)}"
print(url)
# https://www.ebay.com/sch/i.html?_nkw=airpods+pro&_ipg=120&_pgn=1
Parameter lain yang berguna:
LH_BIN=1— hanya Buy It Now_sacat=175673— kategori tertentu_sop=12— urutkan berdasarkan best match (10 = harga+ongkir termurah, 13 = newly listed)LH_Complete=1&LH_Sold=1— listing sold/completed (dibahas di bagian khusus di bawah)
Langkah 3: Kirim Request dan Tangani Respons
Di sinilah curl_cffi berguna. requests.get() biasa sering ngasih 403 dari Akamai. Dengan curl_cffi, kita meniru browser Chrome asli:
from curl_cffi import requests as cffi_requests
import random, time
USER_AGENTS = [
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36",
"Mozilla/5.0 (X11; Linux x86_64; rv:124.0) Gecko/20100101 Firefox/124.0",
]
HEADERS = {
"User-Agent": random.choice(USER_AGENTS),
"Accept-Language": "en-US,en;q=0.9",
"Accept-Encoding": "gzip, deflate, br",
}
def fetch_page(url, max_retries=5):
delay = 2
for attempt in range(max_retries):
try:
r = cffi_requests.get(url, impersonate="chrome124", headers=HEADERS, timeout=30)
if r.status_code == 200:
return r.text
if r.status_code in (403, 429, 503):
retry_after = r.headers.get("Retry-After")
sleep_for = float(retry_after) if retry_after else delay + random.uniform(0, 1)
print(f" Status {r.status_code}, retrying in {sleep_for:.1f}s...")
time.sleep(sleep_for)
delay *= 2
continue
r.raise_for_status()
except Exception as e:
print(f" Request error: {e}, retrying...")
time.sleep(delay)
delay *= 2
raise RuntimeError(f"Failed after {max_retries} retries: {url}")
Exponential backoff dengan jitter itu penting — interval tidur yang tetap justru jadi fingerprint bot.
Langkah 4: Parse Listing Produk dari Halaman Pencarian
eBay sekarang lagi ada di tengah migrasi antara dua layout hasil pencarian. Scraper yang tahan banting harus bisa nangani keduanya:
| Field | Layout Lama | Layout Baru |
|---|---|---|
| Container kartu | li.s-item | li.s-card atau div.su-card-container |
| Judul | .s-item__title | .s-card__title |
| URL | a.s-item__link[href] | a.su-link[href] |
| Harga | span.s-item__price | .s-card__price |
Kode parsing yang menangani keduanya:
from bs4 import BeautifulSoup
def parse_search_results(html):
soup = BeautifulSoup(html, "lxml")
cards = soup.select("li.s-item, li.s-card, div.su-card-container")
results = []
for card in cards:
# Judul — coba kedua layout
title_el = card.select_one(".s-item__title, .s-card__title")
title = title_el.get_text(strip=True) if title_el else None
# Lewati kartu placeholder palsu "Shop on eBay"
if not title or "Shop on eBay" in title:
continue
# Harga
price_el = card.select_one("span.s-item__price, .s-card__price")
price = price_el.get_text(strip=True) if price_el else None
# URL
link_el = card.select_one("a.s-item__link[href], a.su-link[href]")
url = link_el["href"].split("?")[0] if link_el else None
# Gambar
img_el = card.select_one("img.s-item__image-img, .s-card__image img")
image = None
if img_el:
image = img_el.get("src") or img_el.get("data-src")
# Ongkir
ship_el = card.select_one("span.s-item__shipping, span.s-item__logisticsCost, .s-card__attribute-row")
shipping = ship_el.get_text(strip=True) if ship_el else None
results.append({
"title": title,
"price": price,
"url": url,
"image": image,
"shipping": shipping,
})
return results
Perangkap kartu pertama yang palsu itu kesalahan klasik. Item li.s-item pertama di banyak halaman pencarian eBay sering cuma placeholder tersembunyi dengan judul "Shop on eBay" dan tanpa harga asli. Selalu filter keluar.
Langkah 5: Tangani Pagination untuk Scrape Banyak Halaman
eBay melakukan pagination lewat parameter _pgn. Link ke halaman berikutnya menggunakan a.pagination__next:
import urllib.parse
def scrape_ebay_search(keyword, max_pages=5):
all_results = []
for page_num in range(1, max_pages + 1):
params = {"_nkw": keyword, "_ipg": "120", "_pgn": str(page_num)}
url = f"https://www.ebay.com/sch/i.html?{urllib.parse.urlencode(params)}"
print(f"Scraping page {page_num}: {url}")
html = fetch_page(url)
results = parse_search_results(html)
if not results:
print(f" Tidak ada hasil di halaman {page_num}, berhenti.")
break
all_results.extend(results)
print(f" Ditemukan {len(results)} listing (total: {len(all_results)})")
# Jeda sopan — 3 sampai 8 detik dengan jitter
time.sleep(random.uniform(3, 8))
return all_results
Jitter acak 3–8 detik itu bukan opsional.
eBay lewat lapisan Akamai akan menandai traffic yang konsisten di atas 1 request/detik dari satu IP.
Langkah 6: Ekspor Data Hasil Scraping ke CSV atau JSON
import pandas as pd
results = scrape_ebay_search("airpods pro", max_pages=3)
df = pd.DataFrame(results)
df.to_csv("ebay_airpods.csv", index=False)
df.to_json("ebay_airpods.json", orient="records", indent=2)
print(f"Mengekspor {len(df)} listing ke CSV dan JSON.")
Sekarang Anda seharusnya punya spreadsheet bersih berisi listing eBay. Di mesin saya, scraping 3 halaman (360 listing) butuh sekitar 45 detik termasuk jeda.
Cara Scrape Halaman Detail Produk eBay dengan Python
Hasil pencarian memberi Anda ringkasan. Halaman detail produk punya isi yang lebih menarik: deskripsi lengkap, skor feedback penjual, item specifics, carousel gambar, dan data varian.
Parse Satu Halaman Listing Produk
Halaman item eBay ada di /itm/<ITEM_ID>. Jalur ekstraksi yang paling stabil adalah JSON-LD — eBay menyematkan blok schema Product yang bertahan melewati hampir semua perubahan CSS:
import json
def parse_item_page(html):
soup = BeautifulSoup(html, "lxml")
item = {}
# 1. JSON-LD — jalur ekstraksi paling stabil
for tag in soup.find_all("script", type="application/ld+json"):
try:
data = json.loads(tag.string or "")
except (json.JSONDecodeError, TypeError):
continue
if isinstance(data, dict) and data.get("@type") == "Product":
item["title"] = data.get("name")
item["brand"] = (data.get("brand") or {}).get("name")
item["images"] = data.get("image")
offers = data.get("offers") or {}
item["price"] = offers.get("price")
item["currency"] = offers.get("priceCurrency")
break
# 2. Fallback CSS untuk field yang tidak ada di JSON-LD
def first_text(selectors):
for sel in selectors:
el = soup.select_one(sel)
if el and el.get_text(strip=True):
return el.get_text(strip=True)
return None
item.setdefault("title", first_text([
"h1.x-item-title__mainTitle",
"h1.x-item-title__mainTitle .ux-textspans--BOLD",
]))
item["condition"] = first_text([
".x-item-condition-text .ux-textspans",
])
item["seller"] = first_text([
".x-sellercard-atf__info__about-seller a .ux-textspans",
])
item["shipping"] = first_text([
"div.ux-labels-values--shipping .ux-textspans--BOLD",
])
# 3. Item specifics
specifics = {}
for dl in soup.select(".ux-layout-section-evo__item--table-view dl.ux-labels-values"):
k = dl.select_one(".ux-labels-values__labels-content .ux-textspans")
v = dl.select_one(".ux-labels-values__values-content .ux-textspans")
if k and v:
specifics[k.get_text(strip=True).rstrip(":")] = v.get_text(strip=True)
item["specifics"] = specifics
return item
Pola ini — JSON-LD dulu, CSS fallback kemudian — adalah kunci bikin scraper yang nggak rusak tiap kuartal. Saya bahas lebih lanjut di bawah.
Scrape Varian Produk eBay (Data MSKU)
Beberapa listing eBay punya beberapa varian — warna berbeda, ukuran berbeda, kapasitas storage berbeda. DOM yang terlihat cuma menampilkan rentang harga seperti “$899 sampai $1.099” sampai pengguna klik opsi tertentu. Harga aktual per varian tersimpan di objek JavaScript tersembunyi bernama MSKU.
Ini salah satu area di mana API eBay cuma kasih data sebagian (parent SKU), jadi scraping justru lebih baik.
import re, json
def extract_variants(html):
# Non-greedy match itu penting — .+ yang greedy akan menyapu seluruh halaman
m = re.search(r'"MSKU"\s*:\s*(\{.+?\})\s*,\s*"QUANTITY"', html, re.DOTALL)
if not m:
return []
try:
msku = json.loads(m.group(1))
except json.JSONDecodeError:
return []
item_labels = {str(k): v["displayLabel"] for k, v in msku.get("menuItemMap", {}).items()}
skus = []
for combo_key, variation_id in msku.get("variationCombinations", {}).items():
option_ids = combo_key.split("_")
options = [item_labels.get(oid, oid) for oid in option_ids]
var = msku.get("variationsMap", {}).get(str(variation_id), {})
bin_model = var.get("binModel", {})
price_spans = bin_model.get("price", {}).get("textSpans", [{}])
price = price_spans[0].get("text") if price_spans else None
qty = var.get("quantity")
skus.append({
"options": options,
"price": price,
"quantity_available": qty,
"variation_id": variation_id,
})
return skus
Regex (.+?) yang tidak greedy itulah tempat banyak scraper eBay kepleset. .+ yang greedy bakal nyapu semuanya sampai "QUANTITY" terakhir di halaman, lalu bikin JSON rusak. Saya sudah lihat bug ini di setidaknya tiga tutorial yang katanya “working”.
Cara Scrape Listing Sold dan Completed eBay dengan Python
Ini use case yang paling kuat untuk membenarkan scraping dibanding API. Data barang terjual — apa yang benar-benar ditransaksikan, dengan harga berapa, pada tanggal berapa — adalah standar emas untuk riset pasar, penetapan harga reseller, dan appraisal. Browse API eBay secara eksplisit tidak menyediakannya. Marketplace Insights API secara teknis menyediakannya, tapi aksesnya bersifat “Limited Release” dan sering ditolak.
Parameter URL yang Anda butuhkan adalah LH_Complete=1 (completed listings) dan LH_Sold=1 (batasi hanya yang benar-benar terjual). Keduanya wajib dipakai. Kalau cuma LH_Sold=1, di beberapa kategori hasilnya diam-diam balik ke listing aktif — ini jebakan paling umum di komunitas.
def scrape_sold_listings(keyword, max_pages=3):
all_sold = []
for page_num in range(1, max_pages + 1):
params = {
"_nkw": keyword,
"_ipg": "120",
"_pgn": str(page_num),
"LH_Complete": "1",
"LH_Sold": "1",
}
url = f"https://www.ebay.com/sch/i.html?{urllib.parse.urlencode(params)}"
print(f"Scraping halaman sold {page_num}...")
html = fetch_page(url)
soup = BeautifulSoup(html, "lxml")
cards = soup.select("li.s-item")
for card in cards:
title_el = card.select_one(".s-item__title")
title = title_el.get_text(strip=True) if title_el else None
if not title or "Shop on eBay" in title:
continue
# Hanya sertakan item yang benar-benar sold (harga hijau POSITIVE)
sold_tag = card.select_one(
".s-item__title--tag .POSITIVE, .s-item__caption--signal.POSITIVE"
)
if sold_tag is None:
continue # Completed listing tapi tidak terjual — lewati
price_el = card.select_one("span.s-item__price")
price = price_el.get_text(strip=True) if price_el else None
# Parse tanggal sold
sold_date = None
import re, datetime as dt
card_text = card.get_text()
m = re.search(r"Sold\s+([A-Z][a-z]{2}\s+\d{1,2},\s*\d{4})", card_text)
if m:
sold_date = dt.datetime.strptime(m.group(1), "%b %d, %Y").strftime("%Y-%m-%d")
link_el = card.select_one("a.s-item__link[href]")
url = link_el["href"].split("?")[0] if link_el else None
all_sold.append({
"title": title,
"sold_price": price,
"sold_date": sold_date,
"url": url,
})
if not cards:
break
time.sleep(random.uniform(3, 8))
return all_sold
Perbedaan utama di HTML: item sold menampilkan harga berwarna hijau (di dalam wrapper .POSITIVE), sedangkan completed listing yang tidak terjual menampilkan harga merah dicoret. Selalu filter berdasarkan class .POSITIVE itu.
Kenapa Scraper eBay Sering Rusak (dan Cara Membuatnya Lebih Tahan Lama)
Kalau scraper eBay Anda berhenti bekerja, Anda nggak sendirian. Ini masalah nomor satu di hampir semua thread forum scraping eBay yang pernah saya baca. Pertanyaannya bukan apakah scraper akan rusak — melainkan kapan.
Kenapa itu terjadi:
- eBay memakai rendering berbasis React dengan class name yang di-generate dinamis dan berubah saat deploy
- A/B test menampilkan struktur DOM yang berbeda ke pengguna yang berbeda (layout ganda
s-item/s-cardadalah contoh nyata saat ini) - Redesign berkala mengubah nesting HTML, walaupun datanya tetap sama
- Selector lama seperti
#itemTitledan#prcIsumsudah dihapus bertahun-tahun lalu, tapi masih muncul di tutorial
Seperti yang dikatakan panduan Scrapfly 2026: “Tantangan sebenarnya dalam web scraping eBay adalah menangani perubahan CSS selector eBay. eBay memperbarui frontend mereka secara rutin, sehingga scraper yang bergantung pada class name tertentu jadi rusak.”

Strategi Pertahanan untuk Scraper eBay yang Awet
Empat strategi yang tetap tahan di tengah perubahan kuartalan eBay:
1. Dahulukan JSON-LD dibanding CSS selector. eBay menyematkan data schema Product terstruktur di setiap halaman item. Lapisan data berubah jauh lebih jarang daripada lapisan presentasi — designer mungkin mengubah class CSS tiap kuartal, tetapi field backend seperti price, name, dan seller terhubung ke API internal dan jarang ganti nama.
2. Gunakan fallback selector bertingkat. Jangan pernah bergantung pada satu CSS selector saja. Selalu siapkan alternatif:
def first_text(soup, selectors):
for sel in selectors:
el = soup.select_one(sel)
if el and el.get_text(strip=True):
return el.get_text(strip=True)
return None
title = first_text(soup, [
"h1.x-item-title__mainTitle",
"h1.x-item-title__mainTitle .ux-textspans--BOLD",
"[data-testid='x-item-title'] h1",
])
3. Parse blob JSON tersembunyi. Objek varian MSKU dan data JavaScript inline bertahan dari perubahan CSS karena dihasilkan server-side. Ekstraksi dengan regex dari tag <script> memang butuh kerja lebih di awal, tapi secara signifikan mengurangi maintenance.
4. Log kegagalan selector. Tambahkan monitoring supaya Anda tahu kapan selector berhenti cocok, bukan cuma bahwa data Anda kosong:
if title is None:
print(f"PERINGATAN: selector judul gagal untuk {url}")
5. Gunakan curl_cffi dengan impersonasi browser. Ini menangani TLS fingerprinting Akamai tanpa headless browser.
Alternatif Berbasis AI: Tanpa Maintenance Selector
Kalau Anda capek benerin selector tiap beberapa bulan, ada pendekatan yang memang beda dari dasarnya. Tools seperti Thunderbit memakai AI untuk membaca halaman dari awal setiap kali dan menyusun logika ekstraksi secara otomatis. Sebuah studi Universitas McGill menguji scraper berbasis AI vs scraper berbasis selector pada 3.000 halaman dan menemukan metode AI mempertahankan akurasi 98,4% bahkan setelah layout berubah, dengan benchmark industri menyebutkan pengurangan 60–80% pada maintenance scraper.
| Pendekatan | Rusak saat HTML eBay berubah? | Beban maintenance |
|---|---|---|
| CSS selector hardcoded | Ya, per kuartal | Tinggi — patch terus-menerus |
| Ekstraksi hidden JSON / JSON-LD | Jarang | Rendah |
| Scraping berbasis AI (Thunderbit) | Tidak — AI menyusun ulang selector tiap run | Hampir tidak ada |
Scrape data eBay dengan AI Get Started Free
Saya akan bahas workflow Thunderbit lebih detail nanti. Untuk sekarang, intinya: kalau Anda membangun scraper yang ingin dipakai berbulan-bulan, investasikan pada ekstraksi JSON-first dan fallback selector. Kalau Anda nggak mau repot maintenance selector sama sekali, pendekatan AI layak dicoba.
Mengotomatiskan Scrape eBay Berkala untuk Monitoring Harga
Scrape sekali itu berguna. Tapi monitoring harga, tracking stok, dan analisis kompetitor butuh pengumpulan data berulang. Hampir setiap artikel kompetitor menyebut monitoring harga sebagai use case, tapi hampir nggak ada yang menunjukkan cara mengotomatiskannya.
Opsi 1: Cron Job (Linux/macOS) atau Task Scheduler (Windows)
Pendekatan paling sederhana. Bungkus script Python Anda dalam cron job. Selalu pakai path absolut ke Python di venv Anda — cron jalan dengan environment minimal:
crontab -e
# Setiap hari pukul 08:15
15 8 * * * /Users/me/ebay/venv/bin/python /Users/me/ebay/scrape_ebay.py >> /Users/me/ebay/scrape.log 2>&1
Di Windows, gunakan PowerShell:
$A = New-ScheduledTaskAction -Execute "C:\Users\me\ebay\venv\Scripts\python.exe" -Argument "C:\Users\me\ebay\scrape_ebay.py"
$T = New-ScheduledTaskTrigger -Daily -At 8:15am
Register-ScheduledTask -TaskName "eBayScraper" -Action $A -Trigger $T
Ini butuh mesin yang selalu menyala, dan Anda mengelola proxy serta langkah anti-bot sendiri.
Opsi 2: Cloud Functions (Serverless)
AWS Lambda atau Google Cloud Functions memungkinkan Anda menjalankan scraper tanpa server khusus. Setup-nya lebih berat — Anda perlu membungkus dependency, menangani timeout (Lambda dibatasi 15 menit), dan tetap mengelola proxy. Tapi Anda nggak perlu maintenance server.
Opsi 3: Scheduling Tanpa Kode dengan Thunderbit
Fitur Scheduled Scraper dari Thunderbit memungkinkan Anda mendeskripsikan interval dengan bahasa biasa (misalnya, “setiap hari jam 8 pagi”), memasukkan URL eBay, lalu klik Schedule. Prosesnya jalan di cloud dengan anti-bot handling bawaan.
| Pendekatan | Usaha Setup | Perlu Server? | Anti-Bot Tertangani? |
|---|---|---|---|
| Cron + script Python | Menengah | Ya (mesin selalu aktif) | Proxy dikelola sendiri |
| Cloud function (Lambda) | Tinggi | Tidak (serverless) | Proxy dikelola sendiri |
| Thunderbit Scheduled Scraper | Rendah (deskripsikan dengan kata-kata) | Tidak | Bawaan |
Untuk menyimpan data hasil scrape berkala, database SQLite lokal adalah pilihan yang pas untuk riwayat harga. Pakai ON CONFLICT ... DO UPDATE (bukan INSERT OR REPLACE, yang merusak foreign key dan menghapus kolom):
CREATE TABLE IF NOT EXISTS listings (
item_id TEXT PRIMARY KEY,
title TEXT NOT NULL,
price REAL,
last_price REAL,
first_seen_at TEXT DEFAULT (datetime('now')),
last_seen_at TEXT DEFAULT (datetime('now'))
);
CREATE TABLE IF NOT EXISTS price_history (
item_id TEXT NOT NULL,
observed_at TEXT NOT NULL DEFAULT (datetime('now')),
price REAL NOT NULL,
PRIMARY KEY (item_id, observed_at)
);
Coba Thunderbit Scheduled Scraper
Tidak Mau Ngoding? Cara Scrape eBay dalam 2 Menit dengan Thunderbit
Saya sudah nulis 2.000 kata tentang kode Python. Sekarang saya mau jujur soal kapan Anda nggak membutuhkannya.
Kalau Anda pengguna bisnis yang cuma perlu riset pasar sekali jalan, reseller yang cek pembanding harga, atau tim ecommerce yang butuh data hari ini tanpa sprint developer, Python itu terlalu berlebihan. Setup, maintenance selector, pengelolaan proxy — semuanya terlalu banyak overhead untuk skenario “saya cuma butuh 200 listing ini dalam spreadsheet.”
Cara Thunderbit Scrape eBay (Langkah demi Langkah)
- Install Thunderbit Chrome Extension — tanpa kartu kredit.
- Buka halaman hasil pencarian eBay atau halaman produk apa pun di Chrome.
- Klik “AI Suggest Fields” di sidebar Thunderbit. AI akan membaca halaman dan menyarankan kolom: Title, Price, Condition, Shipping, Seller, Rating.
- Klik “Scrape.” Extension akan menelusuri pagination dan mengisi tabel data. Khusus eBay, Thunderbit punya template scraper instan bawaan yang bisa langsung dipakai sekali klik.
- Ekspor ke Google Sheets, Airtable, Notion, CSV, JSON, atau Excel — gratis.
Seluruh prosesnya kurang dari 2 menit.
Saya sudah mengukurnya.
Enrichment Subpage: Dapatkan Data Detail Page Tanpa Kode Tambahan
Setelah Anda scrape halaman hasil pencarian, Thunderbit bisa mengunjungi halaman detail tiap listing dan menambahkan field tambahan — spesifikasi lengkap, info penjual, deskripsi, semua gambar. Ini menggantikan 20+ baris kode Python untuk subpage scraping yang kita tulis sebelumnya dengan satu klik saja.
Kapan Tetap Lebih Baik Pakai Python
Python unggul saat Anda butuh:
- Scraping skala besar (puluhan ribu halaman per run)
- Logika parsing yang sangat kustom atau transformasi data
- Integrasi ke pipeline data yang sudah ada (Airflow, dbt, Kafka)
- Kontrol TLS/session yang sangat detail untuk anti-bot tingkat lanjut
- Unit economics — di jutaan baris, stack yang dipelihara sendiri lebih hemat daripada SaaS berbasis kredit
Untuk sebagian besar proyek sekali jalan atau skala menengah, Thunderbit lebih cepat dan mudah. Untuk pipeline produksi skala besar, Python memberi Anda kontrol penuh.
Tips Agar Tidak Diblokir Saat Scrape eBay dengan Python
eBay memakai lapisan Akamai yang nyata. Yang benar-benar bekerja di praktik:
- Gunakan
curl_cffidenganimpersonate="chrome124"— ini peningkatan terbesar dibandingrequestsbiasa - Rotasi string User-Agent dari daftar browser versi terbaru (Chrome 143, Firefox 124, Safari 26)
- Tambahkan jeda acak 3–8 detik antar request — interval tetap justru jadi fingerprint
- Gunakan residential proxy atau rotating proxy untuk scraping di atas beberapa lusin halaman. IP data center (AWS, GCP, DigitalOcean) cepat ditandai oleh Akamai.
- Hormati
robots.txt— sebagian besar URL browse yang difilter memang jelas Disallowed; halaman detail item (/itm/<id>) tidak - Tangani CAPTCHA dengan baik — deteksi lalu ulangi dengan IP berbeda, atau pakai layanan pemecah CAPTCHA
- Jangan membombardir server. Preseden eBay v. Bidder's Edge menunjukkan bahwa trespass to chattels berlaku ketika scraping benar-benar merusak server. Tetap di 1 request/detik per IP menjaga Anda jauh dari ambang itu.
Untuk penggunaan komersial volume tinggi, pertimbangkan memakai Browse API untuk listing aktif dan scraping terarah hanya untuk comps yang sold dan data yang tidak diekspos API. Pendekatan hibrida seperti ini lebih rapi secara teknis maupun legal.
Apakah Legal Scrape eBay dengan Python?
Saya bukan pengacara, dan postingan ini bukan nasihat hukum. Jadi saya singkat saja.
Lanskap hukum belakangan ini lebih menguntungkan scraping data yang tersedia publik. Preseden kuncinya:
- hiQ v. LinkedIn (9th Cir., 2022): scraping data yang bisa diakses publik tidak melanggar CFAA
- Van Buren v. United States (SCOTUS, 2021): mempersempit ketentuan CFAA tentang "exceeds authorized access"
- Meta v. Bright Data (N.D. Cal., 2024): scraping saat logout tidak melanggar TOS platform karena scraper bukan “user”
Namun, pembaruan User Agreement eBay Februari 2026 secara eksplisit melarang “buy-for-me agents, LLM-driven bots, atau alur end-to-end apa pun yang mencoba melakukan order tanpa peninjauan manusia.” Batasnya jelas: scraping read-only pada halaman publik masih berada di wilayah yang kuat; mengotomatiskan checkout tidak.
Praktik terbaik: scrape hanya data yang terlihat publik. Jangan bikin akun palsu atau melewati login wall. Jangan menjual ulang gambar listing berhak cipta secara massal. Dan konsultasikan dengan penasihat hukum untuk proyek skala komersial.
Kesimpulan dan Poin Penting
Python adalah cara paling fleksibel untuk scrape eBay, tapi butuh maintenance berkelanjutan saat HTML situs berubah. Kerangka keputusannya:
- Gunakan eBay Browse API untuk kueri aktif yang stabil, volume sedang, dan terstruktur
- Gunakan scraping Python untuk listing sold, ulasan, data varian, dan field apa pun yang tidak diekspos API
- Gunakan Thunderbit kalau Anda ingin data eBay tanpa menulis atau memelihara kode
Kode dalam panduan ini memprioritaskan ketahanan: ekstraksi JSON-LD dulu, fallback CSS bertingkat kedua, parsing JSON tersembunyi untuk varian. Pendekatan berlapis ini bikin scraper Anda nggak langsung mati saat tim frontend eBay rilis redesign berikutnya.
Kalau Anda ingin coba jalur tanpa kode, free tier Thunderbit memungkinkan Anda mengujinya di halaman eBay sekarang juga. Dan kalau Anda ingin lihat bagaimana template eBay scraper bekerja, tinggal satu klik.
Untuk info lebih lanjut tentang tools web scraping, lihat panduan kami tentang best automated web scraping tools, scraping data dari website ke Excel, dan best Python web scraping tools. Anda juga bisa menonton tutorial di Thunderbit YouTube Channel.
Coba Thunderbit untuk scraping eBay Get Started Free
FAQ
1. Bisakah saya scrape eBay gratis dengan Python?
Bisa. Semua library (Requests, BeautifulSoup, curl_cffi, pandas) gratis dan open source. Biaya muncul saat skala besar — residential proxy untuk volume tinggi biasanya berkisar $50–500/bulan tergantung bandwidth. Untuk project kecil (beberapa ratus halaman), Anda bisa scraping dari IP rumah dengan rate limiting yang hati-hati.
2. Bagaimana cara scrape item sold dan completed listing eBay dengan Python?
Tambahkan LH_Complete=1&LH_Sold=1 ke parameter URL pencarian Anda. Keduanya wajib dipakai — LH_Sold=1 saja pada beberapa kategori diam-diam balik ke listing aktif. Filter hasil dengan memeriksa class CSS .POSITIVE pada elemen harga, yang menandakan penjualan nyata, bukan expired listing yang tidak terjual.
3. Apakah eBay memblokir web scraping?
eBay memakai Akamai Bot Manager, yang terutama mendeteksi scraper lewat TLS fingerprinting dan analisis perilaku. Request requests biasa sering dapat respons 403. Menggunakan curl_cffi dengan impersonasi browser, rotasi User-Agent, dan jeda acak 3–8 detik antar request bisa menangani sebagian besar blokir. Residential proxy membantu saat skala besar.
4. Sebaiknya pakai eBay API atau web scraping?
Gunakan Browse API untuk kueri stabil dengan volume sedang pada listing aktif (hingga 5.000 panggilan/hari). Gunakan scraping saat Anda butuh riwayat harga sold, data varian/MSKU lengkap, ulasan, atau field apa pun yang tidak diekspos API. Marketplace Insights API secara teknis menyediakan data sold, tapi aksesnya dibatasi dan sering ditolak.
5. Apa cara termudah untuk scrape eBay tanpa coding?
Thunderbit Chrome extension memakai AI untuk membaca halaman eBay, menyarankan kolom data, dan mengekstrak listing dengan sekali klik. Extension ini menangani pagination, enrichment subpage, serta ekspor ke Google Sheets, Excel, Airtable, atau Notion. Template eBay scraper bawaan bikin prosesnya jauh lebih cepat untuk use case umum.
Pelajari Lebih Lanjut


