كيفية استخراج بيانات Walmart باستخدام Python في 2026 (ومن دون أن يتم حظرك)

آخر تحديث في July 8, 2026
كيفية استخراج بيانات Walmart باستخدام Python في 2026 (ومن دون أن يتم حظرك)

تقوم Walmart بتغيير أسعار بعض المنتجات عدة مرات يوميًا. وإذا جرّبت يومًا أن تتابع هذا برمجيًا، فأنت تعرف حجم الإحباط: يعمل السكربت لديك 20 دقيقة، ثم يبدأ بهدوء في إرجاع صفحات CAPTCHA متنكرة على أنها ردود 200 OK عادية.

لقد قضيت وقتًا طويلًا في التعامل مع دفاعات Walmart المضادة للروبوتات ضمن عملنا على استخراج البيانات في Thunderbit، وأردت أن أشارك كل ما تعلمته — الأساليب التي تعمل فعلًا في 2025، والإخفاقات الصامتة التي تفسد بياناتك، والمقارنة الصريحة بين بناء أداة استخراج خاصة بك، أو الدفع مقابل واجهة scraping API، أو الاكتفاء بأداة بدون كود. يغطي هذا الدليل ثلاث طرق للاستخراج (تحليل HTML، وJSON الخاص بـ __NEXT_DATA__، واعتراض واجهات API الداخلية)، ومعالجة أخطاء جاهزة للإنتاج يتجاهلها معظم الشروحات تمامًا، وإطار قرار واضح لاختيار النهج المناسب. ستجد هنا ما يفيدك سواء كنت تكتب Python أو تريد فقط جدولًا ممتلئًا بالأسعار قبل الغداء.

لماذا نستخدم Python لاستخراج بيانات Walmart؟

تُعد Walmart أكبر متاجر التجزئة في العالم من حيث الإيرادات — 680.985 مليار دولار في السنة المالية 2025، مع احتفاظها بالمركز الأول في Fortune Global 500 لمدة 12 عامًا متتالية. يستضيف الموقع نحو 420 مليون إدراج حي، وقد أشار المدير المالي في Walmart إلى "نصف مليار SKU" في السوق. ويأتي نحو 95% من هذه الإدراجات من بائعين خارجيين، ما يعني أن الكتالوج متقلب — البائعون يتبدلون، والبدائل تتغير، والمخزون ينعكس يوميًا.

walmart_stats_670d06c6bd.png

ولهذا السبب تصبح عملية الاستخراج مهمة. فالتقرير الفصلي لا يمكنه التقاط ما تكشفه عملية استخراج ليلية. إليك أكثر حالات الاستخدام شيوعًا التي أراها:

حالة الاستخداممن يحتاجهاما الذي يتم استخراجه
مراقبة أسعار المنافسينفرق التجارة الإلكترونية، أدوات إعادة التسعيرالأسعار، العروض الترويجية، التوافق مع MAP
إثراء كتالوج المنتجاتفرق المبيعات والتسويق التجاريالأوصاف، الصور، المواصفات، البدائل
تتبّع توفر المخزونسلاسل الإمداد، الموزعون بنظام الدروب شيبحالة المخزون، معلومات البائع
أبحاث السوق وتحليل الاتجاهاتفرق التسويق، مدراء المنتجاتالتقييمات، المراجعات، تشكيلة الفئات
توليد العملاء المحتملينفرق المبيعاتأسماء البائعين، عدد المنتجات، الفئات

وقد بلغ سوق برمجيات مراقبة أسعار المنافسين وحده 1.92 مليار دولار في 2025، ومن المتوقع أن يصل إلى 5.09 مليار دولار بحلول 2033. وتدفع سلوكيات المستهلكين هذا الإنفاق: 94% من العملاء يقارنون الأسعار أثناء التسوق عبر الإنترنت، و83% يقارنون بين عدة مواقع.

Python هي اللغة الافتراضية لهذا العمل. ويقدّر تقرير البنية التحتية لعام 2026 من Apify أن Python تمثل 71.7% من إجمالي عمليات استخراج الويب، كما أن المكتبة الأساسية (requests) تسحب نحو 30 مليون تنزيل أسبوعيًا. وإذا كنت تقوم بالاستخراج على أي نطاق، فالأرجح أنك تستخدم Python.

لماذا تُعد Walmart من أصعب المواقع في الاستخراج؟

تكمن صعوبة Walmart تحديدًا في أنها تشغّل منتجين تجاريين لمكافحة الروبوتات على التوالي: Akamai Bot Manager كطبقة WAF على الحافة وبصمة TLS، وPerimeterX (الذي أعيدت تسميته إلى HUMAN Security) كطبقة تحديات JavaScript السلوكية. وتصف Scrape.do هذا المزيج بأنه "نادر وصعب للغاية في التجاوز".

walmart_antibot_3d67d0119c.png

تمنح ScrapeOps Walmart تقييم 9/10 في صعوبة الاستخراج الإجمالية، مع تقييم Akamai وحده 9/10. ومن واقع تجربتي، هذا التقييم في محله.

إليك ما تواجهه فعليًا:

Akamai Bot Manager يفحص بصمة TLS لديك (هاش JA3/JA4)، وترتيب إطارات HTTP/2، وترتيب الرؤوس وتنسيقها، وملفات تعريف الارتباط الخاصة بالجلسة (_abck، ak_bmsc). إن استدعاء Python عادي عبر requests يُنتج بصمة TLS لا يصدرها أي متصفح حقيقي — لذلك تكتشفه Akamai قبل أن يصل طلبك أصلًا إلى خوادم Walmart.

PerimeterX/HUMAN يعمل بعد Akamai، حيث ينفذ بصمة JavaScript (px.js) تفحص خصائص navigator، ورسم canvas، وWebGL، والسياق الصوتي، والقياسات السلوكية الحيوية (حركة الماوس، سرعة التمرير، ديناميكيات ضغط المفاتيح). ويظهر الفشل عادةً على هيئة اختبار "Press & Hold" الشهير — زر عليك الضغط عليه والإبقاء عليه نحو 10 ثوانٍ بينما تُجمع الإشارات السلوكية. وتقول Oxylabs بوضوح: "تستخدم Walmart نموذج CAPTCHA من نوع 'Press & Hold'، الذي يقدمه PerimeterX، وهو معروف بأنه شبه مستحيل الحل من خلال الكود."

أما السلوك الأخطر فعلًا فهو الحظر الصامت. إذ تعيد Walmart HTTP 200 مع جسم CAPTCHA بدلًا من 403. وتؤكد ScrapingBee: "تُرجع Walmart رمز الحالة 200 OK حتى عندما تقدّم صفحة CAPTCHA. لا يمكنك الاعتماد على رمز الحالة وحده لمعرفة ما إذا كان طلبك قد نجح." فيحلل سكربتك HTML الخاص بالـ CAPTCHA على أنه "المنتج غير موجود" ويمضي قدمًا. نصف مجموعة بياناتك يصبح قمامة، وأنت لا تدري.

ثم هناك مشكلة البيانات المرتبطة بالمتجر. فأسعار Walmart والمخزون تتغير بحسب الموقع، وتتحكم بها ملفات تعريف الارتباط مثل locDataV3 وassortmentStoreId. ومن دون هذه الملفات الصحيحة، ستحصل على بيانات "افتراضية على مستوى الدولة" قد تبدو كاملة لكنها لا تطابق ما يراه المتسوقون الحقيقيون. ملفات الارتباط المفقودة لا تنتج صفحة حظر — بل تنتج بيانات خاطئة من دون أي فشل مرئي، وهذا أسوأ.

ثلاث طرق لاستخراج البيانات من Walmart (وكيف تقارن بينها)

قبل الشرح خطوة بخطوة، هذه هي أساليب الاستخراج الثلاثة الأساسية. معظم الشروح المنافسة تغطي طريقة أو اثنتين فقط. سأمشي معك في الثلاث كلها حتى تختار ما يناسب حالتك.

الطريقةالاعتماديةاكتمال البياناتصعوبة مكافحة الروبوتاتعبء الصيانة
تحليل HTML + BeautifulSoup⚠️ منخفضة (المحددات تتغير مع كل نشر)متوسطةعاليةعالية
JSON الخاص بـ __NEXT_DATA__✅ جيدةعاليةمتوسطة إلى عاليةمتوسطة
اعتراض واجهة API الداخلية✅ الأفضلالأعلى (البدائل، المخزون، المراجعات)متوسطة إلى عاليةمنخفضة (JSON منظم)
Thunderbit (بدون كود)✅ جيدةعاليةمنخفضة (تتعامل معها الذكاء الاصطناعي)لا شيء

يُعد تحليل HTML أسوأ خيار لـ Walmart — فالموقع يستخدم حِزم Next.js مع أسماء فئات CSS مُجزأة تتغير مع كل نشر. أما طريقة JSON داخل __NEXT_DATA__ فهي الخيار العملي الذي تستخدمه كل أدوات Walmart مفتوحة المصدر الجادة بين 2024 و2026. واعتراض واجهة API الداخلية هو الأقوى، لكنه يأتي مع تحفّظات تتجاهلها معظم الشروحات. وThunderbit هو الخيار الصحيح عندما لا تحتاج أصلًا إلى خط معالجة مخصص.

جرّب Thunderbit لاستخراج بيانات Walmart

إعداد بيئة Python لاستخراج بيانات Walmart

إليك ما تحتاج إليه:

  • مستوى الصعوبة: متوسط
  • الوقت المطلوب: نحو 30 دقيقة للإعداد، بالإضافة إلى وقت البرمجة
  • ما ستحتاجه: Python 3.10+، وpip، ومحرر أكواد، و(للاستخدام الإنتاجي) خدمة بروكسي أو واجهة scraping API

أنشئ مجلد مشروعك والبيئة الافتراضية:

mkdir walmart-scraper && cd walmart-scraper
python -m venv venv
source venv/bin/activate  # على Windows: venv\Scripts\activate

ثبّت المكتبات المطلوبة:

pip install curl_cffi parsel beautifulsoup4 lxml

تُعد curl_cffi معيار 2025 لاستخراج المواقع الصعبة. وهي ربط libcurl يمكنه انتحال بصمات TLS الدقيقة للمتصفحات. وتشرح Bright Data: "تستخدم Walmart بصمة TLS ضمن نظام الكشف عن الروبوتات لديها، وحتى ضبط User-Agent لمحاكاة متصفح حقيقي لن يتجاوز ذلك." لا تستطيع requests أو httpx العادية تجاوز Akamai مهما كانت الرؤوس التي تضبطها. أما curl_cffi مع impersonate="chrome124" فهو ما يصنع الفارق.

ستحتاج أيضًا إلى json (مضمنة)، وcsv (مضمنة)، وtime، وrandom، وlogging للأنماط الإنتاجية التي سنغطيها لاحقًا.

خطوة بخطوة: استخراج صفحات منتجات Walmart باستخدام Python

الخطوة 1: جلب صفحة منتج Walmart

أول مهمة هي إرسال طلب HTTP لا يتم حظره فورًا. إليك مجموعة الرؤوس القياسية المستخدمة عبر Scrapfly وScrapingdog وOxylabs وScrapeOps خلال 2024–2026:

from curl_cffi import requests

HEADERS = {
    "User-Agent": (
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
        "AppleWebKit/537.36 (KHTML, like Gecko) "
        "Chrome/124.0.0.0 Safari/537.36"
    ),
    "Accept": (
        "text/html,application/xhtml+xml,application/xml;q=0.9,"
        "image/avif,image/webp,*/*;q=0.8"
    ),
    "Accept-Language": "en-US,en;q=0.9",
    "Accept-Encoding": "gzip, deflate, br",
    "Upgrade-Insecure-Requests": "1",
    "Sec-Fetch-Dest": "document",
    "Sec-Fetch-Mode": "navigate",
    "Sec-Fetch-Site": "none",
    "Sec-Fetch-User": "?1",
    "Referer": "https://www.google.com/",
}

session = requests.Session(impersonate="chrome124")
url = "https://www.walmart.com/ip/Apple-AirPods-Pro-2nd-Generation/1752657021"
response = session.get(url, headers=HEADERS)

معامل impersonate="chrome124" هو ما يقوم بالعمل الشاق هنا. فهو يطلب من curl_cffi مطابقة HelloClient TLS في Chrome 124، وترتيب إطارات HTTP/2، وتسلسل الرؤوس الزائفة بدقة. ومن دونه ترى Akamai هاش JA3 خاصًا بـ Python وتحجبك قبل أن يصل طلبك حتى إلى طبقة تطبيق Walmart.

كيف يبدو الرد المحظور: إذا رأيت عبارة "Robot or human?" في عنوان HTML للرد، أو إذا أعاد الرد التوجيه إلى walmart.com/blocked، فهذا يعني أنك تم التقاطك. المشكلة أن Walmart غالبًا تعيد رمز حالة 200 مع جسم CAPTCHA — لذا ففحص response.ok وحده غير كافٍ.

وفي أي استخدام إنتاجي أو متكرر، ستحتاج إلى بروكسيات سكنية. فالعناوين من مراكز البيانات تُحرق فورًا بواسطة نظام سمعة IP لدى Akamai. سأغطي الاستراتيجية الكاملة للتعامل مع الأخطاء والبروكسيات في قسم الإنتاج أدناه.

الخطوة 2: تحليل بيانات المنتج من JSON الخاص بـ __NEXT_DATA__

موقع Walmart.com هو تطبيق Next.js، وتضم صفحة HTML التي يقدمها الخادم الحمولة الكاملة للتهيئة داخل وسم سكربت واحد: <script id="__NEXT_DATA__" type="application/json">. هذا هو المنجم الحقيقي.

تؤكد منصة Scrapfly في دليلها لعام 2026: "في 2026، تستخدم Walmart Next.js مع JSON منظم داخل وسوم __NEXT_DATA__، ما يجعل استخراج البيانات المخفية أكثر موثوقية من تحليل محددات CSS التقليدية." وكل أدوات استخراج Walmart مفتوحة المصدر المعروفة — أداة Scrapfly، وOxylabs، وpython-scrapy-playbook — تستخدم هذا الأسلوب.

إليك طريقة استخراجه:

import json
from parsel import Selector

sel = Selector(text=response.text)
raw = sel.xpath('//script[@id="__NEXT_DATA__"]/text()').get()
data = json.loads(raw)
product = data["props"]["pageProps"]["initialData"]["data"]["product"]
idml = data["props"]["pageProps"]["initialData"]["data"].get("idml", {})

تتوقف معظم الشروحات هنا. فيما يلي خريطة كاملة لمسارات JSON للحقول التي تهمك فعليًا — وقد جرى التحقق منها على صفحات Walmart الحية خلال 2024–2026:

حقل البياناتمسار JSON (تحت initialData)النوعملاحظات
اسم المنتجdata > product > nameنص
العلامة التجاريةdata > product > brandنص
السعر الحالي (رقم)data > product > priceInfo > currentPrice > priceعدد عشريقد يختلف حسب ملف تعريف الارتباط الخاص بالمتجر
السعر الحالي (نص)data > product > priceInfo > currentPrice > priceStringنصيُعرض بصيغة مثل "$9.99"
وصف قصيرdata > product > shortDescriptionنص HTMLحلّله باستخدام BeautifulSoup لاستخراج النص
وصف طويلdata > idml > longDescriptionنص HTMLيوجد في idml وليس داخل product — هذه هي الفخ الذي تخطئ فيه الشروحات الأقدم
كل الصورdata > product > imageInfo > allImagesمصفوفةقائمة من كائنات {id, url}
متوسط التقييمdata > product > averageRatingعدد عشريالمفتاح هو averageRating وليس rating القديم
عدد المراجعاتdata > product > numberOfReviewsعدد صحيح
البدائلdata > product > variantCriteriaمصفوفةمجموعات الخيارات (الحجم، اللون)
التوفرdata > product > availabilityStatusنصIN_STOCK، OUT_OF_STOCK، LIMITED_STOCK
البائعdata > product > sellerDisplayNameنص
الشركة المصنعةdata > product > manufacturerNameنص

يُعد مسار longDescription هو الفخ الوحيد الذي يوقع الناس. فقد وضعه منشور ScrapeHero من 2023 عند product.longDescription، لكن المصادر الأحدث من 2024 وما بعده تضعه باستمرار في المفتاح الشقيق idml. اقرأ دائمًا idml.longDescription أولًا، ثم ارجع إلى product.longDescription للصفحات الأقدم.

إليك نمط الاستخراج الآمن باستخدام سلاسل .get():

def extract_product(data):
    product = data["props"]["pageProps"]["initialData"]["data"]["product"]
    idml = data["props"]["pageProps"]["initialData"]["data"].get("idml", {})

    price_info = product.get("priceInfo", {})
    current_price = price_info.get("currentPrice", {})
    image_info = product.get("imageInfo", {})

    return {
        "name": product.get("name"),
        "brand": product.get("brand"),
        "price": current_price.get("price"),
        "price_string": current_price.get("priceString"),
        "short_desc": product.get("shortDescription"),
        "long_desc": idml.get("longDescription", product.get("longDescription")),
        "images": [img.get("url") for img in image_info.get("allImages", [])],
        "rating": product.get("averageRating"),
        "review_count": product.get("numberOfReviews"),
        "variants": product.get("variantCriteria"),
        "availability": product.get("availabilityStatus"),
        "seller": product.get("sellerDisplayName"),
        "manufacturer": product.get("manufacturerName"),
    }

وللمستخدمين الذين لا يريدون التعامل مع التنقل في مسارات JSON إطلاقًا، فإن ذكاء Thunderbit الاصطناعي يحدد هذه الحقول ويُهيكلها تلقائيًا — من دون الحاجة إلى تعيين يدوي للمسارات. تضغط على "AI Suggest Fields"، فيقرأ الصفحة، وتحصل على جدول. أما إذا كنت تبني خط معالجة مخصصًا، فالمخطط أعلاه هو مرجعك.

الخطوة 3: اعتراض نقاط نهاية API الداخلية الخاصة بـ Walmart للحصول على بيانات أغنى

لا تغطي أي مقالة منافسة هذه الطريقة بشكل صحيح. إنها أقوى مسار للاستخراج — والأكثر تعقيدًا.

واجهة Walmart الأمامية تستدعي خلفية GraphQL اتحادية مبنية على Apollo Gateway. وتوجد نقاط النهاية تحت www.walmart.com/orchestra/*:

  • /orchestra/pdp/graphql/... — تهيئة تفاصيل المنتج + تبديل البدائل
  • /orchestra/snb/graphql/... — ترقيم صفحات البحث والتصفح
  • /orchestra/reviews/graphql/... — المراجعات المرقمة

وتُرجع هذه النقاط JSON نظيفًا ومنظمًا يحتوي على بيانات قد يختصرها __NEXT_DATA__ أحيانًا — التسعير على مستوى البديل، وعدد المخزون في الوقت الحقيقي، وترقيم المراجعات الكامل.

الالتباس الذي تدور حوله المقالات دون أن تذكره صراحة: تستخدم Walmart استعلامات Apollo المستمرة. في نص الطلب يُرسل فقط تجزئة SHA-256 (persistedQuery.sha256Hash) وليس نص الاستعلام. وإذا كانت التجزئة غير معروفة لدى الخادم، فستحصل على PersistedQueryNotFound. وتقوم Walmart بتدوير هذه التجزئات مع كل نشر. لهذا السبب لا تنشر أي أداة Open Source معروفة لـ Walmart كودًا قابلًا للنسخ المباشر من /orchestra/.

النسخة العملية والصادقة من هذه الطريقة هي تمرين في DevTools:

  1. افتح صفحة منتج Walmart في Chrome
  2. افتح DevTools → تبويب Network، ثم صفِّ حسب "Fetch/XHR"
  3. تصفح الصفحة بشكل طبيعي — انقر على البدائل، ومرّر إلى المراجعات، وغيّر موقع المتجر
  4. راقب الطلبات إلى نقاط نهاية /orchestra/* التي تُرجع JSON ببيانات المنتج
  5. انقر بالزر الأيمن على الطلب → "Copy as cURL"
  6. حوّل أمر cURL إلى Python باستخدام curl_cffi

إليك شكل استدعاء API بعد إعادة تشغيله:

import json
from curl_cffi import requests

session = requests.Session(impersonate="chrome124")

# أولًا: أنعش الجلسة بزيارة صفحة المنتج
session.get("https://www.walmart.com/ip/some-product/1234567", headers=HEADERS)

# ثم أعد تشغيل استدعاء API الداخلي (منسوخ من DevTools)
api_url = "https://www.walmart.com/orchestra/pdp/graphql"
api_headers = {
    **HEADERS,
    "accept": "application/json",
    "content-type": "application/json",
    "referer": "https://www.walmart.com/ip/some-product/1234567",
    "wm_qos.correlation_id": "your-copied-correlation-id",
}
payload = {
    # الصق نص الطلب الدقيق من DevTools
    "variables": {"productId": "1234567"},
    "extensions": {
        "persistedQuery": {
            "version": 1,
            "sha256Hash": "the-hash-you-copied"
        }
    }
}

api_response = session.post(api_url, headers=api_headers, json=payload)
api_data = api_response.json()

تُعد خطوة تنشيط الجلسة أساسية. إذ يجب أن تضبط Walmart ملفات تعريف الارتباط الخاصة بـ PerimeterX (_px3، _pxhd، ACID) عبر جلب HTML الأولي قبل أن ينجح استدعاء API. ومن دونها ستحصل على 412 أو 403.

متى تستخدم هذه الطريقة: عندما تحتاج إلى بيانات لا يتضمنها __NEXT_DATA__ — مثل التسعير العميق على مستوى البدائل، أو المراجعات المرقمة بعد الدفعة الأولى، أو أعداد المخزون اللحظية. أما في معظم حالات الاستخدام، فإن __NEXT_DATA__ كافٍ وأسهل بكثير.

استخراج نتائج البحث والصفحات المتعددة من Walmart

نتائج البحث تتبع نمط __NEXT_DATA__ مشابهًا، لكن مع مسار JSON مختلف:

search_url = "https://www.walmart.com/search?q=laptops&page=1"
response = session.get(search_url, headers=HEADERS)

sel = Selector(text=response.text)
raw = sel.xpath('//script[@id="__NEXT_DATA__"]/text()').get()
data = json.loads(raw)

search_result = data["props"]["pageProps"]["initialData"]["searchResult"]
items = search_result["itemStacks"][0]["items"]

# استبعاد المنتجات المموّلة
organic_items = [i for i in items if i.get("__typename") == "Product"]

for item in organic_items:
    print(item.get("name"), item.get("priceInfo", {}).get("currentPrice", {}).get("price"))

يعمل الترقيم عبر زيادة معامل page: &page=1، &page=2، وهكذا. لكن هناك حد غير موثق: تقيّد Walmart نتائج البحث بـ 25 صفحة بغض النظر عن العدد الإجمالي الفعلي. وتؤكد Scrapfly: "تحدد Walmart الحد الأقصى لعدد صفحات النتائج التي يمكن الوصول إليها بـ 25 صفحة بغض النظر عن إجمالي الصفحات المتاحة."

طرق الالتفاف للحصول على تغطية أعمق:

  • تبديل ترتيب الفرز: شغّل الاستعلام نفسه مع &sort=price_low ثم &sort=price_high للحصول على نحو 50 صفحة من التغطية
  • تقسيم نطاق السعر: أضف &min_price=X&max_price=Y لتقسيم الكتالوج إلى نوافذ أصغر
  • تقسيم الفئات: ابحث داخل فئات محددة بدلًا من البحث على مستوى الموقع كله

لاحظ أن itemStacks مصفوفة. وتستخدم Scrapfly الفهرس [0] بشكل ثابت في مستودعها، لكن صفحات الفئات والتصفح تحتوي أحيانًا على عدة مجموعات (مثل "أفضل الاختيارات" و"المزيد من النتائج"). أما النمط الأكثر متانة فيمر على جميع المجموعات:

for stack in search_result.get("itemStacks", []):
    for item in stack.get("items", []):
        if item.get("__typename") == "Product":
            # معالجة العنصر
            pass

ومن الجدير بالذكر أيضًا أن ملف robots.txt لدى Walmart يحظر /search. أما صفحات تفاصيل المنتجات (/ip/...) ومعظم صفحات الفئات (/cp/...) فهي غير محظورة. إذا كنت قلقًا بشأن الامتثال، فابدأ بصفحات المنتجات وأشجار الفئات بدلًا من البحث.

لا تدع الحظر الصامت يفسد بياناتك: معالجة أخطاء جاهزة للإنتاج

تفشل معظم الشروحات هنا. فهي تشرح كيف تجلب صفحة واحدة، وتحلل منتجًا واحدًا، ثم تنتهي. في الإنتاج، أنت تجلب آلاف الصفحات، وWalmart تحاول فعليًا إيقافك. والفرق بين أداة تجريبية وأداة تعمل فعلًا هو كيفية تعاملها مع الفشل.

اكتشاف الحظر الصامت قبل أن يفسد بياناتك

أهم دالة في أداة استخراج Walmart هي كاشف الحظر. وبناءً على إجماع الموردين عبر ScrapingBee، وScrapingdog، وOxylabs، وDecodo، فأنت بحاجة إلى أربع عمليات تحقق مستقلة:

BLOCK_MARKERS = (
    "Robot or human",
    "Press &amp; Hold",
    "Press & Hold",
    "px-captcha",
    "perimeterx",
)

def is_walmart_blocked(response) -> bool:
    # 1. إعادة توجيه إلى نقطة نهاية الحظر المخصصة
    if "/blocked" in str(response.url):
        return True
    # 2. رموز حالة صلبة
    if response.status_code in (403, 412, 428, 429, 503):
        return True
    # 3. 200 OK مع جسم CAPTCHA (حالة الحظر الصامت)
    body = response.text or ""
    if any(m.lower() in body.lower() for m in BLOCK_MARKERS):
        return True
    # 4. فحص طول الرد — صفحات المنتج الحقيقية تتراوح بين 300 و900 كيلوبايت
    if len(response.content) < 50_000 and "/ip/" in str(response.url):
        return True
    return False

أما الفحص الرابع — طول الرد — فيلتقط الحالات التي تعيد فيها Walmart صفحة مبسطة لا تحتوي على أي علامات CAPTCHA واضحة، لكنها أيضًا لا تحتوي على بيانات المنتج التي تحتاجها.

منطق إعادة المحاولة مع التراجع الأُسّي والـ jitter

عندما يفشل طلب ما، لا تريد أن تُغرق Walmart بالطلبات فورًا. النمط القياسي يستخدم تراجعًا أُسّيًا مع jitter لفصل المحاولات عن بعضها:

import time
import random
import logging
from curl_cffi import requests as cffi_requests

log = logging.getLogger("walmart")

def fetch_with_retry(session, url, max_retries=5, base_delay=2, max_delay=60):
    for attempt in range(max_retries):
        try:
            response = session.get(url, headers=HEADERS, timeout=15)

            if response.status_code in (429, 503):
                raise Exception(f"Throttled: {response.status_code}")

            if is_walmart_blocked(response):
                raise Exception("Silent block detected")

            return response

        except Exception as e:
            if attempt == max_retries - 1:
                raise

            wait = min(max_delay, base_delay * (2 ** attempt)) + random.uniform(0, 3)
            log.warning(f"Attempt {attempt + 1} failed: {e}. Retrying in {wait:.1f}s")
            time.sleep(wait)

    return None

الـ jitter (random.uniform(0, 3)) ليس تجميليًا — فهو يزيل التزامن بين العمال بحيث لا تعيد أسطولًا من أدوات الاستخراج المحاولة في الثانية نفسها فتُشغّل كواشف السرعة لدى Akamai.

تحديد معدل الطلبات

كل من Thunderbit وScrape.do يتفقان على تأخير عشوائي من 3 إلى 6 ثوانٍ لكل طلب على Walmart: "خفّض معدل الطلبات بالانتظار 3–6 ثوانٍ بين تحميل الصفحات، وغيّر فترات الانتظار عشوائيًا."

import time
import random

def rate_limited_fetch(session, url):
    response = fetch_with_retry(session, url)
    time.sleep(random.uniform(3.0, 6.0))
    return response

وعلى نطاق واسع، فكر في استخدام aiolimiter لتحديد المعدل في المهام غير المتزامنة:

from aiolimiter import AsyncLimiter
limiter = AsyncLimiter(max_rate=10, time_period=60)  # 10 طلبات في الدقيقة

التحقق من صحة البيانات

حتى عندما لا يكون الرد محظورًا، قد تكون البيانات المحللة خاطئة (متجر خاطئ، أو حمولة متدهورة). تحقّق منها قبل الكتابة إلى المخرجات:

def validate_product(product):
    """تُعيد True إذا كانت بيانات المنتج تبدو صحيحة."""
    if not product.get("name"):
        return False

    price = (product.get("priceInfo") or {}).get("currentPrice", {}).get("price")
    if not isinstance(price, (int, float)) or price <= 0:
        return False

    if product.get("availabilityStatus") not in ("IN_STOCK", "OUT_OF_STOCK", "LIMITED_STOCK"):
        return False

    return True

تسجيل الجلسة

تتبّع معدل النجاح لكل جلسة. عندما ينخفض عن 80% لمدة 10 دقائق، فهذا يعني أن شيئًا ما تغيّر — إما أن عنوان IP لديك احترق، أو انتهت صلاحية ملفات الارتباط، أو أن Walmart نشرت قاعدة جديدة لمكافحة الروبوتات.

class ScrapeMetrics:
    def __init__(self):
        self.total = 0
        self.success = 0
        self.blocks = 0
        self.errors = 0

    def record(self, result):
        self.total += 1
        if result == "success":
            self.success += 1
        elif result == "blocked":
            self.blocks += 1
        else:
            self.errors += 1

    @property
    def success_rate(self):
        return (self.success / self.total * 100) if self.total > 0 else 0

    def check_health(self):
        if self.total > 20 and self.success_rate < 80:
            log.critical(f"انخفض معدل النجاح إلى {self.success_rate:.1f}% — فكّر في تدوير البروكسيات أو الإيقاف المؤقت")

ليس هذا ممتعًا. لكنه ما يحافظ على نظافة بياناتك.

Python اليدوي مقابل واجهة Scraping API مقابل أداة بدون كود: كيف تختار الطريقة المناسبة لاستخراج بيانات Walmart

يقفز كثير من المطورين مباشرة إلى بناء أداة استخراج مخصصة من دون أن يسألوا إن كان هذا هو القرار الصحيح. تمنح ScrapeOps Walmart تقييم 9/10 في الصعوبة. ويصفها المستخدمون في المنتديات بأنها "عمليًا 9/10" ويتساءلون "هل ستكون واجهة scraping API مخصصة مبالغًا فيها؟". والإجابة تعتمد على الحجم والميزانية والقدرة الهندسية.

العاملPython يدوي (requests + بروكسيات)واجهة Scraping API (Oxylabs، Bright Data، إلخ)أداة بدون كود (Thunderbit)
وقت الإعداد لأول صفساعات15–60 دقيقةنحو دقيقتين
وقت الإعداد للإنتاج40–80 ساعة4–16 ساعةنحو 30 دقيقة
التعامل مع مكافحة الروبوتاتأنت تديره (صعب)يتولى المزوّد ذلكيتولى ذلك تلقائيًا
التكلفة على نطاق صغير (<1000 صفحة/شهر)منخفضة (تكلفة البروكسيات نحو 4–8 دولارات/غيغابايت)باقات بدء من 40–49 دولارًا/شهرمجاني–15 دولارًا/شهر
التكلفة على نطاق واسع (100 ألف+ صفحة/شهر)أقل لكل طلبأعلى لكل طلبتختلف
التخصيصتحكم كاملمعلمات APIمحدود بالواجهة/الحقول
الصيانة المستمرة4–8 ساعات/شهرشبه معدومةلا شيء (الذكاء الاصطناعي يتكيف)
الأنسب لـالمطورين الذين يبنون خطوط معالجة مخصصةالاستخراج الإنتاجي متوسّط النطاقمستخدمي الأعمال، والاستخراج السريع لمرة واحدة

متى يكون Python اليدوي منطقيًا

يفوز الحل اليدوي عندما تمتلك بالفعل عقد بروكسيات، أو تحتاج إلى تحكم صارم في الرؤوس، أو الاستهداف عبر الرمز البريدي، أو شرائح البائعين، أو عندما تقوم بفهرسة ملايين الصفحات شهريًا بحيث تتراكم رسوم واجهة API لكل سجل، أو عندما تحتاج إلى ضمانات محلية/امتثالية. لكن المقابل هو وقت هندسي حقيقي: برنامج Scrapy جاهز للإنتاج مع الترقيم، وإعادة المحاولة، وتدوير البروكسيات، وانتحال TLS، ومخططات متعددة لأنواع الصفحات يتطلب 40–80 ساعة من عمل Python المتقدم، بالإضافة إلى 4–8 ساعات صيانة شهريًا مع تدوير Walmart للبصمات.

متى توفر لك واجهة Scraping API الوقت

تتولى واجهات Scraping API طبقة مكافحة الروبوتات عنك. وتُظهر مقاييس ScrapeOps معدلات نجاح 99% لواجهة Zyte API و98% لـ Scrape.do على Walmart. وتتراوح أسعار الفئة الابتدائية بين 40 و49 دولارًا شهريًا لأدوات مثل ScraperAPI، وOxylabs، وScrapingdog. إذا كنت فريقًا من 2 إلى 5 مهندسين، وحجم الاستخراج لديك بين 10 آلاف ومليون صفحة شهريًا، فغالبًا تكون الواجهة هي الخيار الصحيح. أنت تستبدل تكلفة كل طلب بعدم وجود أي صيانة تقريبًا.

متى تكون الأداة بدون كود هي الخيار الصحيح

Thunderbit يناسب ملفًا مختلفًا تمامًا. إذا كنت مدير منتج أو محللًا أو عاملًا في التجارة الإلكترونية وتحتاج بيانات منتجات Walmart في جدول بيانات هذا بعد الظهر — وليس في السبرنت القادم — فالأداة بدون كود هي الجواب الصريح.

الخطوات: ثبّت ملحق Thunderbit على Chrome، وانتقل إلى صفحة منتج Walmart أو صفحة البحث، ثم انقر "AI Suggest Fields"، وستقرأ الذكاء الاصطناعي الصفحة وتقترح الأعمدة (اسم المنتج، السعر، التقييم، إلخ). انقر "Scrape"، وستُملأ البيانات في جدول. ثم صدّر إلى Excel أو Google Sheets أو Airtable أو Notion — وكل ذلك مجانًا وبدون جدار دفع.

يتولى Thunderbit مكافحة الروبوتات في السحابة، لذلك لا تتعامل مع CAPTCHA أو البروكسيات أو بصمات TLS. ويتكيف الذكاء الاصطناعي مع تغييرات التخطيط تلقائيًا، فلا توجد صيانة. وللمستخدمين الذين لا يريدون أصلًا التعامل مع التنقل في مسارات JSON، فهذه هي أسهل طريقة.

القيود الصريحة: Thunderbit ليس مصممًا لـ 100 ألف+ صفحة يوميًا. تجعل ميزانيات الرصيد والحدود السحابية إدخال الأحجام الكبيرة غير اقتصادي مقارنة بالواجهات الخام. كما لا يمكنك تثبيت رمز بريدي أو ASN محدد ما لم تكن الأداة تدعمه. أما لخطوط العمل المستمرة وعالية الحجم، فالحل اليدوي أو واجهة scraping API لا يزالان الأفضل.

تسعير تقريبي: 1000 صف منتج Walmart على Thunderbit تكلف نحو 2000 رصيد (حوالي 0.60–1.10 دولار على خطتي Starter/Pro). وهذا يقارب واجهة Walmart لدى Oxylabs، وأرخص من معظم واجهات scraping API الهواية عند الأحجام المنخفضة. تحقق من تسعير Thunderbit للحصول على التفاصيل الحالية.

استخراج بيانات منتجات Walmart بالذكاء الاصطناعي Get Started Free

تصدير بيانات Walmart التي استخرجتها

بعد أن تحصل على البيانات، تحتاج إلى وضعها في مكان مفيد. ثلاثة تنسيقات تغطي معظم الاحتياجات:

CSV — التنسيق الأدنى المشترك الذي يفتحه المحللون فعليًا:

import csv

def export_csv(products, filename="walmart_products.csv"):
    fieldnames = ["name", "price", "availability", "rating", "review_count", "seller", "url"]
    with open(filename, "w", newline="", encoding="utf-8-sig") as f:
        writer = csv.DictWriter(f, fieldnames=fieldnames, quoting=csv.QUOTE_MINIMAL)
        writer.writeheader()
        for p in products:
            writer.writerow({k: p.get(k) for k in fieldnames})

استخدم ترميز utf-8-sig لتوافق Excel. إذ يمنع مؤشر BOM Excel من تشويه الأحرف الخاصة.

JSONL — الصيغة الإنتاجية لخطوط الاستخراج:

import json
import gzip

def export_jsonl(products, filename="walmart_products.jsonl.gz"):
    with gzip.open(filename, "at", encoding="utf-8") as f:
        for p in products:
            f.write(json.dumps(p, ensure_ascii=False) + "\n")

JSONL آمن عند الأعطال (فالكتابة المتقطعة تفقد السطر الأخير فقط)، ويمكن بثّه بذاكرة ثابتة، ويحافظ على البيانات المتداخلة مثل البدائل والمراجعات كما هي.

Excel — لتسليم سريع لمحلل واحد:

from openpyxl import Workbook

def export_excel(products, filename="walmart_products.xlsx"):
    wb = Workbook(write_only=True)
    ws = wb.create_sheet("Products")
    ws.append(["Name", "Price", "Availability", "Rating", "Reviews", "Seller"])
    for p in products:
        ws.append([p.get("name"), p.get("price"), p.get("availability"),
                    p.get("rating"), p.get("review_count"), p.get("seller")])
    wb.save(filename)

يغطي Thunderbit قصة التصدير لغير مستخدمي Python: تصدير بنقرة واحدة إلى Google Sheets وAirtable وNotion وExcel وCSV وJSON — وكلها مجانية في الباقة الأساسية. وللمراقبة المستمرة، يمكن لميزة الجدولة في Thunderbit تشغيل عمليات استخراج متكررة تلقائيًا.

تنبيه واحد بخصوص الجدولة: لا تستخدم GitHub Actions لاستخراج بيانات Walmart. فمُشغلات GitHub Actions تعمل من نطاقات IP التابعة لـ Azure، والتي تحظرها أنظمة مكافحة الروبوتات لدى Walmart فورًا. استخدم APScheduler على VPS، أو مرّر كل الحركة عبر بروكسيات سكنية.

الإرشادات القانونية والأخلاقية لاستخراج بيانات Walmart

يعبّر مستخدمو المنتديات صراحةً عن هذا القلق: "أنا لا أمانع لعبة القط والفأر مع المطورين، لكنني حذر من اللعب مع فريقهم القانوني."

شروط استخدام Walmart تحظر صراحةً استخدام "أي روبوت أو spider... أو أي جهاز يدوي أو آلي آخر لاسترجاع أو فهرسة أو 'scrape' أو 'data mine' أو جمع أي مواد" من دون "موافقة كتابية مسبقة وصريحة."

ملف robots.txt الخاص بـ Walmart يحظر /search و/account و/api/ وعشرات النقاط الداخلية. أما صفحات تفاصيل المنتجات (/ip/...) و/reviews/product/ فهي غير محظورة.

سابقة hiQ ضد LinkedIn (الدائرة التاسعة، 2022) قررت أن استخراج البيانات المتاحة علنًا من غير المرجح أن ينتهك قانون CFAA الفيدرالي. لكن المحكمة نفسها حكمت لاحقًا بأن hiQ انتهكت اتفاقية مستخدم LinkedIn وأصدرت حكم موافقة بقيمة 500,000 دولار ضدها. كما أن قرارات أحدث في 2024 (Meta ضد Bright Data، X Corp. ضد Bright Data) ضيّقت نطاق CFAA أكثر وخلقت دفوعًا قائمة على استباق حقوق النشر، لكن تلك الأحكام اعتمدت على نصوص شروط استخدام محددة لا تنطبق بشكل مباشر على Walmart.

إرشادات عملية: لا تُثقل الخوادم. احترم حدود المعدل. لا تستخرج البيانات الشخصية أو بيانات المستخدمين. استخدم البيانات بمسؤولية. إن استخراج صفحات منتجات Walmart العامة بمعدل متواضع لأبحاث شخصية يختلف جدًا من حيث المخاطر عن الاستخراج التجاري على نطاق واسع في مواجهة شروط Walmart. وإذا كنت تبني منتجًا يعتمد على بيانات Walmart، فتحدث إلى محامٍ وابحث في واجهات Walmart الرسمية للشركاء والبائعين.

إخلاء مسؤولية: هذه معلومات تعليمية وليست نصيحة قانونية.

الخلاصة وأهم النقاط المستفادة

يُعد استخراج بيانات Walmart باستخدام Python تحديًا بدرجة 9/10 بسبب بنية الحماية المزدوجة Akamai + PerimeterX. ليس مستحيلًا — لكنك تحتاج الأدوات والأنماط الصحيحة.

أهم الخلاصات:

  • استخراج JSON من __NEXT_DATA__ هو الخيار العملي لمعظم حالات الاستخدام. وهو ما تستخدمه كل أدوات Walmart مفتوحة المصدر الجادة بين 2024 و2026. والمسار الأساسي هو props.pageProps.initialData.data.product لصفحات تفاصيل المنتج، وsearchResult.itemStacks للبحث/التصفح.
  • استخدام curl_cffi مع impersonate="chrome124" إلزامي. فـ requests أو httpx العاديان لا يستطيعان تجاوز بصمة TLS لدى Akamai مهما كانت الرؤوس.
  • الحظر الصامت هو الخطر الحقيقي. فـ Walmart تعيد 200 OK مع أجسام CAPTCHA. افحص محتوى الرد، لا رموز الحالة فقط.
  • أدوات الإنتاج تحتاج أكثر من كود مسار النجاح. فالتراجع الأُسّي مع jitter، وكشف الحظر عبر أربع إشارات، وتحديد المعدل بـ 3–6 ثوانٍ لكل طلب، والتحقق من صحة البيانات، ومراقبة صحة الجلسة كلها أمور أساسية.
  • اعتراض API الداخلية عبر /orchestra/* قوي لكنه هش. استخدمه كتمرين في DevTools لاحتياجات بيانات محددة، لا كطريقة الاستخراج الأساسية.
  • Walmart تحدد نتائج البحث عند 25 صفحة. زد التغطية عبر تبديل ترتيب الفرز وتقسيم نطاق الأسعار.
  • اختر طريقتك بصدق: Python اليدوي للمطورين ذوي الاحتياجات المخصصة والحجم الكبير. واجهات Scraping API للفرق متوسطة الحجم التي لا تملك مهندس استخراج. وThunderbit لمستخدمي الأعمال الذين يريدون البيانات في Google Sheets هذا الظهيرة.

إذا أردت تجربة المسار بدون كود، فإن ملحق Thunderbit على Chrome يوفّر باقة مجانية — يمكنك استخراج بضع صفحات من Walmart ورؤية النتائج بنفسك. وإذا كنت ستسلك طريق Python، فأنماط الكود في هذه المقالة مختبرة في الإنتاج. في كلتا الحالتين، أصبحت الآن تملك خريطة لدفاعات Walmart وثلاثة مسارات لعبورها.

لمزيد من المعلومات حول تقنيات استخراج الويب، اطلع على أدلتنا حول كيفية استخراج بيانات الويب باستخدام Python، وأفضل أدوات استخراج الويب الآلية، واستخراج الويب من دون أن يتم حظرك. ويمكنك أيضًا مشاهدة الدروس على قناة Thunderbit على YouTube.

الأسئلة الشائعة

هل استخراج بيانات منتجات Walmart قانوني؟

تحظر شروط استخدام Walmart الاستخراج الآلي من دون موافقة خطية. وقد قررت قضية hiQ v. LinkedIn في الدائرة التاسعة (2022) أن قانون CFAA الفيدرالي على الأرجح لا ينطبق على استخراج الصفحات العامة، لكن القضية نفسها انتهت بحكم خرق عقد بقيمة 500,000 دولار ضد الجهة المستخرِجة. ويختلف ملف المخاطر كثيرًا بين استخراج صفحات المنتجات العامة بمعدلات متواضعة لأغراض بحث شخصية، وبين الاستخراج التجاري واسع النطاق. استشر محاميًا إذا كنت تبني نشاطًا تجاريًا على بيانات Walmart.

لماذا يستمر حظر أداة استخراج Walmart الخاصة بي؟

الأسباب الأكثر شيوعًا هي: استخدام requests أو httpx العاديين (الذي يخرج بصمة TLS خاصة بـ Python تكتشفها Akamai فورًا)، أو غياب الرؤوس الصحيحة، أو عدم تدوير البروكسيات، أو معدلات طلب أسرع من 3–6 ثوانٍ لكل صفحة، أو فقدان ملفات جلسة الارتباط (_px3، _abck، locDataV3). انتقل إلى curl_cffi مع impersonate="chrome124"، واستخدم بروكسيات سكنية، وطبّق أنماط كشف الحظر وإعادة المحاولة المذكورة في هذه المقالة.

ما البيانات التي يمكنني استخراجها من Walmart باستخدام Python؟

أسماء المنتجات، والأسعار (الحالية والمرجعة)، والصور، والأوصاف القصيرة والطويلة، والتقييمات، وعدد المراجعات، وحالة التوفر، وأسماء البائعين، ومعلومات الشركة المصنعة، وخيارات البدائل (الحجم، اللون)، وموقع الفئة. باستخدام طريقة __NEXT_DATA__، تتوفر كل هذه البيانات في صورة JSON منظم. كما أن اعتراض API الداخلية يمكن أن يعيد أيضًا التسعير على مستوى البديل، وأعداد المخزون في الوقت الحقيقي، وبيانات المراجعات المرقمة.

هل أحتاج إلى بروكسيات لاستخراج Walmart؟

نعم، لأي استخدام إنتاجي أو متكرر. تقوم أنظمة مكافحة الروبوتات لدى Walmart بحظر الطلبات العادية باستمرار — وحتى مع الرؤوس المثالية، سيُكتشف عنوان IP غير السكني بواسطة نظام سمعة IP لدى Akamai. البروكسيات السكنية أو المحمولة مطلوبة. أما عناوين مراكز البيانات فتُحرق تقريبًا فورًا. قدّر الميزانية بنحو 3–17 دولارًا لكل 1000 صفحة حسب مزود البروكسي والفئة.

هل يمكنني استخراج بيانات Walmart من دون كتابة كود؟

نعم. Thunderbit هو ملحق Chrome مدعوم بالذكاء الاصطناعي يكتشف بيانات Walmart خلال خطوتين: "AI Suggest Fields" للتعرف تلقائيًا على أعمدة بيانات المنتج، ثم "Scrape" لاستخراج البيانات. يتولى تحديات مكافحة الروبوتات في السحابة ويصدّر مباشرة إلى Excel أو Google Sheets أو Airtable أو Notion — وكل ذلك مجانًا. وهو الأنسب للمحللين ومدراء المنتجات ومستخدمي الأعمال الذين يحتاجون إلى البيانات بسرعة من دون بناء خط معالجة مخصص. أما للاستخراج عالي الحجم أو شديد التخصيص، فلا يزال Python أو واجهة scraping API هو الخيار الأفضل.

جرّب Thunderbit لاستخراج بيانات Walmart بالذكاء الاصطناعي Get Started Free

اعرف المزيد

Shuai Guan
Shuai Guan
الرئيس التنفيذي في Thunderbit | خبير في أتمتة البيانات بالذكاء الاصطناعي Shuai Guan هو الرئيس التنفيذي لشركة Thunderbit وخريج كلية الهندسة بجامعة ميشيغان. وبالاستناد إلى ما يقرب من عشر سنوات من الخبرة في مجالي التقنية وبنية SaaS، يتخصص في تحويل نماذج الذكاء الاصطناعي المعقدة إلى أدوات عملية لاستخراج البيانات بدون الحاجة إلى البرمجة. في هذه المدونة، يشارك رؤى صريحة ومجرّبة ميدانيًا حول استخراج البيانات من الويب واستراتيجيات الأتمتة، لمساعدتك على بناء سير عمل أذكى يعتمد على البيانات. وعندما لا يكون منشغلاً بتحسين تدفقات العمل الخاصة بالبيانات، يوجّه نفس دقته واهتمامه بالتفاصيل إلى شغفه بالتصوير الفوتوغرافي.
جدول المحتويات
Thunderbit · وكيل بيانات الويب بالذكاء الاصطناعي

Extract data from any page in 1 click

موثوق به من قبل أكثر من 250,000 مستخدم
الخطة المجانية متاحة
استخرج البيانات باستخدام الذكاء الاصطناعي
انقل البيانات بسهولة إلى Google Sheets أو Airtable أو Notion
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week