كيفية استخراج بيانات وأسعار منتجات Temu في 2026: المفاضلة بين API وHTML
كيفية استخراج بيانات وأسعار منتجات Temu في 2026 سؤال يواجهه كل فريق ذكاء أسعار تجارة إلكترونية. المنصة لا تقدم واجهة برمجية عامة (Public API) للمطورين الخارجيين، مما يتركك أمام خيارين: تحليل بطاقات HTML المتقلبة في صفحات المنتجات، أو استهداف نقاط النهاية JSON الداخلية مثل /api/poppy/v1/search و/api/poppy/v1/goods-detail. كلا المسارين يتطلب بروكسي سكني بمستوى مدينة دقيقة، وإدارة بصمة TLS/HTTP2، وتوقيع رأس anti_content الذي يعتبره المهندسون أصعب جزء في العملية.
في هذا الدليل، سنغطي البنية الفعلية لمكافحة البوتات في Temu، وكيفية تحديد موقع البيانات في الصفحة، وعتبات معدل الطلبات الواقعية، ومثال عملي بلغة Python باستخدام مكتبة curl_cffi مع بروكسي ProxyHat عبر gate.proxyhat.com:8080، وأخيراً الاعتبارات الأخلاقية والقانونية.
السياق التقني: لماذا يوجد هذا التحدي
طبقات الحماية — Cloudflare Turnstile وبصمة TLS
Temu يعتمد على بنية متعددة الطبقات لمكافحة البوتات. الطبقة الأولى هي Cloudflare Turnstile، وهو بديل CAPTCHA الذكي الذي يحلل بصمة المتصفح دون تفاعل صريح من المستخدم. الطبقة الثانية هي توقيع anti_content — معامل مشفر يُولّد في المتصفح عبر JavaScript ويحتوي على بيانات بصمة الجهاز والسلوك. الطبقة الثالثة هي فحص بصمة TLS/HTTP2: خوادم Temu تستطيع التمييز بين عميل حقيقي (Chrome 120 مثلاً) وأداة مثل requests العادية بمجرد فحص ترتيب رؤوس TLS والامتدادات.
هذا يعني أن استخدام requests.get() البسيط أو urllib سيؤدي إلى حظر فوري تقريباً — حتى مع بروكسي سكني. السبب هو أن بصمة TLS في مكتبات Python القياسية لا تتطابق مع أي متصفح حقيقي، وخوادم Cloudflare ترفض الاتصال قبل حتى الوصول إلى منطق Temu.
لماذا تُرفض عناوين مراكز البيانات فوراً
عناوين IP الخاصة بمراكز البيانات (Datacenter IPs) تُرفض في Temu قبل حتى تحميل الصفحة. Cloudflare يحتفظ بقائمة ASN لمراكز البيانات المعروفة (AWS، Google Cloud، DigitalOcean، إلخ) ويطبق مستوى تحقق أعلى على هذه الطلبات. في الاختبارات الميدانية، طلب واحد من IP تابع لـ AWS يؤدي إلى تحدي Turnstile بنسبة تقارب 95% من الطلبات، بينما الطلبات من بروكسي سكني تمر بنجاح في 80-90% من الحالات عند استخدام بصمة متصفح صحيحة.
تحديد موقع البيانات: HTML مقابل نقاط النهاية JSON
هنا يكمن القرار الاستراتيجي. أمامك مساران، ولكل منهما مزايا وعيوب:
| المعيار | تحليل HTML و __NEXT_DATA__ | نقاط نهاية JSON الداخلية |
|---|---|---|
| الاستقرار | منخفض — أسماء الفئات تتغير كل أيام، لكن __NEXT_DATA__ مستقرة نسبياً | متوسط — البنية أكثر استقراراً لكن تتطلب توقيع anti_content صحيح |
| البيانات المتاحة | ما يظهر في الصفحة فقط (يكفي لمعظم حالات مراقبة الأسعار) | بيانات كاملة: SKUs، مخزون، خيارات الشحن، خصائف تفصيلية |
| السرعة | أبطأ — تحليل DOM كبير (200-500KB لكل صفحة) | أسرع — JSON خفيف نسبياً (50-100KB) |
| الصعوبة | أسهل للبدء — BeautifulSoup يكفي | أصعب — يتطلب عكس توقيع anti_content المتجدد |
| معدل الحظر | متوسط — يعتمد على البروكسي والبصمة | أعلى إذا كان التوقيع غير صحيح أو منتهي الصلاحية |
كتلة __NEXT_DATA__ والسمات المخفية
صفحات Temu للمنتجات تحتوي على كتلة JSON مضمّنة في <script id="__NEXT_DATA__" type="application/json">. هذه الكتلة تحتوي على الحالة الكاملة للصفحة: معرف المنتج (goods_id)، السعر الحالي، قائمة SKUs، صور المنتج، وتقييمات المستخدمين. يمكنك الوصول إليها عبر تحليل HTML مباشرة:
from bs4 import BeautifulSoup
import json
soup = BeautifulSoup(response.text, "html.parser")
next_data = soup.find("script", id="__NEXT_DATA__")
data = json.loads(next_data.string)
goods = data["props"]["pageProps"]["goods"]
goods_id = goods["goodsId"]
price = goods["price"]["amount"]
sku_list = goods.get("skuList", [])
التحدي هنا هو أن أسماء فئات CSS في Temu مجزأة (hashed) — مثل _2n3kF أو a1B2c — وتتغير مع كل بناء (build). لذلك، لا تعتمد على أسماء الفئات لاستخراج البيانات. بدلاً من ذلك، استخدم سمات data-uniqid أو كتلة __NEXT_DATA__ مباشرة، فهي أكثر استقراراً.
نقاط النهاية JSON الداخلية
خلف شبكة المنتجات، تستخدم Temu نقاط نهاية JSON داخلية. الأكثر شيوعاً:
POST /api/poppy/v1/search— البحث عن المنتجات، يدعم معاملات الصفحة والتصنيفPOST /api/poppy/v1/goods-detail— تفاصيل منتج فردي، يقبلgoods_idPOST /api/poppy/v1/review/list— تقييمات المنتج
هذه النقاط تتطلب رأس anti_content صحيحاً — توقيع مشفر يُولّد في المتصفح. عكس هذا التوقيع يتطلب تحليل JavaScript المعطّب (obfuscated) في صفحة Temu، وهي مهمة معقدة تتجدد باستمرار. لذلك، يفضل معظم المهندسين المسار الأول (تحليل HTML و__NEXT_DATA__) كبداية، ثم الانتقال إلى JSON API عند الحاجة لبيانات أعمق.
عتبات معدل الطلبات ولماذا البروكسي السكني إلزامي
Temu وCloudflare لا يكشفان عن عتبات معدل الطلبات الرسمية، لكن من خلال الاختبارات الميدانية، يمكن تحديد الأنماط التالية:
- من نفس IP: حوالي 30-50 طلباً في الدقيقة قبل ظهور تحدي Turnstile
- من نفس الجلسة (session): حوالي 100 طلب قبل انتهاء صلاحية رمز
anti_content - فترة صلاحية anti_content: تقريباً 5-10 دقائق قبل الحاجة لتجديده
الأهم من ذلك: الأسعار والشحن تختلف حسب المنطقة الجغرافية. منتج قد يظهر بسعر 2.99$ للمستخدم في نيويورك، وبسعر مختلف للمستخدم في كاليفورنيا، وقد لا يكون متاحاً أصلاً للمناطق الدولية. لهذا السبب، البروكسي السكني مع استهداف دقيق للمدينة ليس مجرد خيار لتفادي الحظر — بل ضرورة وظيفية للحصول على بيانات أسعار دقيقة.
مع ProxyHat، يمكنك تحديد الدولة والمدينة عبر اسم المستخدم:
# بروكسي سكني في نيويورك، الولايات المتحدة
http://user-country-US-city-newyork:pass@gate.proxyhat.com:8080
# بروكسي سكني في لوس أنجلوس
http://user-country-US-city-losangeles:pass@gate.proxyhat.com:8080
راجع صفحة مواقع البروكسي للاطلاع على قائمة الدول والمدن المتاحة. للحصول على بيانات أسعار دقيقة، استهدف المدينة المحددة التي يهمك رصد أسعارها.
مثال عملي: استخراج بيانات منتج Temu بلغة Python
سنستخدم curl_cffi التي تقلد بصمة TLS لمتصفح Chrome الحقيقي — وهو أمر حاسم لتجاوز فحص بصمة Cloudflare. راجع وثائق ProxyHat لتفاصيل إعداد البروكسي.
الخطوة 1: تثبيت المكتبات
pip install curl_cffi beautifulsoup4 lxml
الخطوة 2: جلب صفحة المنتج وتحليل __NEXT_DATA__
from curl_cffi import requests
from bs4 import BeautifulSoup
import json
# بروكسي سكني ProxyHat — استهداف الولايات المتحدة
proxy_url = "http://user-country-US:pass@gate.proxyhat.com:8080"
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-Language": "en-US,en;q=0.9",
"Referer": "https://www.temu.com/",
}
response = requests.get(
"https://www.temu.com/products/401099021.html",
headers=headers,
proxies={"http": proxy_url, "https": proxy_url},
impersonate="chrome120",
timeout=30,
)
if response.status_code == 200:
soup = BeautifulSoup(response.text, "html.parser")
next_data_script = soup.find("script", id="__NEXT_DATA__")
if next_data_script:
page_data = json.loads(next_data_script.string)
goods = page_data["props"]["pageProps"]["goods"]
print(f"goods_id: {goods['goodsId']}")
print(f"price: {goods['price']['amount']}")
print(f"sku_list: {len(goods.get('skuList', []))} variants")
الخطوة 3: عينة استجابة JSON (مقتطعة)
{
"props": {
"pageProps": {
"goods": {
"goodsId": "401099021",
"goodsName": "Wireless Bluetooth Earbuds Pro",
"price": {
"amount": 12.98,
"currency": "USD",
"symbol": "$"
},
"skuList": [
{"skuId": "sku_001", "color": "Black", "price": 12.98},
{"skuId": "sku_002", "color": "White", "price": 13.49}
],
"shippingInfo": {
"freeShipping": true,
"estimatedDays": "5-8 days"
}
}
}
}
}
هذه عينة مقتطعة — الاستجابة الفعلية تحتوي على مئات الحقول بما في ذلك الصور بجودة عالية، التقييمات، خيارات الخصم، ومعلومات المتجر. حجم الاستجابة النموذجي يتراوح بين 200KB و500KB.
الخطوة 4: استدعاء نقطة نهاية JSON الداخلية
# استدعاء goods-detail API — يتطلب anti_content صحيح
response = requests.post(
"https://www.temu.com/api/poppy/v1/goods-detail",
json={
"goods_id": "401099021",
"anti_content": generate_anti_content() # دالة مخصصة
},
headers={
**headers,
"Content-Type": "application/json",
"Origin": "https://www.temu.com",
},
proxies={"http": proxy_url, "https": proxy_url},
impersonate="chrome120",
timeout=30,
)
goods_data = response.json()
print(json.dumps(goods_data, indent=2)[:500])
ملاحظة: generate_anti_content() هي دالة تحتاج إلى عكس منطق JavaScript في صفحة Temu. هذا يتغير بشكل متكرر، لذا يفضل الاعتماد على __NEXT_DATA__ في معظم الحالات العملية.
الجلسات اللاصقة، إعادة المحاولة، والترقيم
الجلسات اللاصقة (Sticky Sessions) لتسلسل السلة والشحن
عند استخراج بيانات متعددة لمنتج واحد (تفاصيل المنتج، خيارات الشحن، التقييمات)، من المهم استخدام نفس IP لجميع الطلبات. خلاف ذلك، قد تحصل على أسعار شحن مختلفة بين الطلبات لأن كل طلب يأتي من موقع جغرافي مختلف. ProxyHat يدعم الجلسات اللاصقة عبر معامل session في اسم المستخدم:
# جلسة لاصقة — نفس IP لجميع الطلبات
session_proxy = "http://user-country-US-session-abc123:pass@gate.proxyhat.com:8080"
# جميع الطلبات التالية تستخدم نفس IP
for product_id in product_ids:
response = requests.get(
f"https://www.temu.com/products/{product_id}.html",
headers=headers,
proxies={"http": session_proxy, "https": session_proxy},
impersonate="chrome120",
timeout=30,
)
process_product(response)
إعادة المحاولة مع التراجع الأسي
import time
import random
def fetch_with_retry(url, max_retries=3):
for attempt in range(max_retries):
try:
response = requests.get(
url,
headers=headers,
proxies={"http": proxy_url, "https": proxy_url},
impersonate="chrome120",
timeout=30,
)
if response.status_code == 200:
return response
elif response.status_code == 403:
# حظر — غيّر الجلسة وأعد المحاولة
wait = (2 ** attempt) + random.uniform(0, 1)
time.sleep(wait)
except Exception:
wait = (2 ** attempt) + random.uniform(0, 1)
time.sleep(wait)
return None
الترقيم (Pagination) عبر نتائج البحث
عند استخراج نتائج بحث متعددة، استخدم جلسة لاصقة جديدة لكل صفحة مع تأخير عشوائي بين 2-5 ثوانٍ بين الطلبات:
for page in range(1, 20):
session_id = f"search_page_{page}"
page_proxy = f"http://user-country-US-session-{session_id}:pass@gate.proxyhat.com:8080"
response = requests.get(
f"https://www.temu.com/search?q=bluetooth+earbuds&page={page}",
headers=headers,
proxies={"http": page_proxy, "https": page_proxy},
impersonate="chrome120",
timeout=30,
)
extract_products(response)
time.sleep(random.uniform(2, 5))
الأخطاء الشائعة والحالات الحدية
- استخدام بروكسي مركز بيانات: ستحصل على 403 أو تحدي Turnstile في 95% من الطلبات. استخدم بروكسي سكني دائماً.
- تجاهل بصمة المتصفح:
requestsالعادية لا تكفي. استخدمcurl_cffiمعimpersonate="chrome120"أوplaywrightمع متصفح حقيقي. - الاعتماد على أسماء فئات CSS: أسماء الفئات في Temu مجزأة وتتغير. استخدم
__NEXT_DATA__أو سماتdata-*. - عدم تغيير الجلسة بعد الحظر: عند الحصول على 403، أعد المحاولة بجلسة جديدة فوراً.
- تجاهل المنطقة الجغرافية: الأسعار تختلف حسب الموقع. استهدف المدينة المحددة التي تهمك.
- طلبات متزامنة كثيرة: ابقَ تحت 30 طلباً في الدقيقة لكل IP لتجنب الحظر.
- انتهاء صلاحية anti_content: الرمز ينتهي بعد 5-10 دقائق. جدّده قبل انتهاء الصلاحية.
الاعتبارات الأخلاقية والقانونية
استخراج البيانات من Temu يتطلب التزاماً بالحدود القانونية والأخلاقية:
- البيانات العامة فقط: استخرج بيانات الكتالوج العام فقط (الأسعار، الأسماء، الصور، التقييمات). لا تقم بإنشاء حسابات وهمية أو استخراج بيانات المستخدمين الخاصة.
- احترام robots.txt: تحقق من
https://www.temu.com/robots.txtواتبع القواعد المحددة. - قانون CFAA الأمريكي: وفقاً لـ قانون الاحتيال وإساءة استخدام الحاسوب (CFAA)، الوصول غير المصرح به إلى الأنظمة المحمية قد يكون مخالفاً. استخراج البيانات العامة المتاحة للجميع عادة ما يكون قانونياً، لكن تجاوز إجراءات المصادقة قد لا يكون كذلك.
- GDPR وCCPA: إذا كنت تستخرج بيانات تتعلق بأفراد في الاتحاد الأوروبي أو كاليفورنيا، تأكد من الامتثال للوائح حماية البيانات. لا تخزن بيانات شخصية.
- شروط الخدمة (ToS): راجع شروط خدمة Temu. بعض المنصات تحظر استخراج البيانات صراحةً.
- التغذية الرسمية للتاجر: إذا كنت تاجر معتمد على Temu، استخدم بوابة التجار الرسمية للحصول على بيانات المنتجات عبر واجهة برمجية معتمدة بدلاً من الاستخراج.
إعداد ProxyHat: الخطوات العملية
للبدء مع ProxyHat في استخراج بيانات Temu:
- أنشئ حساباً على صفحة الأسعار واختر خطة البروكسي السكني المناسبة.
- احصل على بيانات اعتمادك (اسم المستخدم وكلمة المرور) من لوحة التحكم.
- استخدم
gate.proxyhat.com:8080كبوابة HTTP، أوgate.proxyhat.com:1080لـ SOCKS5. - أضف معاملات الاستهداف الجغرافي في اسم المستخدم:
user-country-US-city-newyork. - استخدم جلسات لاصقة عند الحاجة لاتساق البيانات:
user-country-US-session-abc123. - راجع دليل استخراج الويب وتتبع نتائج البحث لأمثلة إضافية.
النقاط الرئيسية
الخلاصة: استخراج بيانات Temu في 2026 يتطلب بروكسي سكني بمستوى مدينة، محاكاة بصمة متصفح صحيحة عبر
curl_cffi، واستهداف__NEXT_DATA__بدلاً من أسماء فئات CSS المتقلبة. الجلسات اللاصقة ضرورية لاتساق الأسعار والشحن، والالتزام بالحدود القانونية يحمي مشروعك من المخاطر.
- Temu لا يقدم API عاماً — اختر بين تحليل HTML أو استهداف JSON الداخلي.
- بروكسي مركز البيانات يُرفض في 95% من الطلبات — استخدم بروكسي سكني إلزامياً.
- الأسعار والشحن تختلف حسب المدينة — استهدف الموقع الجغرافي بدقة.
- استخدم
curl_cffiمعimpersonate="chrome120"لتجاوز فحص بصمة TLS. - الجلسات اللاصقة (
-session-) تضمن اتساق بيانات السلة والشحن. - احترم حدود معدل الطلبات: 30-50 طلباً في الدقيقة لكل IP.
- استخرج البيانات العامة فقط، وراجع شروط الخدمة وrobots.txt.
الأسئلة الشائعة
ما هو استخراج بيانات وأسعار منتجات Temu؟
استخراج بيانات وأسعار منتجات Temu هو عملية جمع بيانات المنتجات (الأسماء، الأسعار، الصور، SKUs، التقييمات) من منصة Temu باستخدام أدوات آلية. بما أن Temu لا يقدم واجهة برمجية عامة، يعتمد المهندسون على تحليل HTML وكتلة __NEXT_DATA__ أو استهداف نقاط نهاية JSON الداخلية مثل /api/poppy/v1/goods-detail مع بروكسي سكني لتجاوز أنظمة مكافحة البوتات مثل Cloudflare Turnstile.
لماذا يهم استخراج بيانات Temu لمستخدمي البروكسي؟
استخراج بيانات Temu يتطلب بروكسي سكني بمستوى مدينة دقيقة لأن الأسعار والشحن وتوافر المنتجات تختلف حسب المنطقة الجغرافية. البروكسي السكني ضروري أيضاً لتجاوز Cloudflare Turnstile وفحص بصمة TLS الذي يرفض عناوين مراكز البيانات فوراً في 95% من الطلبات. بدون بروكسي سكني مناسب، لا يمكن الحصول على بيانات أسعار دقيقة أو تجاوز طبقات الحماية.
أي نوع بروكسي يعمل بشكل أفضل لاستخراج بيانات Temu؟
البروكسي السكني مع استهداف دقيق للمدينة يعمل بشكل أفضل. عناوين مراكز البيانات تُرفض فوراً، بينما البروكسي السكني يوفر نسبة نجاح 80-90% عند استخدامه مع محاكاة بصمة متصفح صحيحة عبر curl_cffi. مع ProxyHat، استخدم معامل country-US-city-newyork في اسم المستخدم لاستهداف الموقع المطلوب بدقة.
كيف تتجنب الحظر عند استخراج بيانات Temu؟
لتجنب الحظر: استخدم بروكسي سكني مع استهداف مدينة، محاكاة بصمة متصفح Chrome عبر curl_cffi مع impersonate="chrome120"، ابقَ تحت 30-50 طلباً في الدقيقة لكل IP، استخدم جلسات لاصقة لاتساق البيانات، أضف تأخيرات عشوائية بين الطلبات (2-5 ثوانٍ)، وأعد المحاولة بجلسة جديدة عند الحصول على 403. أيضاً، جدد رمز anti_content قبل انتهاء صلاحيته بعد 5-10 دقائق.






