كشط بيانات Shein على نطاق واسع في 2026: المقايضة بين API و HTML
إذا كنت تعمل في مجال ذكاء الأسعار في تجارة التجزئة أو تحليل سوق الأزياء، فمن المرجّح أن كشط بيانات Shein على نطاق واسع في 2026 أصلك إلى سؤال أساسي واحد: هل تُحلّل صفحات HTML المُعرَضة أم تستهدف نقاط نهاية JSON الداخلية التي تستدعيها واجهة Shein نفسها؟ الإجابة في معظم الحالات هي الثانية، لكن لكل نهج مقايضاته.
تستدعي واجهة Shein الأمامية (Frontend) نقاط نهاية داخلية مثل /api/productInfo و /api/category/list التي تُرجع بيانات JSON خامّة. هذه النقاط أسرع، أصغر حجماً، وأكثر استقراراً من تحليل HTML المُعرَض. لكنها محمية بنفس طبقة مكافحة البوتات التي تحمي الموقع بالكامل، مما يعني أن الوصول إليها يتطلب بروكسيات سكنية دوارة وإدارة دقيقة لملفات تعريف الارتباط (Cookies).
من ناحية أخرى، تحتوي صفحات HTML المُعرَضة على كتل JSON مضمّنة مثل productIntroData و gbProductDetail داخل وسوم <script>. هذه الكتل تحتوي على نفس بيانات المنتج، لكن استخراجها يتطلب تحليل DOM كامل وتحميل صفحة تزن ~500 KB أو أكثر لكل طلب.
مقارنة سريعة: API مقابل HTML
| المعيار | نقاط نهاية API الداخلية | تحليل HTML المُعرَض |
|---|---|---|
| حجم الاستجابة | ~2–5 KB (JSON خام) | ~500 KB+ (صفحة كاملة) |
| سرعة الاستخراج | سريع — لا حاجة لعرض DOM | بطيء — يتطلب رأس Chrome أو Playwright |
| دقة البيانات | عالية — بيانات منظمة مباشرة | متوسطة — قد تتغير محددات CSS |
| استقرار الهيكل | يتغير مع تحديثات API | يتغير مع إعادة تصميم الواجهة |
| صيانة الكود | منخفضة نسبياً | عالية — تحديث CSS/XPath باستمرار |
| مستوى الحماية | محمية بـ Akamai Bot Manager | نفس الحماية + فحص سلوكي إضافي |
الخلاصة: استخدم نقاط نهاية API الداخلية عندما يكون الهدف جمع البيانات على نطاق واسع بكفاءة، واحتفظ بتحليل HTML كخطة احتياطية عند فشل API أو تغيير هيكله.
طبقة مكافحة البوتات في Shein: فهم Akamai Bot Manager
يستخدم Shein Akamai Bot Manager كخط دفاع رئيسي. هذا النظام لا يعتمد على قائمة محظورات بسيطة لعناوين IP، بل يجمع بين بصمة TLS، تحليل سلوك المتصفح، وملفات تعريف ارتباط ديناميكية لتمييز البوتات عن البشر.
ملفات تعريف الارتباط الأساسية
- _abck: ملف تعريف ارتباط رئيسي تصدره Akamai. يجب أن يحتوي على قيمة صالحة بعد اجتياز فحص المستشعر (sensor check). إذا كانت القيمة غير صالحة، يتلقى الخادم استجابة HTTP 412.
- bm_sz: ملف تعريف ارتباط مساعد يربط الجلسة ببصمة المتصفح. يتغير دورياً ويجب تحديثه.
- sensor_data: تتبع (telemetry) يُرسل في خلفية الصفحة عبر JavaScript يجمع بيانات عن المتصفح: نوع الخطوط، دقة الشاشة، أداء Canvas، وأكثر من 50 إشارة أخرى. يُرسل إلى نقطة نهاية Akamai لتوليد _abck صالح.
- smdeviceid: رمز جهاز (device token) يربط الجلسة بمعرّف جهاز فريد. يُستخدم لتتبع السلوك عبر جلسات متعددة.
لماذا يُحظَر رأس Chrome وحده؟
تشغيل Puppeteer أو Playwright بـ Chromium مرفوع الرأس (Headless) لا يكفي. Akamai يكتشف:
- قيمة
navigator.webdriver = trueفي المتصفحات المؤتمتة. - غياب تفاعلات الماوس واللوحة المفاتيح الواقعية.
- بصمة TLS لا تتطابق مع متصفح حقيقي (خاصة عند استخدام مكتبات HTTP قياسية مثل
requestsأوurllib). - أنماط طلب غير بشرية: سرعة ثابتة، عدم وجود طلبات موارد ثانوية (صور، CSS، خطوط).
لذلك، الحل العملي ليس محاولة محاكاة متصفح كامل، بل استخدام مكتبات HTTP تطابق بصمة TLS لمتصفح حقيقي — مثل curl_cffi التي تستخدم محرك curl المُجمّع مع impersonation — مع بروكسيات سكنية دوارة توزع الطلبات عبر آلاف عناوين IP.
أين توجد البيانات: حقول المنتج ونقاط نهاية الفئات
بيانات المنتج الفردية
عند تحميل صفحة منتج على Shein، تظهر كتلة JSON ضخمة داخل وسم <script> باسم productIntroData أو gbProductDetail. هذه الكتلة تحتوي على:
- goods_id: المعرّف الفريد للمنتج.
- retailPrice: السعر الأصلي قبل الخصم.
- salePrice: سعر البيع الحالي.
- stock: المخزون الإجمالي المتاح.
- sku_list: قائمة SKU مع المخزون لكل مقاس/لون.
- goods_name: اسم المنتج.
- cat_id: معرّف الفئة.
بدلاً من تحليل HTML، يمكنك استدعاء نقطة النهاية الداخلية مباشرة:
https://www.shein.com/api/productInfo?goods_id=1234567
هذه النقطة تُرجع نفس البيانات في JSON خام بحجم ~3 KB، وهو أسرع بكثير من تحميل صفحة كاملة.
بيانات الفئات وكتالوج المنتجات
لتعداد المنتجات داخل فئة، تستدعي واجهة Shein:
https://www.shein.com/api/category/list?cat_id=1980&page=1&page_size=40
حيث:
cat_id: معرّف الفئة (مثال: 1980 لفساتين نسائية).page: رقم الصفحة (تبدأ من 1).page_size: عدد المنتجات لكل صفحة (عادة 40).
تُرجع الاستجابة قائمة منتجات مع goods_id، goods_name، salePrice، وصورة مصغّرة. يمكنك بعدها استخدام goods_id لجلب تفاصيل كل منتج عبر /api/productInfo.
حدود المعدل ومتطلبات البروكسي السكني الدوار
يُطبّق Shein حدود معدل صارمة لكل عنوان IP. بناءً على اختبارات عملية في أوائل 2026:
- ~30 طلب/دقيقة لكل IP قبل تلقي HTTP 429 (Too Many Requests).
- ~50 طلب/دقيقة قبل أن يبدأ Akamai في إصدار تحدي _abck الذي ينتج عنه HTTP 412.
- بعد ~100 طلب في دقيقة واحدة، يُحظر IP مؤقتاً لمدة ~15 دقيقة.
هذه الحدود تعني أن كشط كتالوج Shein الكامل (الذي يحتوي على مئات الآلاف من المنتجات) من IP واحد مستحيل عملياً. الحل هو توزيع الطلبات عبر بروكسيات سكنية دوارة.
التوطين الجغرافي: لماذا يهم
Shein يُوطّن الأسعار والعملة والمخزون حسب الموقع الجغرافي. منتج قد يكون متاحاً في الولايات المتحدة بسعر $12.99 ولكنه نفد في ألمانيا أو يُسعّر بـ €14.99. لذلك:
- استخدم
-country-USلجمع بيانات السوق الأمريكية. - استخدم
-country-DEللسوق الألمانية. - استخدم
-country-GBللسوق البريطانية.
هذا يضمن أن البيانات التي تجمعها تعكس السعر والمخزون الفعلي في ذلك السوق. يمكنك الاطلاع على المواقع المتاحة عبر صفحة المواقع.
مثال عملي: كشط بيانات منتج باستخدام curl_cffi و ProxyHat
المكتبة curl_cffi تتيح مطابقة بصمة TLS لمتصفح Chrome حقيقي، مما يقلل من احتمال اكتشاف Akamai. إليك مثال كامل:
from curl_cffi import requests
import json
# ProxyHat residential proxy with US geo-targeting
proxy = "http://user-country-US:pass@gate.proxyhat.com:8080"
# Create session with Chrome TLS fingerprint
session = requests.Session(impersonate="chrome120")
response = session.get(
"https://www.shein.com/api/productInfo?goods_id=1234567",
proxies={"http": proxy, "https": proxy},
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/",
},
timeout=15
)
print(f"Status: {response.status_code}")
data = response.json()
print(json.dumps(data, indent=2)[:500])
عينة استجابة (مقتطعة)
{
"code": 0,
"data": {
"goods_id": "1234567",
"goods_name": "Solid Drop Shoulder Oversized...",
"retailPrice": {
"amount": "25.00",
"amountWithSymbol": "$25.00"
},
"salePrice": {
"amount": "12.99",
"amountWithSymbol": "$12.99"
},
"stock": 847,
"sku_list": [
{"sku_code": "SKU_A1", "stock": 120, "size": "S"},
{"sku_code": "SKU_A2", "stock": 89, "size": "M"}
]
}
}
مثال باستخدام curl من سطر الأوامر
curl -x http://user-country-US:pass@gate.proxyhat.com:8080 \
"https://www.shein.com/api/productInfo?goods_id=1234567" \
-H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" \
-H "Accept: application/json" \
-H "Accept-Language: en-US,en;q=0.9"
الترحيل والجلسات اللاصقة وآلية التراجع
الترحيل عبر صفحات الفئات
لتعداد جميع المنتجات في فئة، تحتاج إلى الترحيل عبر صفحات متعددة. كل صفحة تُرجع 40 منتجاً، وقد تحتوي فئة كبيرة على 200+ صفحة.
from curl_cffi import requests
import time
base_url = "https://www.shein.com/api/category/list"
proxy_base = "http://user-country-US-session-{sid}:pass@gate.proxyhat.com:8080"
def scrape_category(cat_id, max_pages=50):
results = []
session_id = f"shein-cat-{cat_id}-{int(time.time())}"
proxy = proxy_base.format(sid=session_id)
sess = requests.Session(impersonate="chrome120")
for page in range(1, max_pages + 1):
url = f"{base_url}?cat_id={cat_id}&page={page}&page_size=40"
resp = sess.get(
url,
proxies={"http": proxy, "https": proxy},
timeout=15
)
if resp.status_code == 412:
print(f"412 at page {page}, refreshing session...")
session_id = f"shein-cat-{cat_id}-r{page}"
proxy = proxy_base.format(sid=session_id)
sess = requests.Session(impersonate="chrome120")
time.sleep(5)
continue
if resp.status_code != 200:
print(f"Status {resp.status_code} at page {page}")
time.sleep(3)
continue
data = resp.json()
goods = data.get("data", {}).get("products", [])
if not goods:
print(f"No more products at page {page}")
break
results.extend(goods)
print(f"Page {page}: {len(goods)} products (total: {len(results)})")
time.sleep(1.5)
return results
الجلسات اللاصقة لاتساق العملة
عند كشط بيانات الأسعار، من الضروري أن تظل جميع الطلبات من نفس عنوان IP لضمان اتساق العملة والسعر. استخدام -session- في ProxyHat يضمن أن جميع الطلبات من نفس الجلسة تمر عبر نفس IP السكني:
http://user-country-US-session-shein-run-001:pass@gate.proxyhat.com:8080
بهذه الطريقة، إذا كنت تجمع بيانات 500 منتج في دورة واحدة، فإن جميعها يُجمع من نفس IP بنفس إعدادات التوطين، مما يضمن أن الأسعار بعملة واحدة (USD) وأن المخزون يعكس نفس المنطقة.
آلية التراجع وإعادة محاولة 412
عند تلقي HTTP 412، يعني ذلك أن ملف تعريف الارتباط _abck لم يعد صالحاً. الإجراء الصحيح هو:
- الانتظار بفترة تزايدية (exponential backoff).
- تدوير الجلسة (إنشاء session ID جديد للحصول على IP جديد).
- إعادة إنشاء جلسة curl_cffi للحصول على بصمة TLS جديدة.
- إعادة المحاولة.
import time
import random
def fetch_with_backoff(url, proxy, max_retries=5):
sess = requests.Session(impersonate="chrome120")
for attempt in range(max_retries):
try:
resp = sess.get(
url,
proxies={"http": proxy, "https": proxy},
timeout=15
)
if resp.status_code == 200:
return resp.json()
elif resp.status_code == 412:
wait = (2 ** attempt) + random.uniform(0.5, 1.5)
print(f"412 — backing off {wait:.1f}s")
time.sleep(wait)
# Refresh session for new TLS fingerprint
sess = requests.Session(impersonate="chrome120")
elif resp.status_code == 429:
wait = (2 ** attempt) * 2
print(f"429 — rate limited, waiting {wait}s")
time.sleep(wait)
else:
print(f"HTTP {resp.status_code}, retrying...")
time.sleep(2)
except Exception as e:
print(f"Error: {e}, attempt {attempt + 1}/{max_retries}")
time.sleep(3)
return None
الأخلاقيات وشروط الخدمة: ما يجب معرفته
كشط البيانات العامة من متاجر التجزئة يقع في منطقة قانونية رمادية. قبل البدء، ضع في اعتبارك:
- البيانات العامة فقط: لا تحاول الوصول إلى صفحات الحساب، بيانات الدفع، أو نقاط نهاية الخروج (checkout). هذا ينتهك شروط خدمة Shein وقد يُعرّضك لمساءلة قانونية بموجب قانون الاحتيال وإساءة استخدام الحاسوب (CFAA) في الولايات المتحدة.
- احترام robots.txt: تحقق من ملف
robots.txtالخاص بـ Shein واتبع القواعد المذكورة فيه. حتى لو لم يكن ملزماً قانونياً في كل ولاية قضائية، فهو ممارسة أخلاقية. - GDPR و CCPA: بيانات المنتجات (الأسعار، الأسماء، المخزون) لا تُعتبر بيانات شخصية عادةً، لكن كن حذراً عند جمع مراجعات المستخدمين التي قد تحتوي على معرّفات شخصية. راجع النص الرسمي للائحة العامة لحماية البيانات (GDPR) للتأكد.
- معدل الطلبات المسؤول: لا تُغرق الخادم بآلاف الطلبات في الثانية. استخدم تأخيراً معقولاً (1–2 ثانية بين الطلبات لكل IP) ووزّع الحمل عبر بروكسيات متعددة.
- البرنامج التابع البديل: إذا كنت تحتاج بيانات منتجات منظمة وموثوقة لتحليل سوقي، تحقق مما إذا كان برنامج Shein التابع يوفّر خلاصات بيانات (data feeds) رسمية. قد يكون هذا أكثر استقراراً وقانونية من الكشط.
إعداد ProxyHat: خطوات سريعة
لبدء كشط Shein باستخدام ProxyHat، اتبع هذه الخطوات:
- سجّل الدخول إلى لوحة تحكم ProxyHat واحصل على بيانات اعتمادك (اسم المستخدم وكلمة المرور).
- اختر نوع البروكسي المناسب: سكني (Residential) لكشط Shein لأن عناوين IP السكنية تبدو كأجهزة مستخدمين حقيقيين، مما يقلل من احتمال الحظر.
- حدد الموقع الجغرافي المطلوب:
-country-USللسوق الأمريكية،-country-DEللألمانية، إلخ. راجع صفحة المواقع للقائمة الكاملة. - استخدم
-session-للجلسات اللاصقة عند جمع بيانات الأسعار لضمان اتساق العملة. - راقب معدل النجاح وعدّل عدد الجلسات المتزامنة حسب الحاجة. ابدأ بـ ~10 جلسات متزامنة وزِد تدريجياً.
للحصول على تفاصيل التسعير والخطط المتاحة، تفضل بزيارة صفحة التسعير. لمزيد من حالات استخدام كشط الويب، راجع صفحة استخدامات كشط الويب و تتبع نتائج محركات البحث. يمكنك أيضاً الاطلاع على وثائق ProxyHat للتفاصيل التقنية الكاملة.
النقاط الرئيسية
كشط بيانات Shein على نطاق واسع في 2026 يتطلب فهماً عميقاً لطبقة مكافحة البوتات، اختيار البروكسي المناسب، وإدارة دقيقة للجلسات.
- استخدم نقاط نهاية API الداخلية (
/api/productInfo،/api/category/list) بدلاً من تحليل HTML — أسرع وأكثر استقراراً. - بروكسي سكني دوار إلزامي: حدود المعدل في Shein (~30 طلب/دقيقة لكل IP) تجعل الكشط من IP واحد مستحيلاً على نطاق واسع.
- التوطين الجغرافي ضروري: استخدم
-country-US،-country-DE، إلخ. لضمان دقة الأسعار والمخزون حسب السوق. - الجلسات اللاصقة لاتساق البيانات: استخدم
-session-لضمان أن جميع طلبات دورة جمع واحدة تمر عبر نفس IP بنفس العملة. - curl_cffi مع impersonate: مطابقة بصمة TLS لمتصفح حقيقي تقلل بشكل كبير من احتمال اكتشاف Akamai.
- آلية تراجع لـ 412: عند تلقي HTTP 412، جدد الجلسة، انتظر بفترة تزايدية، وأعد المحاولة.
- التزم بالأخلاقيات: البيانات العامة فقط، احترم robots.txt، وفكّر في البرنامج التابع إذا توفر.
الأسئلة الشائعة
ما هو كشط بيانات Shein على نطاق واسع في 2026؟
هو عملية استخراج بيانات الكتالوج والأسعار والمخزون من متجر Shein بشكل آلي على نطاق كبير، عادةً عبر نقاط نهاية API الداخلية مثل /api/productInfo و /api/category/list. يتطلب استخدام بروكسيات سكنية دوارة لتجاوز حدود المعدل وطبقة مكافحة البوتات Akamai Bot Manager، مع التوطين الجغرافي لضمان دقة البيانات حسب السوق المستهدف.
لماذا يهم كشط بيانات Shein على نطاق واسع في 2026 لمستخدمي البروكسي؟
Shein أحد أكبر متاجر الأزياء في العالم بمئات الآلاف من المنتجات وأسعار تتغير يومياً. محللو ذكاء الأسعار يحتاجون بيانات محدّثة باستمرار لتتبع المنافسين. البروكسي السكني الدوار هو الأداة الأساسية لتوزيع الطلبات عبر آلاف عناوين IP، مما يتيح جمع البيانات على نطاق واسع دون حظر. بدون بروكسيات، يُحظر IP بعد ~100 طلب في الدقيقة.
أي نوع بروكسي يعمل بشكل أفضل لكشط بيانات Shein على نطاق واسع في 2026؟
البروكسي السكني الدوار (Residential Rotating) هو الأفضل لأن عناوين IP السكنية تُصدر من مزودي إنترنت حقيقيين وتبدو كأجهزة مستخدمين عاديين، مما يجعل اكتشافها من قبل Akamai Bot Manager أصعب بكثير من بروكسيات مراكز البيانات. مع التوطين الجغرافي (مثل -country-US) والجلسات اللاصقة (مثل -session-abc123)، يوفر أفضل توازن بين معدل النجاح واتساق البيانات.
كيف تتجنب الحظر عند تنفيذ كشط بيانات Shein على نطاق واسع في 2026؟
استخدم بروكسيات سكنية دوارة مع توزيع الطلبات عبر جلسات متعددة، حافظ على معدل ~30 طلب/دقيقة لكل IP، استخدم مكتبة curl_cffi لمطابقة بصمة TLS لمتصفح حقيقي، طبّق آلية تراجع تزايدية عند تلقي HTTP 412 أو 429، جدّد الجلسات والحصول على IP جديد عند الحظر، واحترم تأخيراً معقولاً بين الطلبات (1–2 ثانية). تجنب أنماط الطلب غير البشرية مثل السرعة الثابتة تماماً.






