Scarnox · Blog

Pemantauan harga dengan web scraping: panduan praktis

Pemantauan harga berarti mengecek harga sebuah produk di sejumlah situs, sesuai jadwal, dan mencatat apa yang Anda lihat agar bisa dibandingkan seiring waktu. Peritel, marketplace, dan analis semuanya menggunakannya. Scraping harga juga merupakan salah satu cara paling umum bagi scraper untuk bertemu captcha, jadi penting untuk merancangnya dengan benar. Panduan ini membahas apa yang perlu dipantau, cara mem-parsing angka dari halaman yang tidak pernah dimaksudkan untuk di-parse, cara menyimpan dan memberi peringatan atas perubahan, serta cara tetap mematuhi aturan situs saat melakukannya.

Mulai dari sumber yang boleh Anda gunakan

Sebelum menulis kode apa pun, periksa apakah situs menyediakan cara resmi untuk mendapatkan data: feed produk, API, atau program mitra. Cara-cara ini lebih andal daripada scraping, dan menghilangkan sebagian besar risiko hukum dan teknis. Scraping adalah cadangan untuk halaman publik ketika tidak ada jalur resmi, dan ketentuan serta robots.txt tetap berlaku. Gambaran umum hukum membahas pertanyaan umumnya.

Arsitektur dalam lima bagian

Pemantau yang andal memiliki lima bagian, dan memisahkannya membuat debugging lebih mudah:

  1. Scheduler. Memutuskan halaman produk mana yang dikunjungi dan kapan. Sebarkan kunjungan sepanjang hari, jangan mengecek semuanya pada menit yang sama.
  2. Fetcher. Mengunduh halaman, dengan pacing yang sopan, retry, dan cache.
  3. Parser. Mengambil harga, konteks mata uang, dan status stok.
  4. Store. Menyimpan setiap observasi dengan timestamp, sehingga Anda punya riwayat.
  5. Alerter. Membandingkan nilai baru dengan nilai terakhir dan memberi tahu Anda ketika melewati ambang yang Anda tetapkan.

Parse harga dari halaman yang berantakan

Harga muncul dalam banyak bentuk: dengan pemisah ribuan, dengan koma desimal, dengan label sebelum angka, atau terpecah di beberapa elemen. Jaga agar parser tetap kecil dan uji dengan contoh nyata. Berikut versi yang mengasumsikan format umum dengan koma untuk ribuan dan titik untuk desimal. Normalisasi format lain sebelum Anda memanggilnya.

import re
from decimal import Decimal, InvalidOperation

PRICE_PATTERN = re.compile(r"\d{1,3}(?:,\d{3})*(?:\.\d{1,2})?|\d+(?:\.\d{1,2})?")

def parse_price(text: str) -> Decimal | None:
    """Kembalikan angka pertama dalam teks sebagai Decimal, atau None."""
    match = PRICE_PATTERN.search(text.replace(" ", " "))
    if not match:
        return None
    try:
        return Decimal(match.group(0).replace(",", ""))
    except InvalidOperation:
        return None

print(parse_price("Now 1,249.50 in stock"))  # Decimal('1249.50')
print(parse_price("Sold out"))               # None

Gunakan Decimal, bukan float, untuk apa pun yang akan Anda bandingkan atau jumlahkan. Pembulatan floating-point bisa membuat dua harga yang sama terlihat berbeda. Simpan teks mentah di samping nilai yang sudah di-parse, sehingga Anda bisa memperbaiki bug parser nanti tanpa mengambil ulang setiap halaman.

Simpan riwayat dan deteksi perubahan

Satu harga adalah sebuah snapshot. Nilai dari pemantau ada pada riwayatnya. Simpan satu baris per observasi, dengan ID produk, sumber, timestamp, nilai hasil parse, dan teks mentahnya. Dengan begitu, peringatan hanyalah perbandingan sederhana dengan baris sebelumnya. Beri peringatan hanya untuk perubahan yang berarti, seperti penurunan melebihi persentase tertentu, atau produk yang kehabisan stok, agar Anda tidak dibanjiri noise.

Tangani varian dan bundel

Halaman produk sering menampilkan beberapa harga: satu per ukuran atau warna, harga bundel, harga anggota, atau harga yang hanya muncul setelah pilihan dibuat. Tentukan sebelum membangun apa yang harus dicatat oleh pemantau. Pendekatan umum adalah menyimpan ID varian bersama harga, sehingga perubahan pada satu ukuran tidak terlihat seperti perubahan pada seluruh produk. Berhati-hatilah dengan harga "mulai dari" dan harga asli yang dicoret, karena parser yang mengambil angka yang salah akan menghasilkan peringatan palsu. Simpan teks label di samping setiap nilai, sehingga Anda bisa memeriksa apa yang terbaca ketika sebuah peringatan terlihat keliru.

Jadwalkan dengan sopan

Cek setiap produk dengan interval yang sesuai dengan seberapa sering harganya benar-benar berubah. Produk yang berubah setiap hari tidak perlu dicek setiap jam. Tambahkan jitter pada setiap kunjungan, batasi jumlah request per situs per jam, dan simpan hasil di cache sesuai interval yang Anda pilih. Kebiasaan ini menjaga beban Anda tetap rendah dan data Anda tetap konsisten.

Ketika halaman memblokir Anda

Halaman harga sering menjadi target akses otomatis, jadi Anda mungkin menemukan pemblokiran, pembatasan laju, atau captcha. Mundurlah ketika Anda melihat 429 atau 503, dan berhenti mengunjungi situs yang terus menolak Anda. Jika captcha muncul di halaman yang boleh Anda otomatisasi, jenis captcha yang aktif di Scarnox saat ini adalah PopularCaptcha. Panduan Python PopularCaptcha menunjukkan alur tokennya. Baca scrape tanpa terblokir sebelum Anda menambahkan lebih banyak mesin, karena pacing biasanya memecahkan lebih banyak masalah daripada alat tambahan apa pun.

Beberapa halaman merender harganya dengan JavaScript. Untuk halaman tersebut, ikuti pendekatan di scraping website JavaScript.

Scraping secara bertanggung jawab

Langkah selanjutnya

Mulai dengan kredit uji coba gratis, tanpa kartu: buat akun dan coba alur PopularCaptcha pada halaman yang boleh Anda otomatisasi. Untuk tarif terbaru, lihat halaman harga.