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:
- Scheduler. Memutuskan halaman produk mana yang dikunjungi dan kapan. Sebarkan kunjungan sepanjang hari, jangan mengecek semuanya pada menit yang sama.
- Fetcher. Mengunduh halaman, dengan pacing yang sopan, retry, dan cache.
- Parser. Mengambil harga, konteks mata uang, dan status stok.
- Store. Menyimpan setiap observasi dengan timestamp, sehingga Anda punya riwayat.
- 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
- Gunakan feed atau API resmi terlebih dahulu, dan baca ketentuan setiap situs yang Anda pantau.
- Hormati
robots.txt, jaga laju request tetap rendah, dan simpan hasil di cache. - Jangan memantau pesaing dengan cara yang menurunkan layanan mereka.
- Batasi data yang Anda kumpulkan pada apa yang Anda butuhkan, dan jangan menyimpan informasi pribadi yang muncul di halaman produk.
Langkah selanjutnya
- Scrape hasil pencarian
- Scrape tanpa terblokir
- Proxy berputar untuk scraping
- Apakah web scraping legal? Gambaran umum
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.