Jika Anda terlibat dalam pemantauan harga pesaing, mem-parsing stok barang, atau penempatan iklan otomatis di marketplace ā Anda pasti telah mengalami pemblokiran. API Wildberries, Ozon, Yandex.Market, dan Avito secara aktif melindungi diri dari otomatisasi: membatasi jumlah permintaan, memblokir alamat IP, dan meminta captcha. Dalam panduan ini, kita akan membahas mengapa pemblokiran terjadi dan bagaimana mengatur parser agar dapat bekerja secara stabil selama berbulan-bulan tanpa banned.
Mengapa marketplace memblokir permintaan sering ke API
Marketplace menghabiskan banyak uang untuk mendukung infrastruktur ā server, basis data, CDN. Ketika Anda melakukan ribuan permintaan per menit untuk mem-parsing harga, Anda menciptakan beban tambahan pada sistem mereka. Namun, alasan utama pemblokiran bukanlah teknis, melainkan berorientasi bisnis.
Penyebab utama pemblokiran:
- Perlindungan data kompetitif. Wildberries dan Ozon tidak ingin pesaing dengan mudah mendapatkan informasi tentang harga, stok, dan produk populer. Data ini adalah rahasia dagang.
- Pengurangan beban pada server. Satu parser dapat menghasilkan sebanyak permintaan yang dilakukan oleh 10.000 pembeli biasa. Ini meningkatkan biaya hosting.
- Perjuangan melawan manipulasi dan spam. Sistem otomatis digunakan untuk manipulasi tampilan, ulasan, dan penempatan iklan massal di Avito.
- Monetisasi API. Beberapa marketplace menawarkan API berbayar resmi dengan batasan. Dengan memblokir pem-parsing gratis, mereka mendorong pembelian akses.
Misalnya, jika Anda memantau harga untuk 5.000 produk setiap jam ā itu berarti 120.000 permintaan per hari. Dari satu alamat IP, ini terlihat mencurigakan, dan sistem perlindungan marketplace akan segera memblokir akses Anda.
Metode perlindungan yang digunakan Wildberries, Ozon, dan Avito
Marketplace modern menggunakan perlindungan multi-level terhadap pem-parsing. Memahami mekanisme ini akan membantu Anda mengatur cara untuk menghindari pemblokiran dengan benar.
| Metode Perlindungan | Cara Kerja | Cara Menghindari |
|---|---|---|
| Rate Limiting | Pembatasan permintaan dari satu IP: 100-500 per jam | Jeda antara permintaan + rotasi IP |
| Daftar Hitam IP | Pemblokiran proxy pusat data yang dikenal | Menggunakan proxy residensial |
| Pemeriksaan User-Agent | Pemblokiran permintaan tanpa User-Agent browser | Mengatur header yang realistis |
| Pemeriksaan JavaScript | Memerlukan eksekusi kode JS untuk mendapatkan data | Menggunakan browser headless |
| Captcha | Pemeriksaan paksa saat aktivitas mencurigakan | Mengurangi frekuensi permintaan, layanan pemecahan captcha |
| TLS Fingerprinting | Menentukan otomatisasi berdasarkan parameter TLS | Menggunakan pustaka dengan fingerprint yang benar |
| Analisis Perilaku | Analisis pola: kecepatan klik, gerakan mouse | Mengacak jeda, meniru perilaku manusia |
Wildberries menggunakan perlindungan agresif: batas sekitar 200-300 permintaan per jam dari satu IP, pemeriksaan User-Agent dan tantangan JavaScript. Jika melebihi batas, Anda akan menerima HTTP 429 (Terlalu Banyak Permintaan) atau 403 (Terlarang).
Ozon lebih ramah terhadap pem-parsing melalui API, tetapi aktif memblokir IP pusat data. Mereka menggunakan layanan untuk menentukan jenis IP (DataCenter vs Residential), jadi proxy biasa sering tidak berfungsi.
Avito melindungi API dari penempatan iklan massal dan pem-parsing kontak. Di sini, keterikatan geografis penting: jika Anda menempatkan iklan di Kazan, IP harus berasal dari Kazan, jika tidak, moderasi akan memblokir publikasi.
Rate limiting: cara mengatur jeda antara permintaan dengan benar
Rate limiting adalah pembatasan buatan terhadap kecepatan permintaan, agar aktivitas Anda terlihat seperti tindakan pengguna biasa. Aturan utama: lebih baik lambat tetapi stabil, daripada cepat dan diblokir.
Pengaturan yang disarankan untuk marketplace populer:
Wildberries:
- Jeda antara permintaan: 2-5 detik (acak)
- Maksimum 150-200 permintaan per jam dari satu IP
- Jeda 10-15 menit setelah setiap 100 permintaan
- Rotasi IP setelah 200 permintaan
Ozon:
- Jeda antara permintaan: 1-3 detik
- Maksimum 300-400 permintaan per jam dari satu IP
- Penggunaan proxy residensial wajib
- Rotasi IP setelah 300 permintaan
Avito:
- Jeda antara permintaan: 3-7 detik
- Maksimum 50-100 permintaan per jam (batas ketat)
- IP harus sesuai dengan kota iklan
- Satu IP = satu akun (jangan dicampur)
Cara menerapkan jeda acak: Jangan gunakan interval tetap seperti "tepat 3 detik" ā ini terlihat seperti bot. Tambahkan kebetulan: dari 2 hingga 5 detik. Sebagian besar parser mendukung ini melalui pengaturan.
Misalnya, dalam Python dengan pustaka requests ini terlihat seperti ini:
import time
import random
import requests
def make_request(url, proxies):
response = requests.get(url, proxies=proxies)
# Jeda acak dari 2 hingga 5 detik
delay = random.uniform(2.0, 5.0)
time.sleep(delay)
return response
# Contoh penggunaan
proxy = {
'http': 'http://username:password@proxy.example.com:8000',
'https': 'http://username:password@proxy.example.com:8000'
}
for product_id in product_list:
url = f'https://card.wb.ru/cards/detail?nm={product_id}'
response = make_request(url, proxy)
# Pemrosesan data...
Poin penting: Setelah setiap 100-200 permintaan, lakukan jeda panjang (10-20 menit) atau ganti IP. Ini meniru perilaku manusia yang melihat produk, kemudian beralih ke hal lain.
Rotasi proxy untuk distribusi beban
Bahkan dengan jeda yang benar, satu IP tidak akan mampu menahan beban lama. Solusinya adalah rotasi proxy: distribusi permintaan antara banyak alamat IP. Ini adalah dasar dari pem-parsing yang stabil di marketplace.
Jenis proxy untuk mem-parsing marketplace:
| Jenis Proxy | Keuntungan | Kekurangan | Untuk Tugas Apa |
|---|---|---|---|
| Pusat Data | Cepat, murah, stabil | Mudah dikenali, sering ada dalam daftar hitam | Yandex.Market, marketplace kecil |
| Residensial | IP nyata dari pengguna rumah, risiko banned rendah | Lebih mahal, lebih lambat dari pusat data | Wildberries, Ozon, Avito |
| Mobile | IP dari operator seluler, anonimitas maksimum | Paling mahal, kecepatan bervariasi | Menghindari pemblokiran ketat di Avito |
Untuk mem-parsing Wildberries dan Ozon, kami merekomendasikan menggunakan proxy residensial ā mereka memiliki IP dari pengguna rumah nyata, sehingga marketplace tidak dapat membedakannya dari pembeli biasa. Proxy pusat data di sini bekerja dengan buruk: Ozon dan Wildberries memiliki daftar hitam untuk IP tersebut.
Strategi rotasi proxy:
- Rotasi setelah N permintaan. Ganti IP setelah setiap 100-300 permintaan. Ini adalah keseimbangan optimal antara efisiensi dan keamanan.
- Rotasi berdasarkan waktu. Ganti IP setiap 30-60 menit. Cocok untuk sesi pem-parsing yang panjang.
- Sticky sessions. Gunakan satu IP untuk semua permintaan ke satu produk/kategori, lalu ganti. Ini mengurangi kecurigaan.
- Keterikatan geografis. Untuk Avito wajib: mem-parsing iklan Moskow melalui IP Moskow, Kazan ā melalui IP Kazan.
Sebagian besar penyedia proxy residensial menawarkan rotasi otomatis: Anda mendapatkan satu endpoint, dan IP berubah secara otomatis dengan frekuensi yang ditentukan atau setelah setiap permintaan. Ini memudahkan pengaturan parser.
Contoh pengaturan kumpulan proxy dalam Python:
import requests
import random
# Daftar proxy (dapat diunduh dari file)
proxy_list = [
'http://user:pass@proxy1.example.com:8000',
'http://user:pass@proxy2.example.com:8000',
'http://user:pass@proxy3.example.com:8000',
# ... 50-100 proxy lainnya
]
def get_random_proxy():
proxy = random.choice(proxy_list)
return {
'http': proxy,
'https': proxy
}
# Penggunaan
for product_id in product_list:
proxy = get_random_proxy() # Proxy acak untuk setiap permintaan
response = requests.get(url, proxies=proxy)
# Pemrosesan...
Pengaturan header dan fingerprint untuk meniru browser
Marketplace menganalisis tidak hanya IP dan frekuensi permintaan, tetapi juga header HTTP. Jika parser Anda mengirim permintaan dengan header default dari pustaka (misalnya, python-requests/2.28.0), ia segera dikenali sebagai bot.
Header wajib untuk meniru browser:
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Language': 'ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7',
'Accept-Encoding': 'gzip, deflate, br',
'DNT': '1',
'Connection': 'keep-alive',
'Upgrade-Insecure-Requests': '1',
'Sec-Fetch-Dest': 'document',
'Sec-Fetch-Mode': 'navigate',
'Sec-Fetch-Site': 'none',
'Cache-Control': 'max-age=0',
'Referer': 'https://www.google.com/'
}
Poin penting:
- User-Agent harus sesuai dengan browser nyata. Gunakan versi terbaru dari Chrome, Firefox, Safari. Ganti User-Agent setiap 100-200 permintaan.
- Accept-Language harus sesuai dengan geografi proxy. Jika menggunakan IP Rusia ā gunakan ru-RU, untuk IP Ukraina ā gunakan uk-UA.
- Referer menunjukkan dari mana pengguna datang. Untuk permintaan pertama gunakan Google/Yandex, untuk permintaan berikutnya ā halaman internal marketplace.
- Header Sec-Fetch-* menambah realisme. Browser modern mengirimkannya secara otomatis.
TLS Fingerprinting: Sistem perlindungan yang canggih (Ozon, Wildberries) menganalisis parameter koneksi TLS: urutan cipher suites, ekstensi, versi protokol. Pustaka standar Python/Node.js memiliki fingerprint yang berbeda dari browser.
Solusinya adalah menggunakan pustaka khusus:
- curl-impersonate (Python) ā meniru TLS fingerprint Chrome/Firefox
- tls-client (Go, binding Python) ā TLS fingerprint yang dapat disesuaikan
- Playwright / Puppeteer ā browser headless dengan TLS nyata
Untuk sebagian besar tugas pem-parsing marketplace, cukup dengan header HTTP yang benar dan proxy residensial. TLS fingerprinting kritis hanya saat bekerja dengan API yang paling dilindungi.
API vs web scraping: mana yang lebih aman untuk mem-parsing
Marketplace memiliki dua cara untuk mendapatkan data: API resmi dan pem-parsing halaman HTML (web scraping). Mana yang harus dipilih untuk bekerja stabil?
| Parameter | API Resmi | Web Scraping |
|---|---|---|
| Legalitas | ā Diizinkan, ada dokumentasi | ā ļø Zona abu-abu, dapat melanggar ToS |
| Kestabilan | ā Struktur data yang stabil | ā Rusak saat redesign situs |
| Batasan | ā ļø Batasan resmi yang ketat | ā ļø Tidak resmi, tetapi ada perlindungan |
| Akses ke Data | ā ļø Tidak semua data tersedia | ā Semua data publik |
| Kecepatan | ā Respon JSON yang cepat | ā Lebih lambat karena HTML |
| Biaya | ā ļø Sering kali berbayar | ā Gratis (hanya proxy) |
Rekomendasi pemilihan:
- Gunakan API resmi jika: Anda memerlukan volume data kecil (hingga 10.000 produk per hari), Anda bersedia membayar untuk akses, legalitas dan stabilitas penting.
- Gunakan web scraping jika: Anda memerlukan volume data besar, API resmi tidak menyediakan informasi yang diperlukan (misalnya, harga pesaing), anggaran terbatas.
Pendekatan hibrida: Banyak pem-parsing profesional mengombinasikan kedua metode. Misalnya, mendapatkan daftar produk melalui API (cepat dan legal), dan informasi detail tentang harga dan stok diambil dari halaman HTML (lebih banyak data).
API internal marketplace: Selain API resmi, marketplace menggunakan API internal untuk operasi situs. Misalnya, Wildberries memuat data produk melalui https://card.wb.ru/cards/detail. Endpoint ini tidak terdokumentasi, tetapi bekerja lebih cepat daripada pem-parsing HTML. Kekurangan ā dapat berubah tanpa pemberitahuan.
Pengaturan parser dan alat populer
Sebagian besar penjual dan pemasar menggunakan alat siap pakai untuk mem-parsing marketplace. Mari kita lihat bagaimana mengatur proxy dan batasan dengan benar dalam solusi populer.
Pengaturan Scrapy (framework Python)
Scrapy adalah framework populer untuk web scraping. Untuk bekerja dengan marketplace, tambahkan ke settings.py:
# Jeda antara permintaan
DOWNLOAD_DELAY = 3 # 3 detik
RANDOMIZE_DOWNLOAD_DELAY = True # Acak dari 0.5*DELAY hingga 1.5*DELAY
# Batasan permintaan bersamaan
CONCURRENT_REQUESTS = 8
CONCURRENT_REQUESTS_PER_DOMAIN = 2
# Pengaturan proxy (melalui middleware rotating-proxies)
ROTATING_PROXY_LIST = [
'http://user:pass@proxy1.example.com:8000',
'http://user:pass@proxy2.example.com:8000',
# ... daftar proxy
]
# Rotasi User-Agent
USER_AGENT_LIST = [
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) Safari/537.36',
# ... daftar User-Agent
]
# Upaya ulang saat terjadi kesalahan
RETRY_TIMES = 3
RETRY_HTTP_CODES = [429, 500, 502, 503, 504]
Pengaturan Octoparse (parser visual tanpa kode)
Octoparse adalah alat populer untuk pem-parsing tanpa pemrograman. Pengaturan proxy dan batasan:
- Buka Pengaturan Tugas ā Opsi Lanjutan
- Di bagian "Jaringan" aktifkan "Gunakan Server Proxy"
- Tambahkan daftar proxy dalam format
IP:PORT:USER:PASS - Aktifkan "Rotasi IP untuk setiap permintaan" untuk rotasi otomatis
- Di bagian "Kecepatan" atur "Lambat" atau "Kustom" dengan jeda 3-5 detik
- Aktifkan "Jeda acak" untuk meniru perilaku manusia
Pengaturan Selenium (otomatisasi browser)
Selenium mengendalikan browser nyata, sehingga dapat melewati banyak perlindungan. Contoh pengaturan dengan proxy:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time
import random
# Pengaturan Chrome dengan proxy
chrome_options = Options()
chrome_options.add_argument('--proxy-server=http://user:pass@proxy.example.com:8000')
chrome_options.add_argument('--disable-blink-features=AutomationControlled')
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
chrome_options.add_experimental_option('useAutomationExtension', False)
driver = webdriver.Chrome(options=chrome_options)
# Menyembunyikan WebDriver
driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")
# Pem-parsing dengan jeda
urls = ['https://www.wildberries.ru/catalog/...', ...]
for url in urls:
driver.get(url)
# Jeda acak 3-7 detik
time.sleep(random.uniform(3, 7))
# Scroll untuk meniru pembacaan
driver.execute_script("window.scrollTo(0, document.body.scrollHeight/2);")
time.sleep(random.uniform(1, 3))
# Pem-parsing data
# ...
Layanan pem-parsing marketplace siap pakai
Jika Anda tidak ingin mengatur parser sendiri, gunakan layanan khusus:
- Mpstats.io ā analitik Wildberries dan Ozon, pemantauan otomatis harga dan penjualan
- SellerFox ā pemantauan pesaing di marketplace, pelacakan stok
- Moneyplace ā pem-parsing Avito, penempatan iklan otomatis
- Parsehub ā parser visual untuk situs mana pun, termasuk marketplace
Layanan ini sudah mengatur proxy, batasan, dan cara menghindari perlindungan ā Anda hanya perlu menunjukkan apa yang ingin diparsing. Kekurangan ā langganan bulanan mulai dari 2000ā½.
Pemantauan pemblokiran dan reaksi otomatis
Bahkan dengan pengaturan yang benar, pemblokiran mungkin terjadi: marketplace memperbarui perlindungan, proxy masuk daftar hitam, batasan berubah. Penting untuk memantau masalah dan bereaksi secara otomatis.
Tanda-tanda pemblokiran yang perlu dipantau:
- HTTP 429 (Terlalu Banyak Permintaan) ā batas permintaan terlampaui, perlu jeda atau ganti IP
- HTTP 403 (Terlarang) ā IP diblokir, perlu rotasi proxy segera
- HTTP 503 (Layanan Tidak Tersedia) ā kelebihan beban sementara atau perlindungan dari DDoS
- Captcha dalam respons ā otomatisasi terdeteksi, perlu mengurangi aktivitas
- Respons kosong atau pengalihan ke halaman utama ā pemblokiran lembut
- Peningkatan tajam dalam waktu respons ā mungkin ada rate limiting di sisi server
Reaksi otomatis terhadap pemblokiran (contoh dalam Python):
import requests
import time
from datetime import datetime
class SmartParser:
def __init__(self, proxy_list):
self.proxy_list = proxy_list
self.current_proxy_index = 0
self.request_count = 0
self.blocked_proxies = set()
def get_next_proxy(self):
# Lewati proxy yang diblokir
while self.current_proxy_index in self.blocked_proxies:
self.current_proxy_index = (self.current_proxy_index + 1) % len(self.proxy_list)
proxy = self.proxy_list[self.current_proxy_index]
return {'http': proxy, 'https': proxy}
def rotate_proxy(self):
self.current_proxy_index = (self.current_proxy_index + 1) % len(self.proxy_list)
self.request_count = 0
def make_request(self, url):
max_retries = 3
for attempt in range(max_retries):
try:
proxy = self.get_next_proxy()
response = requests.get(url, proxies=proxy, timeout=10)
# Pemeriksaan pemblokiran
if response.status_code == 429:
print(f"[{datetime.now()}] Batas kecepatan! Jeda 60 detik...")
time.sleep(60)
self.rotate_proxy()
continue
elif response.status_code == 403:
print(f"[{datetime.now()}] IP diblokir! Rotasi proxy...")
self.blocked_proxies.add(self.current_proxy_index)
self.rotate_proxy()
continue
elif response.status_code == 503:
print(f"[{datetime.now()}] Server kelebihan beban. Jeda 120 detik...")
time.sleep(120)
continue
# Permintaan berhasil
self.request_count += 1
# Rotasi setelah 200 permintaan
if self.request_count >= 200:
self.rotate_proxy()
time.sleep(10) # Jeda setelah rotasi
return response
except requests.exceptions.Timeout:
print(f"[{datetime.now()}] Timeout. Upaya {attempt + 1}/{max_retries}")
time.sleep(5)
return None # Semua upaya telah habis
Logging dan alert: Atur pemberitahuan untuk kejadian kritis. Misalnya, kirim pesan di Telegram ketika:
- Lebih dari 30% proxy dari kumpulan diblokir
- Persentase permintaan yang berhasil turun di bawah 80%
- Parser tidak mendapatkan data lebih dari 30 menit
- Captcha terdeteksi dalam respons
Metrik untuk pemantauan:
- Tingkat keberhasilan ā persentase permintaan yang berhasil (harus >90%)
- Waktu respons rata-rata ā waktu respons rata-rata (peningkatan dapat menunjukkan masalah)
- Permintaan per jam ā jumlah permintaan per jam untuk setiap proxy
- Kesehatan proxy ā persentase proxy yang berfungsi dalam kumpulan
- Tingkat pemblokiran ā frekuensi pemblokiran (harus <5%)
Gunakan dasbor untuk memvisualisasikan metrik: Grafana, Datadog, atau Google Sheets sederhana dengan pembaruan otomatis melalui API.
Kesimpulan
Pemblokiran saat mem-parsing marketplace bukanlah halangan, tetapi tantangan yang dapat diselesaikan dengan pengaturan alat yang tepat. Poin kunci untuk bekerja stabil tanpa banned:
- Gunakan proxy residensial untuk Wildberries, Ozon, dan Avito ā proxy pusat data tidak berfungsi di sini
- Atur jeda acak 2-5 detik antara permintaan
- Rotasi IP setelah setiap 150-300 permintaan atau setiap 30-60 menit
- Gunakan header HTTP yang realistis dengan User-Agent yang relevan
- Pantau pemblokiran dan bereaksi secara otomatis terhadapnya
- Untuk Avito, keterikatan geografis IP pada kota iklan adalah wajib
Parser yang diatur dengan benar dengan proxy berkualitas dapat beroperasi selama berbulan-bulan tanpa satu pun pemblokiran, mengumpulkan puluhan ribu produk setiap hari. Yang terpenting ā jangan terburu-buru untuk kecepatan, tetapi tiru perilaku pengguna biasa.
Jika Anda berencana untuk secara teratur mem-parsing Wildberries, Ozon, atau Avito, kami merekomendasikan menggunakan proxy residensial dengan rotasi otomatis ā mereka memberikan stabilitas maksimum dan risiko pemblokiran minimal. Untuk tugas yang memerlukan IP seluler (misalnya, menghindari pemblokiran ketat di Avito), proxy seluler dengan IP dari operator Rusia akan sangat cocok.