2026'da Temu Ürün ve Fiyat Verilerini Kazımak: API mi HTML mi?
Temu, PDD Holdings'in hızla büyüyan e-ticaret platformu olarak 2026'da hâlâ resmi bir public API sunmuyor. E-ticaret veri mühendisleri ve fiyat-zekâsı ekipleri için bu, iki temel yola işaret eder: ya volatil HTML ürün kartlarını parse edeceksiniz ya da sayfanın arkasındaki dahili JSON endpoint'lerini hedefleyeceksiniz. Temu ürün ve fiyat verilerini kazımak istiyorsanız, bu iki yaklaşım arasındaki dengeyi doğru kurmak başarı oranınızı belirler.
HTML scraping, sayfa yapısındaki değişikliklerden anında etkilenir; hashed CSS class'ları her deploy'da değişebilir. Öte yandan, /api/poppy/v1/search ve goods-detail gibi dahili JSON endpoint'leri daha kararlı veri döner ama daha agresif anti-bot korumasına tabidir. Pratik deneyim: JSON endpoint'leri daha az bandwidth tüketir ve daha temiz yapılandırılmış veri verir, ama erişim için TLS fingerprinting ve imzalı header'ları çözmeniz gerekir.
Bu rehberde, bir Temu price scraper'ı sıfırdan kurmanız için gereken her şeyi ele alacağız: anti-bot stack'i, veri lokasyonu, rate-limit eşikleri, ProxyHat ile residential proxy kurulumu, Python kod örnekleri ve etik sınırlar.
Temu'nun Anti-Bot Stack'i: Cloudflare, Signed Tokens ve TLS Fingerprinting
Temu, Cloudflare Turnstile ve katmanlı bir anti-bot sistemi kullanır. Bu sistem sadece IP'yi değil, istemci fingerprint'ini de kontrol eder. Üç ana savunma hattı şunlardır:
- Cloudflare Turnstile & Bot Management: JavaScript challenge'ları ve davranışsal analiz ile otomatik trafiği filtreler. Datacenter IP'leri anında işaretlenir.
- İmzalı
anti_contentheader/token: Temu'nun dahili API'leri, istekle birlikte gönderilen bir imzalı token gerektirir. Bu token, tarayıcıda JavaScript ile üretilir ve istek bütünlüğünü doğrular. Token olmadan veya geçersiz token ile API419veya403döner. - TLS/HTTP2 fingerprinting: JA3/JA4 ve HTTP/2 fingerprint imzaları, standart
requestskütüphanesini anında tanır. Python'unurllib3'ü gerçek tarayıcıdan farklı bir TLS el sıkışması yapar ve bu fark algılanır.
Bu üç katman, datacenter proxy'leri ile Temu'ya erişmeyi neredeyse imkânsız kılar. Cloudflare'in bot skorlama modeli, ASN bilgisini kullanır ve datacenter ASN'lerini (örneğin AWS, DigitalOcean, Hetzner) otomatik olarak yüksek risk olarak sınıflandırır. Bu nedenle residential proxy'ler bir lüks değil, bir gerekliliktir.
Veriyi Lokalize Etmek: __NEXT_DATA__, JSON Endpoint'leri ve Hashed CSS
Dahili JSON Endpoint'leri
Temu'nun ürün listeleme ve detay sayfaları, arka planda JSON API'lerine dayanır. Tarayıcı DevTools'ta Network sekmesini açıp XHR/Fetch filtresi uyguladığınızda şu endpoint'leri görürsünüz:
# Arama sonuçları
POST https://www.temu.com/api/poppy/v1/search
# Ürün detayı
POST https://www.temu.com/api/poppy/v1/goods/detail
# Yorumlar
POST https://www.temu.com/api/poppy/v1/review/search
Bu endpoint'ler POST metodu kullanır ve body'de JSON payload gönderir. Yanıt, doğrudan parse edilebilir JSON döner — HTML parsing'e kıyasla çok daha verimli.
Gömülü State Blob
HTML yaklaşımını tercih ederseniz, sayfa kaynağında gömülü bir state blob bulunur. Temu, Next.js benzeri bir mimari kullanır ve __NEXT_DATA__ tarzı bir script tag içinde tüm ürün verisini JSON olarak gömer:
<script id="__INITIAL_STATE__" type="application/json">
{"goods": {"goods_id": "50293481", ...}}
</script>
Bu blob'u regex veya HTML parser ile çıkarıp json.loads() ile parse edebilirsiniz. Bu yöntem, API'ye ek istek yapmadan ilk sayfa verisini almanızı sağlar.
Hashed CSS ve data-uniqid
HTML kartlarını parse ediyorsanız, CSS class'ların hashed olduğunu unutmayın. _productCard_1a2b3 gibi class'lar her deploy'da değişir. Bunun yerine data-uniqid veya data-goods-id gibi attribute'leri hedefleyin:
# XPath örneği — hashed class'lara güvenmeyin
//div[@data-uniqid and @data-goods-id]
Rate-Limit Eşikleri ve Neden Residential Proxy Zorunlu
Temu'nun rate-limit davranışı agresiftir. Pratik gözlemlere göre:
- Aynı IP'den yaklaşık 50-80 istek/dakika sonrasında
429 Too Many Requestsdöner. - Şüpheli davranış tespit edildiğinde Cloudflare challenge sayfası gelir (
403+ JS challenge). - Tekrarlayan şüpheli isteklerde IP geçici olarak banlanır — genellikle 6-24 saat süreyle.
Daha da önemlisi: Temu'da fiyatlar ve kargo seçenekleri bölgeye göre değişir. Aynı ürün için ABD ve Almanya'da farklı fiyatlar görürsünüz. Bu, coğrafi hedeflemenin sadece anti-bot için değil, veri doğruluğu için de kritik olduğu anlamına gelir.
ProxyHat ile ülke ve şehir seviyesinde geo-targeting yapabilirsiniz:
# ABD, New York çıkışlı residential proxy
http://user-country-US-city-newyork:pass@gate.proxyhat.com:8080
# Almanya, Berlin çıkışlı
http://user-country-DE-city-berlin:pass@gate.proxyhat.com:8080
Datacenter IP'leri Temu'da neredeyse her zaman bloklanır. HTTP 403 yanıtı alıyorsanız, ilk şüphelenmeniz gereken şey IP tipinizdir. Residential proxy'ler, gerçek ISP atamalarından geldiği için Cloudflare'in ASN skorlamasından geçer.
| Proxy Tipi | Temu Başarı Oranı | Anti-Bot Riski | Kullanım Senaryosu |
|---|---|---|---|
| Datacenter | < 5% | Çok Yüksek | Önerilmez |
| Residential (rotating) | 85-92% | Düşük | Arama sonuçları, liste kazıma |
| Residential (sticky) | 90-95% | Düşük | Sepet/kargo tutarlılığı |
| Mobile | 93-97% | Çok Düşük | Yüksek hacimli scraping |
Python ile Temu Kazıma: curl_cffi + ProxyHat
Standart requests kütüphanesi, TLS fingerprint farkı nedeniyle Temu'da anında bloklanır. Bunun yerine curl_cffi kullanın — bu kütüphane, gerçek tarayıcı TLS el sıkışmasını taklit eder.
# Gerekli paketler
# pip install curl_cffi parsel
from curl_cffi import requests as cffi_requests
import json
import re
# ProxyHat residential proxy — ABD çıkışlı
proxy_url = "http://user-country-US:pass@gate.proxyhat.com:8080"
# Chrome TLS fingerprint ile istek
session = cffi_requests.Session(impersonate="chrome")
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/131.0.0.0 Safari/537.36",
"Accept-Language": "en-US,en;q=0.9",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Referer": "https://www.temu.com/",
}
# Ürün sayfasını fetch et
product_url = "https://www.temu.com/products.html?goods_id=50293481"
response = session.get(
product_url,
headers=headers,
proxies={"http": proxy_url, "https": proxy_url},
timeout=30,
)
# Gömülü state blob'u çıkar
match = re.search(
r'<script id="__INITIAL_STATE__"[^>]*>(.*?)</script>',
response.text,
re.DOTALL
)
if match:
state = json.loads(match.group(1))
goods = state.get("goods", {})
print(json.dumps({
"goods_id": goods.get("goods_id"),
"title": goods.get("goods_name"),
"price": goods.get("salePrice", {}).get("min"),
"currency": goods.get("salePrice", {}).get("currencyCode"),
"sku_list": [
{
"sku_id": s.get("skuId"),
"price": s.get("price"),
"stock": s.get("stock"),
}
for s in goods.get("skuList", [])[:3]
],
}, indent=2))
else:
print("State blob bulunamadı — sayfa challenge olabilir")
Örnek çıktı (truncate edilmiş):
{
"goods_id": "50293481",
"title": "Wireless Bluetooth Earbuds Pro Max",
"price": 12.98,
"currency": "USD",
"sku_list": [
{"sku_id": "sku_001", "price": 12.98, "stock": 3421},
{"sku_id": "sku_002", "price": 13.49, "stock": 892},
{"sku_id": "sku_003", "price": 12.98, "stock": 0}
]
}
Bu yaklaşım, Temu product data API'si olmadan bile temel ürün ve fiyat verisini çıkarmanızı sağlar. Daha derin veri için (stok geçmişi, fiyat trendi) /api/poppy/v1/goods/detail endpoint'ini hedeflemeniz gerekir, ancak bu anti_content token'ı gerektirir.
Sticky Session'lar, Retry Stratejisi ve Pagination
Sticky Session'lar
Sepet ve kargo hesaplamaları, oturum bazlıdır. Rotating proxy ile her istekte IP değişirse, Temu farklı bölgelerden gelen istekleri şüpheli bulur ve challenge tetikler. Sticky session kullanarak bir IP'yi belirli bir süre sabit tutun:
# Sticky session — aynı IP 10 dakika boyunca
proxy_url = "http://user-session-temu_batch_001:pass@gate.proxyhat.com:8080"
# Farklı batch'ler için farklı session ID'leri
batch_proxies = [
f"http://user-session-temu_batch_{i:03d}:pass@gate.proxyhat.com:8080"
for i in range(1, 11)
]
Retry Stratejisi
Üstel geri çekilme (exponential backoff) ile retry yapın. 429 ve 403 yanıtlarında bekleme süresini artırın:
import time
import random
def fetch_with_retry(url, session, proxy, max_retries=4):
for attempt in range(max_retries):
try:
resp = session.get(
url,
proxies={"http": proxy, "https": proxy},
timeout=30,
)
if resp.status_code == 200:
return resp
elif resp.status_code in (429, 403):
wait = (2 ** attempt) + random.uniform(0, 2)
print(f"{resp.status_code} — {wait:.1f}s bekleniyor")
time.sleep(wait)
else:
print(f"HTTP {resp.status_code}")
return resp
except Exception as e:
wait = (2 ** attempt) + random.uniform(0, 1)
print(f"Hata: {e} — {wait:.1f}s")
time.sleep(wait)
return None
Pagination
Temu arama sonuçları, page ve pageSize parametreleri ile sayfalama yapar. Her sayfa için yeni bir sticky session kullanın veya en azından 2-3 saniye bekleme ekleyin. 50 sayfadan fazla kazıma yapıyorsanız, session havuzunu genişletin:
# Pagination örneği
total_pages = 20
for page in range(1, total_pages + 1):
session_id = f"temu_search_p{page:03d}"
proxy = f"http://user-session-{session_id}:pass@gate.proxyhat.com:8080"
search_url = f"https://www.temu.com/search_result.html?q=earbuds&page={page}"
resp = fetch_with_retry(search_url, session, proxy)
if resp and resp.status_code == 200:
parse_products(resp.text)
time.sleep(random.uniform(2.5, 4.0)) # İnsan benzeri bekleme
Etik ve Yasal Sınırlar
Temu'yu kazırken etik sınırlara uymak zorunludur. İşte temel prensipler:
- Sadece public katalog verisini kazıyın. Ürün adı, fiyat, stok, görsel URL'leri — bunlar herkese açık verilerdir.
- Hesap scraping yapmayın. Kullanıcı profilleri, sipariş geçmişi, kişisel veriler kesinlikle off-limits.
robots.txt'yi kontrol edin. Temu'nun robots.txt dosyası, bazı yolları açıkça disallow eder. Bu kurallara saygı gösterin.- Hız sınırlarına uyun. Saniyede 10+ istek göndermek, hem sizin hem diğer kullanıcıların deneyimini etkiler.
- CFAA ve GDPR: ABD'de Computer Fraud and Abuse Act, yetkisiz erişimi yasaklar. AB'de GDPR, kişisel verilerin işlenmesini düzenler. Sadece public, anonim veriyle çalışın.
Eğer reski bir merchant'sanız, Temu Merchant Feed API'sini kullanmak her zaman scraping'ten daha güvenlidir. Bu API, merchant dashboard'undan erişilebilir ve ürün/fiyat verisini yapılandırılmış biçimde sunar. Scraping, yalnızca rakip fiyat zekâsı için bir seçenek olmalıdır.
Pratik tavsiye: Eğer sadece kendi mağazanızın verisine ihtiyacınız varsa, resmi feed'i kullanın. Rakip fiyat karşılaştırması için scraping yapın, ama düşük hızda ve etik sınırlar içinde.
ProxyHat Kurulumu ve İç Bağlantılar
ProxyHat ile Temu scraping'i kurmak için resmi dokümantasyonu inceleyebilirsiniz. Temel adımlar:
- ProxyHat pricing sayfasından residential proxy paketinizi seçin.
- Dashboard'dan username ve password'unuzu alın.
- Geo-targeting parametrelerini username'e ekleyin:
user-country-USveyauser-country-DE-city-berlin. - Sticky session için
user-session-{id}formatını kullanın. - ProxyHat locations sayfasından mevcut ülkeleri kontrol edin.
Daha fazla scraping rehberi için web scraping use case sayfamızı ve SERP tracking rehberimizi inceleyin.
Key Takeaways
- Temu'nun public API'si yok — HTML state blob veya dahili
/api/poppy/v1JSON endpoint'leri hedeflenir. - Cloudflare Turnstile, imzalı
anti_contenttoken ve TLS fingerprinting, datacenter IP'leri anında bloklar. curl_cffiile Chrome TLS fingerprint taklit edilir; standartrequestsyetersizdir.- Residential proxy'ler zorunludur — ülke ve şehir seviyesinde geo-targeting fiyat doğruluğu için kritiktir.
- Sticky session'lar (
-session-) sepet ve kargo tutarlılığı için kullanılır. - 50-80 istek/dakika'dan sonra rate-limit tetiklenir; üstel backoff ile retry yapın.
- Sadece public katalog verisini kazıyın; hesap ve kişisel verilerden uzak durun.
SSS
Temu ürün ve fiyat verilerini kazımak nedir?
Temu ürün ve fiyat verilerini kazımak, e-ticaret platformundaki public ürün katalogundan ürün adı, fiyat, stok ve SKU bilgilerini otomatik olarak çekme işlemidir. Temu'nun resmi public API'si olmadığı için, veri HTML parsing veya dahili JSON endpoint'leri üzerinden elde edilir.
Proxy kullanıcıları için neden önemlidir?
Temu, Cloudflare ve TLS fingerprinting ile agresif anti-bot koruması uygular. Datacenter IP'leri anında bloklanır. Residential proxy'ler, gerçek ISP atamalarından geldiği için bu korumalardan geçebilir ve bölgesel fiyat farklılıklarını doğru şekilde yakalayabilir.
Hangi proxy tipi en iyisi?
Residential proxy'ler, Temu scraping için en iyi sonucu verir. Ülke ve şehir seviyesinde geo-targeting destekledikleri için hem anti-bot korumasını aşar hem de bölgesel fiyat doğruluğunu sağlar. Mobile proxy'ler daha yüksek başarı oranı sunar ama maliyetleri daha yüksektir. Datacenter proxy'ler ise Temu'da neredeyse hiç çalışmaz.
Blokları nasıl önlersiniz?
Blokları önlemek için: (1) curl_cffi ile tarayıcı TLS fingerprint taklit edin, (2) residential proxy ile ülke/şehir geo-targeting yapın, (3) dakikada 50 istek altında kalın, (4) sticky session kullanarak IP tutarlılığı sağlayın, (5) üstel backoff ile retry yapın, (6) her istek arasında 2-4 saniye insan benzeri bekleme ekleyin.






