2026'da Ölçekli Shein Scraping: API vs HTML Yaklaşımı
2026'da ölçekli Shein scraping, perakende fiyat zekası ve moda pazar analizi yapan ekipler için günlük operasyonun temelidir. Shein kataloğu milyonlarca SKU içerir; fiyatlar ve stok seviyeleri saatlik değişebilir. Bu veriyi elde etmek için iki ana yol vardır: tarayıcıda render edilmiş HTML'i parse etmek veya Shein'in dahili JSON API uç noktalarını doğrudan çağırmak.
HTML parse yaklaşımı, requests + BeautifulSoup ile başlasa da Shein'in React tabanlı sayfaları istemci tarafında render ettiği için ham HTML genelde boş skeleton döner. Ürün verisi window.productIntroData veya gbProductDetail gibi inline JSON blob'ları içinde gömülüdür. API yaklaşımında ise /api/productInfo ve ürün listesi uç noktaları doğrudan JSON döndürür — HTML parse etmekten daha verimlidir ama Akamai'nin bot koruması bu uç noktaları da korur.
| Yaklaşım | Avantaj | Dezavantaj | Verim |
|---|---|---|---|
| HTML Parse | Tüm sayfa verisi tek istekte | Ağır, render bekleme, kırılgan CSS/XPath | ~200ms/istek |
| JSON API | Hafif, yapılandırılmış, hızlı | Akamai koruması, parametre keşfi gerek | ~80ms/istek |
| Headless Browser | En eksiksiz render | Yavaş, pahalı, TLS fingerprint riski | ~2000ms/istek |
Pratik tavsiye: JSON API uç noktalarını birincil veri kaynağı olarak kullanın, HTML parse'i yedek olarak tutun. Aşağıda her iki yaklaşım için de somut örnekler bulacaksınız.
Shein'in Anti-Bot Stack'i: Akamai Bot Manager
Shein, Akamai Bot Manager kullanarak otomatik trafiği filtreler. Bu sistem üç ana bileşenden oluşur:
- _abck cookie: Akamai'nin imza çerezi. Tarayıcı tarafından sensor_data telemetry gönderildikten sonra set edilir; geçerli bir _abck olmadan API uç noktaları 403 veya 412 döndürür.
- bm_sz: Bot yönetimi oturum token'ı. _abck ile birlikte çalışır ve istek desenini izler.
- smdeviceid: Shein'in cihaz tanımlama token'ı. Tarayıcı fingerprint'ı ve davranışsal telemetri ile üretilir.
Akamai'nin sensor_data'si, tarayıcının canvas render, WebGL parametreleri, font listesi, ekran çözünürlüğü ve zamanlama verilerini içeren bir JavaScript telemetry paketidir. Standart requests kütüphanesi veya sıradan headless Chrome bu paketi üretemez — bu nedenle tek başına headless Chrome bile Akamai tarafından engellenir.
HTTP 412 Precondition Failed status kodu, Akamai'nin bot korumasının en yaygın işaretidir. Bu kodu aldığınızda _abck cookie'sinin yenilenmesi gerekir.
Neden curl_cffi?
curl_cffi, Python'da TLS/JA3 fingerprint'ini gerçek Chrome ile eşleştiren bir kütüphanedir. Bu, Akamai'nin TLS tabanlı bot tespitini atlatmak için kritiktir. Standart requests veya httpx kütüphaneleri Python'un TLS stack'ini kullanır ve JA3 fingerprint'i Chrome'dan farklıdır — Akamai bunu anında algılar.
Veri Konumu: JSON Blob'ları ve Kategori Feed Uç Noktaları
Shein ürün sayfalarında veri iki ana yerde bulunur:
1. Ürün Detay Sayfası
HTML içinde gömülü JSON blob'ları:
<script>
window.productIntroData = {
"goods_id": "12345678",
"goods_name": "Mock Neck Ribbed Top",
"retailPrice": { "amount": "12.99", "amountWithSymbol": "$12.99" },
"salePrice": { "amount": "9.99", "amountWithSymbol": "$9.99" },
"stock": 1240,
"sku_list": [
{ "sku_code": "12345678-1", "stock": 320, "size": "S", "color": "Black" },
{ "sku_code": "12345678-2", "stock": 280, "size": "M", "color": "Black" }
]
};
</script>
İlgili CSS/XPath selector'ları:
//script[contains(text(), 'productIntroData')]— ürün verisi JSON blobdiv.product-intro__head-price— fiyat display element[data-sku-code]— SKU varyasyon attribute
2. Kategori/Listeleme Uç Noktaları
Shein'in kategori feed API'si goods_id ve cat_id parametreleri ile çalışır:
GET https://www.shein.com/Women-Dresses-c-1727.html
?cat_id=1727
&page=1
&page_size=40
&sort=7
&_ver=1.0.8
Bu uç nokta, ürün listesi JSON'ı döndürür. Her ürün için goods_id, goods_name, retailPrice, salePrice ve stock alanlarını içerir. cat_id parametresi kategoriyi belirler — örneğin 1727 kadın elbiselerdir.
Rate Limitler ve Coğrafi Hedefleme
Shein, IP başına yaklaşık 50 istek/dakika rate limit uygular. Bu sınırı aşan IP'ler Akamai tarafından geçici olarak engellenir — tipik olarak 10-30 dakika süreyle. 100 eşzamanlı oturumla çalışırken bu, dakikada yalnızca 5,000 istek anlamına gelir; milyonlarca SKU için yetersizdir.
Shein ayrıca coğrafi lokasyona göre fiyat, para birimi ve stok durumunu lokalize eder. ABD IP'si ile erişilen bir ürün $12.99 olarak gösterilirken, Alman IP'si ile aynı ürün €11.99 olarak görünebilir — ve stok seviyaları bölgesel depolar arasında farklılık gösterir.
Bu nedenle rotasyonlu residential proxy'ler ve coğrafi hedefleme zorunludur:
# ABD fiyatları için
http://user-country-US:pass@gate.proxyhat.com:8080
# Almanya fiyatları için
http://user-country-DE:pass@gate.proxyhat.com:8080
# Şehir seviyesi hedefleme
http://user-country-DE-city-berlin:pass@gate.proxyhat.com:8080
ProxyHat'ın proxy lokasyonları 190+ ülkeyi kapsar ve her IP gerçek ISP kaynağından gelir — bu, Akamai'nin datacenter IP tespitini atlatmak için gereklidir. Fiyatlandırma sayfası'nda residential proxy maliyetlerini inceleyebilirsiniz.
Python ile Pratik Uygulama: curl_cffi + ProxyHat
Aşağıdaki örnek, curl_cffi ile TLS fingerprint eşleştirme ve ProxyHat residential proxy rotasyonu kullanarak Shein ürün detay verisi çeker:
from curl_cffi import requests
import json
# ProxyHat residential proxy - ABD coğrafi hedefleme
proxy_url = "http://user-country-US:pass@gate.proxyhat.com:8080"
proxies = {"http": proxy_url, "https": proxy_url}
# Chrome 120 JA3 fingerprint ile istek
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": "application/json, text/plain, */*",
"Accept-Language": "en-US,en;q=0.9",
"Referer": "https://www.shein.com/",
}
# Kategori feed API'si
url = "https://www.shein.com/api/productInfo"
params = {"goods_id": "12345678", "_ver": "1.0.8"}
response = requests.get(
url,
params=params,
headers=headers,
proxies=proxies,
impersonate="chrome120",
timeout=15
)
if response.status_code == 200:
data = response.json()
product = {
"goods_id": data.get("goods_id"),
"name": data.get("goods_name"),
"retailPrice": data.get("retailPrice", {}).get("amount"),
"salePrice": data.get("salePrice", {}).get("amount"),
"stock": data.get("stock"),
}
print(json.dumps(product, indent=2))
elif response.status_code == 412:
print("Akamai challenge detected — refresh _abck cookie")
else:
print(f"Error: {response.status_code}")
Örnek truncate edilmiş yanıt:
{
"goods_id": "12345678",
"name": "Mock Neck Ribbed Top",
"retailPrice": "12.99",
"salePrice": "9.99",
"stock": 1240
}
Bu yaklaşım dakikada ~80ms/istek hızında çalışır ve ProxyHat'ın residential proxy havuzu sayesinde IP başına 50 istek/dakika limitini aşarak ölçeklenir. Web scraping kullanım senaryosu sayfamızda daha fazla örnek bulabilirsiniz.
Sayfalama, Sticky Session ve Backoff Stratejileri
Sayfalama
Shein kategori feed'leri page ve page_size parametreleri ile sayfalanır. Tipik bir kategori 500-2000 ürün içerir; page_size=40 ile 13-50 sayfa gerekir:
import time
from curl_cffi import requests
proxy_url = "http://user-country-US:pass@gate.proxyhat.com:8080"
proxies = {"http": proxy_url, "https": proxy_url}
all_products = []
page = 1
max_pages = 50
while page <= max_pages:
url = "https://www.shein.com/Women-Dresses-c-1727.html"
params = {
"cat_id": "1727",
"page": page,
"page_size": 40,
"sort": "7",
"_ver": "1.0.8"
}
response = requests.get(
url, params=params, proxies=proxies,
impersonate="chrome120", timeout=15
)
if response.status_code == 412:
print(f"412 on page {page} — backing off 30s")
time.sleep(30)
continue # retry same page
if response.status_code != 200:
print(f"Error {response.status_code} on page {page}")
break
data = response.json()
products = data.get("products", [])
if not products:
break # no more pages
all_products.extend(products)
print(f"Page {page}: {len(products)} products")
page += 1
time.sleep(1.2) # polite delay
Sticky Session ile Para Birimi Tutarlılığı
Bir scraping oturumu boyunca aynı IP'yi kullanmak, para birimi ve fiyat tutarlılığı için kritiktir. ProxyHat'ın -session- flag'i bunu sağlar:
# Sticky session — 10 dakika boyunca aynı IP
proxy_url = "http://user-country-US-session-shein001:pass@gate.proxyhat.com:8080"
# Farklı oturum = farklı IP
proxy_url_2 = "http://user-country-US-session-shein002:pass@gate.proxyhat.com:8080"
Sticky session'lar, bir ürün sayfasından sepete kadar olan akışta aynı IP'nin kullanılmasını sağlar — bu, Akamai'nin davranışsal analizini geçmek için önemlidir. SERP tracking senaryosunda da benzer session tutarlılığı gerekir.
412 / _abck Yenileme Mantığı
Akamai 412 döndürdüğünde, mevcut _abck cookie artık geçersizdir. Çözüm:
- 30 saniye bekleyin (backoff).
- Yeni bir ProxyHat IP'sine geçin (yeni session ID).
- Tarayıcı benzeri bir ana sayfa isteği ile yeni _abck cookie alın.
- API isteğini yeni cookie ile tekrarlayın.
def fetch_with_retry(url, params, max_retries=3):
for attempt in range(max_retries):
session_id = f"shein-{attempt}-{int(time.time())}"
proxy = f"http://user-country-US-session-{session_id}:pass@gate.proxyhat.com:8080"
proxies = {"http": proxy, "https": proxy}
# Önce ana sayfayı ziyaret et — _abck al
requests.get("https://www.shein.com/",
proxies=proxies, impersonate="chrome120", timeout=15)
time.sleep(2)
# API isteği
resp = requests.get(url, params=params, proxies=proxies,
impersonate="chrome120", timeout=15)
if resp.status_code == 200:
return resp.json()
elif resp.status_code == 412:
time.sleep(30 * (attempt + 1)) # exponential backoff
else:
time.sleep(5)
return None
Etik ve Yasal Açıklamalar
Shein scraping yaparken şu sınırlara dikkat edin:
- Yalnızca herkese açık ürün verisi: Fiyat, stok, ürün adı gibi public katalog verisi çekin. Kullanıcı hesaplarına, checkout akışına veya kişisel verilere erişmeyin.
- CFAA ve GDPR: ABD'de Computer Fraud and Abuse Act (CFAA), yetkisiz erişimi yasaklar. GDPR kapsamında kişisel veri işlemek açık rıza gerektirir. Ürün verisi kişisel veri değildir ama erişim yöntemi ToS ihlali olabilir.
- robots.txt ve ToS: Shein'in robots.txt dosyasını kontrol edin. ToS scraping'i yasaklıyorsa, risk değerlendirmesi yapın.
- Affiliate feed alternatifi: Eğer ihtiyacınız düzenli ürün verisi güncellemesi ise, Shein'in affiliate program'ı resmi bir API/feed sağlayabilir. Bu, scraping'den daha sürdürülebilir bir yol olabilir.
Önemli: Bu rehber eğitim amaçlıdır. Herhangi bir scraping aktivitesinden önce hukuk danışmanınıza başvurun. ProxyHat, scraping aktivitelerinizin yasal uyumluluğundan sorumlu değildir.
Önemli Çıkarımlar
- JSON API uç noktaları HTML parse'den 2.5× daha hızlıdır (~80ms vs ~200ms) ama Akamai koruması altındadır.
curl_cffiile Chrome TLS fingerprint eşleştirme, Akamai'nin JA3 tabanlı tespitini atlatmak için gereklidir.- IP başına ~50 istek/dakika limiti, rotasyonlu residential proxy kullanımını zorunlu kılar.
- Coğrafi hedefleme (
-country-US,-country-DE) para birimi ve stok doğruluğu için kritiktir. - Sticky session'lar (
-session-flag) para birimi tutarlılığı ve davranışsal analiz geçişi için kullanın. - 412 aldığınızda exponential backoff + yeni session ID + ana sayfa ziyareti stratejisini uygulayın.
- Resmi affiliate feed, uzun vadeli veri ihtiyaçları için scraping'den daha güvenli olabilir.
ProxyHat ile scraping altyapınızı ölçeklendirmek için dokümantasyonumuzu inceleyebilir veya fiyatlandırma sayfamızdan başlayabilirsiniz.






