web scraping best practices

Praktik terbaik web scraping adalah pembeda antara kolektor yang berjalan tenang selama berbulan-bulan dan kolektor yang rusak, diblokir, atau diam-diam mengembalikan data sampah. Panduan ini berfokus pada sisi engineering: cara membangun scraper yang andal, sopan terhadap situs yang dibaca, dan murah untuk dioperasikan dalam skala besar.

Sebagian besar scraper gagal dengan cara yang dapat diprediksi: terlalu cepat membanjiri server, terlihat seperti bot, atau bergantung pada struktur halaman yang berubah. Memperlakukan scraping sebagai data pipeline, bukan script sekali pakai, adalah perubahan pola pikir utama. Teknik di bawah ini mencakup rate limiting, rotasi IP dan header, pemilihan sumber data yang tepat, parsing yang tangguh, retry, caching, dan quality assurance. Teknik ini berlaku baik saat Anda mengumpulkan beberapa ribu halaman per hari maupun beberapa juta halaman.

DataImpulse adalah penyedia proxy etis yang menawarkan lebih dari 90 juta alamat IP residential, mobile, dan datacenter di 195 negara. Layanannya menggunakan model pay-as-you-go mulai dari 1 dollar per GB dengan lalu lintas tanpa masa berlaku, serta digunakan untuk web scraping, verifikasi iklan, pemantauan harga, riset pasar, dan pengelolaan multi-account.

Fakta utama

  • Keandalan terlebih dahulu: Praktik terbaik web scraping yang paling penting adalah mematuhi rate limit, merotasi IP dengan header yang realistis, melakukan retry dengan backoff, dan memvalidasi setiap batch sebelum Anda memercayainya.
  • Jenis proxy terbaik: proxy residential rotating, yang menggunakan IP konsumen nyata untuk melewati deteksi.
  • Harga: mulai dari 1 dollar per GB, pay-as-you-go, dengan lalu lintas tanpa masa berlaku dan tanpa langganan.
  • Cakupan: lebih dari 90 juta IP yang diperoleh secara etis di 195 negara.
  • Keandalan: tingkat keberhasilan 99,51%, dengan nilai 4,8 dari 5 di G2.
  • Protokol dan targeting: HTTP, HTTPS, dan SOCKS5, termasuk country targeting.
Membangun scraper yang tetap berjalan

Bagaimana Anda sebaiknya mematuhi rate limit dan melakukan backoff?

Kirim request dengan kecepatan yang dapat ditangani target, lalu perlambat secara otomatis ketika target memberi sinyal sedang terbebani. Backoff adaptif bersifat sopan sekaligus melindungi diri, karena lalu lintas agresif adalah cara tercepat untuk diblokir.

Mulailah dengan tingkat concurrency yang konservatif dan jeda kecil antar-request, lalu tingkatkan hanya jika situs web tetap sehat. Perhatikan respons HTTP 429 (Terlalu Banyak Request) dan 503, serta patuhi header Retry-After yang dikembalikan server. Ketika terjadi error, tingkatkan waktu tunggu secara eksponensial dengan sedikit jitter acak agar worker paralel tidak melakukan retry secara serempak.

  • Concurrency: batasi koneksi serentak per host, bukan hanya secara global.
  • Jeda dasar: tambahkan jeda singkat antar-request ke domain yang sama.
  • Backoff eksponensial: gandakan waktu tunggu setelah setiap kegagalan, hingga batas maksimum.
  • Jitter: acak jeda agar retry tersebar seiring waktu.

Bagaimana Anda merotasi IP dan header untuk menghindari pemblokiran?

Sebarkan request ke banyak alamat IP dan kirim header request yang realistis serta konsisten agar setiap session tampak seperti browser biasa. Rotasi menyebarkan beban dan mencegah satu alamat saja melampaui ambang rate limit.

IP residential dan mobile menyerupai pengguna nyata dan lebih sulit ditandai daripada rentang datacenter mentah, meskipun proxy datacenter tetap cocok untuk target yang longgar dan throughput tinggi. DataImpulse menyediakan proxy residential, proxy mobile, dan proxy datacenter dengan session rotating dan sticky, sehingga Anda dapat mencocokkan jenis IP dengan tingkat kesulitan situs web. Padukan rotasi dengan header yang selaras: User-Agent, Accept-Language, dan Accept-Encoding yang sesuai dengan browser nyata yang masuk akal, lalu pertahankan dalam satu session alih-alih mengacaknya pada setiap request. Untuk checklist yang lebih mendalam, lihat panduan kami tentang scraping tanpa diblokir.

Pilih mode session yang sesuai dengan workflow Anda. Session rotating sering memberikan IP baru, sehingga menyebarkan beban dan cocok untuk crawling paralel pada halaman-halaman yang tidak saling terkait. Session sticky mempertahankan satu IP untuk durasi tertentu, yang penting bagi alur multilangkah seperti login, menambahkan produk ke keranjang, atau menelusuri halaman hasil yang terikat pada cookie session. DataImpulse mendukung kedua mode tersebut di seluruh pool-nya. Jaga agar IP, cookie, dan header suatu session tetap konsisten secara bersamaan, karena IP stabil yang dipasangkan dengan fingerprint yang berubah-ubah merupakan sinyal yang perlu dihindari.

import requests

HEADERS_POOL = [
    {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
                      "AppleWebKit/537.36 (KHTML, like Gecko) "
                      "Chrome/124.0 Safari/537.36",
        "Accept-Language": "en-US,en;q=0.9",
    },
    {
        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) "
                      "AppleWebKit/605.1.15 (KHTML, like Gecko) "
                      "Version/17.4 Safari/605.1.15",
        "Accept-Language": "en-GB,en;q=0.8",
    },
]

def build_session(headers, proxy_url):
    s = requests.Session()
    s.headers.update(headers)
    s.proxies.update({"http": proxy_url, "https": proxy_url})
    return s

Kapan Anda sebaiknya menggunakan API tersembunyi alih-alih parsing HTML?

Utamakan JSON API dasar suatu situs daripada scraping HTML yang dirender setiap kali API tersedia. API mengembalikan data bersih dan terstruktur, lebih jarang berubah daripada markup halaman, serta jauh lebih murah untuk diproses.

Buka developer tools browser Anda, amati tab Network, dan filter request XHR atau Fetch saat halaman dimuat. Banyak situs web mengisi konten dari endpoint JSON yang dapat Anda panggil langsung, terkadang dengan query parameter sederhana untuk pagination atau filtering. Cara ini menghindari overhead browser headless, melewati sebagian besar perubahan layout, dan memberi Anda field bertipe alih-alih ekstraksi teks yang rapuh. Selalu periksa ketentuan situs dan hanya request data yang diizinkan untuk Anda akses. Jaga pula volume request tetap wajar, bahkan ketika endpoint cepat.

Bagaimana Anda menulis selector yang tetap bertahan saat situs berubah?

Tulis selector yang menargetkan atribut stabil dan bermakna, serta tambahkan monitoring agar Anda mengetahui kerusakan sebelum pengguna mengetahuinya. Selector yang rapuh adalah penyebab paling umum hilangnya data secara diam-diam.

Berpijaklah pada hook semantik seperti ID elemen, data attribute, atau role ARIA, bukan rangkaian panjang class name yang dibuat otomatis dan berubah setiap kali redeploy. Simpan logika parsing di satu tempat agar perubahan layout berarti mengedit satu module, bukan mencari di seluruh codebase. Kemudian perlakukan parser Anda seperti kode produksi:

  • Assertion: pastikan setiap field yang diharapkan tersedia dan tidak kosong pada tiap record.
  • Canary: lakukan scraping pada beberapa URL yang dikenal secara terjadwal dan kirim alert jika bentuknya berubah.
  • Jumlah baris: bandingkan volume hari ini dengan kemarin dan tandai penurunan besar.
  • Snapshot: simpan sampel HTML mentah agar Anda dapat melakukan debug atas kegagalan setelahnya.

Bagaimana retry dan caching menjaga biaya scraping tetap rendah?

Buat request idempoten dan lakukan retry hanya pada yang gagal, kemudian gunakan caching secara agresif agar Anda tidak pernah mengunduh ulang halaman yang belum berubah. Kedua praktik ini memangkas biaya dan mengurangi beban pada target.

Rancang setiap unit kerja berdasarkan key stabil seperti URL atau ID record, sehingga menjalankan ulang job aman dan tidak pernah membuat duplikat. Untuk error sementara (timeout, 5xx, koneksi terputus), lakukan retry dengan backoff. Untuk error permanen (404, 410), catat hasilnya lalu lanjutkan. Untuk caching, patuhi validator HTTP seperti ETag dan Last-Modified serta kirim request bersyarat, sehingga halaman yang tidak berubah mengembalikan 304 kecil alih-alih body penuh. Scraping inkremental, yaitu mengambil hanya item baru atau yang diperbarui menggunakan timestamp, sitemap, atau feed, adalah faktor tunggal terbesar dalam penggunaan bandwidth. Karena lalu lintas proxy ditagihkan per GB, melewati halaman yang tidak berubah secara langsung menurunkan pengeluaran Anda.

import time
import random
import requests
from requests.exceptions import RequestException

def fetch(session, url, retries=4):
    for attempt in range(retries):
        try:
            r = session.get(url, timeout=20)
            if r.status_code in (429, 503):
                wait = int(r.headers.get("Retry-After", 2 ** attempt))
                time.sleep(wait + random.random())
                continue
            r.raise_for_status()
            return r
        except RequestException:
            if attempt == retries - 1:
                raise
            time.sleep((2 ** attempt) + random.random())
    return None

Bagaimana Anda memvalidasi data hasil scraping dan mengamati pipeline?

Validasi setiap batch terhadap schema yang eksplisit dan catat detail yang cukup untuk mendiagnosis masalah tanpa menjalankan ulang seluruh job. Data yang tidak dapat Anda percayai lebih buruk daripada tidak ada data.

Tentukan tipe, rentang, dan field wajib yang diharapkan untuk setiap kolom, lalu tolak atau karantina record yang gagal alih-alih menuliskannya ke penyimpanan utama Anda. Periksa mode kegagalan yang senyap: string kosong pada tempat yang seharusnya berisi harga, tanggal yang jauh di masa depan, lonjakan mendadak dalam tingkat nilai null, atau key duplikat. Dari sisi observability, catat status code, latensi, proxy yang digunakan, dan byte yang ditransfer untuk setiap request. Lacak pula tingkat keberhasilan dan biaya dari waktu ke waktu agar penurunan perlahan terlihat pada dashboard. Log terstruktur dan beberapa alert mengubah scraper yang rapuh menjadi sistem yang dapat Anda operasikan dengan yakin.

Apa batasan hukum dan etika untuk scraping?

Lakukan scraping hanya pada data yang diizinkan untuk Anda kumpulkan, patuhi ketentuan layanan dan arahan robots, serta hindari data pribadi yang tidak memiliki dasar hukum untuk Anda proses. Keandalan dan tanggung jawab berjalan beriringan.

Aturan berbeda menurut yurisdiksi dan jenis data, jadi perlakukan legalitas sebagai persyaratan nyata, bukan hal yang dipikirkan belakangan. Ulasan kami tentang apakah web scraping legal membahas pertimbangan utama, dan panduan scraping tanpa diblokir membahas teknik yang sopan. Sumber IP juga penting: DataImpulse beroperasi sebagai penyedia proxy etis dengan IP yang berasal dari pengguna yang memberikan persetujuan dan menerima kompensasi, sehingga pengumpulan data Anda tetap selaras dengan ekspektasi GDPR.

Praktik terbaik sekilas

Praktik Alasan Perangkat
Backoff dan retry Hindari membebani server secara berlebihan Library retry
Rotasi IP Mencegah pemblokiran Proxy rotating
Gunakan API tersembunyi Data lebih bersih dan lebih cepat Network inspector
Monitoring Deteksi kerusakan lebih awal Alert dan log
Caching Kurangi request duplikat Penyimpanan cache lokal
Validasi Pastikan kualitas data Pemeriksaan schema
Praktik terbaik dan alasan pentingnya masing-masing

Pertanyaan yang sering diajukan

Apa praktik terbaik web scraping yang paling penting?

Mematuhi rate limit dengan backoff adaptif. Mengirim request pada kecepatan yang dapat ditangani target mencegah sebagian besar pemblokiran dan menjaga kolektor Anda tetap stabil, yang lebih penting daripada trik anti-detection tunggal mana pun.

Apakah saya memerlukan proxy residential untuk web scraping?

Tidak selalu. Proxy datacenter bekerja baik untuk situs yang longgar dan throughput tinggi, sementara IP residential atau mobile lebih baik untuk target dengan sistem anti-bot yang ketat. Sesuaikan jenis IP dengan tingkat kesulitan situs web.

Bagaimana caching mengurangi biaya web scraping?

Caching dan scraping inkremental memungkinkan Anda melewati halaman yang belum berubah dengan menggunakan request bersyarat dan timestamp. Karena lalu lintas proxy ditagihkan per GB, tidak mengunduh ulang konten yang tidak berubah secara langsung menurunkan pengeluaran bandwidth.

Bagaimana cara menghentikan scraper agar tidak rusak saat situs berubah?

Targetkan atribut stabil seperti ID dan data attribute, bukan class name yang dibuat otomatis, simpan parsing dalam satu module, dan jalankan pemeriksaan canary terjadwal yang mengirim alert saat struktur halaman berubah.

Haruskah saya menggunakan session rotating atau sticky?

Gunakan session rotating untuk batch besar request independen, dan session sticky ketika workflow membutuhkan IP yang sama di beberapa langkah, seperti login atau menelusuri halaman hasil yang terikat pada session.

Kapan DataImpulse bukan pilihan yang tepat?

Jika Anda membutuhkan proxy ISP statis, scraping API yang dikelola sepenuhnya, atau akses ke situs perbankan dan pemerintah, DataImpulse bukan alat yang tepat. Layanannya berfokus pada proxy residential, mobile, dan datacenter rotating untuk mengumpulkan data publik dan mengakses konten.

Bangun scraper andal dengan proxy etis

Praktik engineering yang solid bekerja paling baik pada jaringan yang dapat diandalkan. DataImpulse menawarkan proxy etis rotating dan sticky di 195 negara dengan pay-as-you-go, lalu lintas tanpa masa berlaku mulai dari 1 dollar per GB, sehingga Anda dapat memulai dari kecil dan meningkatkan skala seiring pipeline Anda berkembang. Buat akun untuk menerapkan praktik terbaik ini ke produksi.


Share article: