Jika Anda melakukan parsing Wildberries, Ozon, atau situs lain melalui pengunduhan halaman HTML penuh, Anda membayar untuk lalu lintas proxy 5-10 kali lebih banyak daripada yang seharusnya. Setiap halaman kartu produk adalah 200-800 KB markup, skrip, dan gaya, di mana Anda hanya membutuhkan beberapa bidang: harga, ketersediaan, peringkat. Dalam artikel ini, kita akan membahas bagaimana menemukan API tersembunyi situs dan mendapatkan data yang sama secara langsung, dalam format JSON yang ringkas.
Mengapa Parsing HTML Menghabiskan Lalu Lintas Proxy
Ketika parser memuat halaman melalui permintaan HTTP biasa atau melalui browser headless (Selenium, Puppeteer, Playwright), server mengirimkan dokumen HTML lengkap: markup, skrip inline, gaya, terkadang gambar base64 dan ratusan baris JSON dengan data untuk widget iklan yang tidak Anda butuhkan. Kartu produk rata-rata di Wildberries memiliki ukuran 300-600 KB, di Ozon — hingga 800 KB, jika menghitung semua sumber daya terkait (CSS, font, pelacak).
Jika Anda memantau 10.000 produk sekali sehari melalui 3 sesi proxy, ini dengan mudah bisa mencapai puluhan gigabyte lalu lintas dalam sebulan. Proxy residensial dan seluler biasanya dijual berdasarkan lalu lintas, jadi setiap megabyte tambahan adalah biaya langsung. Sementara itu, data nyata yang Anda butuhkan — harga, diskon, sisa stok, peringkat — hanya memakan 1-5 KB dalam respons JSON. Perbedaan 100-200 kali lipat dalam ukuran untuk satu produk, dan dengan mempertimbangkan biaya tambahan untuk rendering browser — penghematan waktu dan CPU menjadi lebih besar.
Masalah tambahan dari parsing HTML adalah kerapuhan. Situs marketplace secara teratur mengubah tata letak, kelas CSS, struktur DOM. Setiap perubahan semacam itu merusak parser yang dibangun di atas XPath atau pemilih CSS. API internal berubah jauh lebih jarang, karena itu mempengaruhi kerja aplikasi seluler dan frontend situs secara bersamaan.
Apa Itu API Tersembunyi dan Dari Mana Datangnya
Hampir setiap situs modern adalah SPA (Single Page Application) atau aplikasi hibrida, di mana browser terlebih dahulu memuat "kerangka" halaman, dan kemudian melalui JavaScript melakukan permintaan tambahan ke API internal untuk data nyata: harga, sisa, ulasan, rekomendasi. Permintaan ini disebut API tersembunyi atau internal — mereka tidak didokumentasikan secara publik, tetapi sepenuhnya terbuka dalam lalu lintas browser.
Secara teknis, ini biasanya adalah endpoint REST atau GraphQL, yang mengembalikan data dalam format JSON. Misalnya, di Wildberries, kartu produk dimuat melalui permintaan seperti card.wb.ru dan wbx-content-v2.wbstatic.net, sementara harga dan sisa dikirim melalui permintaan terpisah ke basket-01.wb.ru dan domain serupa. Di Ozon, logika serupa: frontend mengakses API composer internal, yang mengagregasi data dari microservices.
Penting untuk dipahami: penggunaan API semacam itu secara formal bukanlah peretasan — Anda hanya mengulangi permintaan yang sama yang dilakukan oleh browser biasa pengguna. Namun, situs melindungi endpoint ini melalui sistem anti-bot, jadi diperlukan simulasi perilaku klien nyata dengan hati-hati, termasuk melalui proxy berkualitas.
Cara Menemukan API Tersembunyi Melalui DevTools
Menemukan API internal dapat dilakukan tanpa satu baris kode pun, menggunakan alat bawaan dari browser Chrome atau Firefox. Berikut adalah algoritma langkah demi langkah:
- Buka halaman produk yang diinginkan di Chrome, tekan F12 dan pergi ke tab Network.
- Di filter permintaan, pilih jenis Fetch/XHR — ini akan memisahkan pengunduhan gambar, font, dan statis.
- Segarkan halaman (F5) dan lihat daftar permintaan yang muncul setelah memuat kerangka halaman.
- Cari permintaan, di mana dalam respons (tab Respons) terlihat harga produk, nama, atau bidang lain yang diperlukan dalam format JSON.
- Klik pada permintaan ini dan salin sebagai cURL (klik kanan → Salin → Salin sebagai cURL) — ini akan memberi Anda set lengkap header, cookie, dan parameter.
- Periksa parameter mana dalam URL yang wajib (artikel produk, wilayah, versi API), dan mana yang dapat dihilangkan tanpa kehilangan data.
Setelah itu, cukup ulangi permintaan ini melalui pustaka HTTP biasa, mengganti artikel atau ID produk yang diperlukan tanpa harus merender seluruh halaman. Ini bekerja untuk sebagian besar marketplace — Wildberries, Ozon, Avito, serta banyak platform luar negeri seperti Amazon dan eBay.
Perbandingan Lalu Lintas: HTML vs JSON API
Perbedaan dalam volume data sangat besar, sehingga perlu ditunjukkan dalam angka. Di bawah ini adalah pengukuran rata-rata untuk satu kartu produk di marketplace populer.
| Metode Parsing | Ukuran Respons Rata-rata | Waktu Muat | Perlu Rendering JS |
|---|---|---|---|
| HTML Penuh melalui Selenium | 400-800 KB | 1.5-4 detik | Ya |
| Permintaan HTTP Sederhana (requests) | 150-300 KB | 0.3-0.8 detik | Tidak |
| API JSON Tersembunyi | 3-15 KB | 0.1-0.3 detik | Tidak |
Saat memantau 50.000 produk dalam sehari, beralih dari browser headless ke permintaan langsung ke API mengurangi lalu lintas dari sekitar 30-40 GB menjadi 300-700 MB per bulan. Ini bukan hanya penghematan pada lalu lintas proxy, tetapi juga mengurangi beban pada infrastruktur server parser — lebih sedikit CPU untuk rendering, lebih sedikit memori, lebih cepat dalam pengumpulan data.
Contoh Praktis dalam Python
Mari kita lihat contoh yang disederhanakan: mendapatkan harga dan sisa produk melalui permintaan langsung ke API internal daripada memuat halaman penuh. Ini adalah template pembelajaran — endpoint dan parameter yang tepat perlu ditentukan melalui DevTools untuk situs tertentu, karena struktur permintaan dapat bervariasi tergantung pada wilayah dan versi API.
import requests
def get_product_data(product_id: str, proxies: dict = None) -> dict:
"""
Mendapatkan data produk melalui API internal daripada HTML penuh.
proxies — kamus dengan proxy dalam format requests: {"http": "...", "https": "..."}
"""
url = f"https://card.example-marketplace.ru/v2/detail"
params = {
"nm": product_id,
"dest": "-1257786", # wilayah, ditentukan melalui DevTools
"spp": "0"
}
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/120.0 Safari/537.36",
"Accept": "application/json",
"Referer": f"https://www.example-marketplace.ru/catalog/{product_id}/detail.aspx"
}
response = requests.get(
url,
params=params,
headers=headers,
proxies=proxies,
timeout=10
)
response.raise_for_status()
data = response.json()
product = data["products"][0]
return {
"id": product["id"],
"name": product["name"],
"price": product["salePriceU"] / 100,
"stock": product.get("totalQuantity", 0),
"rating": product.get("reviewRating", None)
}
if __name__ == "__main__":
proxy = {
"http": "http://user:pass@proxy-host:port",
"https": "http://user:pass@proxy-host:port"
}
result = get_product_data("123456789", proxies=proxy)
print(result)
Perhatikan tiga hal dalam contoh ini. Pertama, kita menyertakan header Referer, karena banyak API memeriksa bahwa permintaan datang "dari browser", bukan langsung melalui URL. Kedua, kita menggunakan User-Agent yang realistis, bukan default dari pustaka requests, yang mudah terdeteksi. Ketiga, seluruh permintaan dilakukan dalam satu panggilan HTTP tanpa rendering — ini yang memberikan keuntungan besar dalam lalu lintas dan kecepatan.
Untuk endpoint GraphQL, logika serupa, tetapi alih-alih parameter GET, Anda mengirimkan permintaan POST dengan body permintaan dalam format JSON, di mana Anda secara eksplisit mencantumkan bidang yang diperlukan — ini lebih lanjut mengurangi volume respons, karena server hanya mengembalikan data yang diminta.
Bekerja dengan Proxy saat Mengirim Permintaan ke API
Bahkan saat beralih ke format JSON yang ringkas, Anda tetap memerlukan proxy — marketplace membatasi jumlah permintaan dari satu IP dan memblokir saat ada aktivitas yang tidak normal. Pemilihan jenis proxy yang tepat di sini secara langsung mempengaruhi stabilitas parser.
Untuk penghindaran massal API marketplace seperti Wildberries atau Ozon, proxy data center sangat cocok — mereka memberikan kecepatan tinggi dan biaya lalu lintas rendah, yang sangat penting saat melakukan permintaan sering ke endpoint JSON yang ringan. Namun, jika API tertentu dilindungi oleh anti-bot yang lebih ketat dan memblokir subnet data center secara keseluruhan, lebih bijaksana untuk beralih ke proxy residensial — mereka menggunakan alamat IP nyata dari pengguna rumah dan lebih jarang terkena pemblokiran berdasarkan subnet.
Untuk API yang terkait dengan aplikasi seluler (beberapa versi endpoint Avito atau marketplace hanya memberikan data melalui lalu lintas seluler), mungkin diperlukan koneksi melalui proxy seluler — mereka meniru lalu lintas dari operator seluler nyata dan melewati pemeriksaan yang memblokir IP biasa.
Saat mengatur proxy dalam parser, penting juga untuk menyebarkan permintaan berdasarkan waktu dan menggunakan rotasi IP — bahkan permintaan JSON yang ringkas, yang diulang 1000 kali dalam satu menit dari satu alamat, akan menimbulkan kecurigaan pada sistem perlindungan. Atur kumpulan beberapa sesi proxy dan distribusikan beban di antara mereka, menambahkan penundaan acak 1-3 detik di antara permintaan.
Jebakan: Token, Tanda Tangan, Anti-bot
API tersembunyi tidak selalu terbuka lebar. Beberapa situs melindungi endpoint mereka dengan mekanisme tambahan yang perlu dipertimbangkan saat membangun parser.
- Token sesi sementara — beberapa API memerlukan permintaan awal untuk token, yang kemudian dikirim dalam header permintaan berikutnya dan memiliki waktu hidup terbatas (biasanya 5-30 menit).
- Tanda tangan permintaan (signature) — parameter permintaan di-hash di klien dengan kunci rahasia dari kode JS halaman. Tanda tangan semacam itu perlu diulang secara manual, setelah mempelajari algoritma, atau dilakukan melalui browser headless hanya pada tahap mendapatkan token, dan kemudian mengirimkan permintaan ringan secara langsung.
- Rate limiting berdasarkan IP dan User-Agent — saat melebihi frekuensi permintaan, situs sementara memblokir akses. Ini dapat diatasi dengan rotasi proxy dan penundaan yang wajar.
- Fingerprinting header — beberapa sistem memeriksa seluruh set header (urutan, keberadaan Accept-Language, Sec-Fetch-*) dan memblokir permintaan dengan set "tidak lengkap", yang khas untuk skrip, bukan browser.
- Ketergantungan data berdasarkan geo — harga dan sisa di marketplace dapat berbeda berdasarkan wilayah, jadi penting untuk mengirimkan parameter wilayah/yang benar dalam permintaan, jika tidak, data akan menjadi tidak relevan.
Jika API dilindungi oleh tanda tangan permintaan yang sulit untuk diulang, opsi kompromi adalah menggunakan browser headless (Playwright, Puppeteer) hanya untuk menangkap permintaan jaringan dan mengekstrak respons JSON yang sudah siap, tanpa parsing DOM. Ini lebih lambat daripada permintaan HTTP langsung, tetapi masih lebih cepat dan lebih ringan daripada parsing tata letak halaman secara penuh.
Daftar Periksa Sebelum Menjalankan Parser pada API Tersembunyi
- Endpoint ditemukan melalui DevTools, disalin sebagai cURL dan diuji di Postman atau melalui requests.
- Parameter wajib permintaan (ID produk, wilayah, versi API) telah ditentukan dan parameter yang berlebihan dihapus.
- Header User-Agent, Referer, dan Accept-Language diatur secara realistis.
- Diperiksa apakah token sesi atau tanda tangan permintaan diperlukan, dan cara untuk mendapatkannya telah dipikirkan.
- Rotasi proxy dan penundaan acak antara permintaan telah diatur.
- Jenis proxy yang sesuai untuk perlindungan situs tertentu telah dipilih — data center, residensial, atau seluler.
- Penanganan kesalahan 429 dan 403 dengan otomatis beralih ke proxy lain telah ditambahkan.
- Logging volume lalu lintas untuk memantau penghematan nyata telah diatur.
Kesimpulan
Beralih dari parsing HTML penuh ke bekerja dengan API tersembunyi bukan hanya optimasi teknis, tetapi pengurangan langsung biaya untuk lalu lintas proxy dan infrastruktur. Alih-alih memuat ratusan kilobyte markup yang tidak perlu, Anda mendapatkan JSON ringkas dengan tepat bidang yang diperlukan untuk memantau harga, sisa, atau peringkat. Bonus tambahan — ketahanan parser terhadap perubahan tata letak situs, karena API internal berubah lebih jarang daripada frontend.
Namun, metode pencarian API itu sendiri tidak menghilangkan kebutuhan akan proxy berkualitas — sistem anti-bot dari marketplace sama-sama memperhatikan permintaan HTML dan permintaan ke endpoint JSON. Jika Anda memantau Wildberries atau Ozon dalam volume besar, mulailah dengan proxy data center yang cepat untuk mengurangi biaya, dan saat tanda-tanda pemblokiran muncul, beralihlah ke kumpulan IP residensial atau seluler untuk kerja parser yang lebih stabil.