انتقل إلى المحتوى

كيفية كشط الويب Walmart.com

Walmart هو أكبر بائع تجزئة في العالم مع أكثر من 10,000 متجر في 24 دولة. نظرًا لمخزونها الهائل وبيانات المنتجات الغنية، تعد Walmart هدفًا قيمًا للغاية لتجميع الويب.

في هذا الدليل الشامل، سنتعرف على كيفية إنشاء أداة استخراج بيانات الويب لاستخراج بيانات منتج Walmart على نطاق واسع.

نبذة

فيما يلي نظرة عامة سريعة على الخطوات الأساسية التي سنغطيها:

  • العثور على المنتجات لكشط
    • استخدام واجهة برمجة تطبيقات بحث Walmart
    • تحليل صفحات الفئات
    • التعامل مع حدود النتائج
  • كشط صفحات المنتج
    • تحليل بيانات المنتج
    • تجريف الوسائط والتسعير والمواصفات وما إلى ذلك.
  • تجنب الحظر
    • التأخير العشوائي
    • باستخدام الوكلاء
    • تقليد المتصفحات الحقيقية
  • وضع كل ذلك معا
    • واجهة برمجة تطبيقات البحث ← عناوين URL للمنتج ← كشط
    • التعامل مع مجموعات النتائج الكبيرة

في النهاية، سيكون لديك مكشطة Walmart تعمل بكامل طاقتها بلغة Python وجاهزة لاستخراج آلاف المنتجات. هيا بنا نبدأ!

اقامة

سوف نستخدم بايثون بالإضافة إلى العديد من الحزم الرئيسية:

  • طلبات - لتقديم طلبات HTTP إلى واجهة برمجة تطبيقات Walmart وصفحات الويب
  • الجميله 4 - تحليل HTML
  • الباندا - لمعالجة البيانات

تثبيتها عبر النقطة:

pip install requests beautifulsoup4 pandas

سنستخدم أيضًا وكلاء لتجنب الكتل التي يمكن شراؤها من مختلف مقدمي الخدمات.

العثور على المنتجات لكشط

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

استخدام واجهة برمجة تطبيقات البحث

يقدم Walmart واجهة برمجة تطبيقات للبحث تقوم بإرجاع بيانات JSON المنظمة. يمكننا الاستعلام عن واجهة برمجة التطبيقات هذه للعثور على المنتجات المطابقة للكلمات الرئيسية.

دعونا نجربه لـ "الكمبيوتر المحمول":

import requests

api_url = "https://www.walmart.com/terra-firma/api/search"

params = {
  "query": "laptop", 
  "sort": "price_low",
  "page": 1,
  " affiliateId": "test",
}

response = requests.get(api_url, params=params)
data = response.json()

print(data["items"][0]["productId"])
# prints a product ID, e.g. 1GY23EA#ABA

تعرض واجهة برمجة التطبيقات هذه نتائج مرقّمة بتنسيق JSON منظم يحتوي على:

  • productId – معرف Walmart لهذا المنتج
  • title - اسم المنتج
  • description - وصف نصي قصير
  • price - السعر الحالي
  • وأكثر من ذلك ...

يمكننا التكرار من خلال الصفحات لجمع المعرفات والبيانات.

أحد القيود هو أن واجهة برمجة التطبيقات (API) تسمح فقط بجلب ما يصل إلى 1000 نتيجة. للحصول على مزيد من التغطية، سيتعين علينا استخدام أساليب أخرى أيضًا.

تحليل صفحات الفئة

يوفر Walmart أيضًا صفحات فئات قابلة للتصفح يمكننا تحليلها:

https://www.walmart.com/browse/electronics/laptops/3944_3951_132959?povid=113750++2019-11-04+15%3A05%3A24.517-06%3A00&povid=113750++2019-11-04+15%3A05%3A24.517-06%3A00&affinityOverride=default

تحتوي هذه الصفحات على شبكات المنتجات التي نراها على موقع Walmart.

لاستخراج المنتجات، سنستخدم الحساء الجميل:

from bs4 import BeautifulSoup
import requests

url = "https://www.walmart.com/browse/electronics/laptops/3944_3951_132959"

response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")

products = soup.select(".search-result-gridview-item")

for product in products:
  title = product.select_one(".search-result-product-title").text
  link = product.select_one(".search-result-product-title")["href"]

  print(title, link)

يؤدي هذا إلى توزيع منتجات عرض الشبكة/القائمة، مع الحصول على العنوان وعنوان URL.

يمكننا بعد ذلك إدخال عناوين URL في مكشطة منتجاتنا.

يمكن أن تحتوي صفحات الفئات على آلاف المنتجات عبر العديد من الصفحات، لذلك تتمتع هذه الطريقة بتغطية كبيرة.

التعامل مع الحدود

بين واجهة برمجة تطبيقات البحث وصفحات الفئات، يمكننا اكتشاف 10,000 منتج. ولكن هناك بعض الحدود التي يجب مراعاتها:

  • تسمح واجهة برمجة تطبيقات البحث بجلب 1000 نتيجة فقط
  • تحتوي كل صفحة فئة على 24 صفحة كحد أقصى، و50 منتجًا تقريبًا في كل صفحة

لذا، للحصول على كشط شامل، سيتعين علينا أن نكون مبدعين:

  • استخدم استعلامات بحث متعددة مع مرشحات ضيقة
  • كشط عبر صفحات فئات متعددة
  • قم بتوسيع النطاق، على سبيل المثال. تجريف جميع أجهزة الكمبيوتر المحمولة عبر الإلكترونيات

مع القليل من التكرار، يمكننا إنشاء مجموعة كبيرة من أكثر من 10,000 عنوان URL للمنتج مناسبة لتغذيتها في مكشطة البيانات الخاصة بنا.

كشط صفحات المنتج

بمجرد حصولنا على عناوين URL أو معرفات المنتج، يمكننا استخراج البيانات من صفحات المنتج نفسها.

تحتوي صفحات منتجات Walmart على مجموعة غنية من المعلومات التي يمكننا استخراجها:

  • وصف العنوان
  • الصور
  • الأسعار، بيانات المبيعات
  • تفاصيل
  • معلومات البائع
  • التقييمات
  • منتجات ذات صله
  • توافر المخزون

وأكثر من ذلك.

دعونا نسير عبر تجريف بعض القطع الرئيسية.

كشط تفاصيل المنتج

تحتوي صفحات المنتج على كائن JavaScript يسمى window.__WML_REDUX_INITIAL_STATE__ مع الكثير من البيانات المنظمة:

<script>
  window.__WML_REDUX_INITIAL_STATE__ = {
    "product": {
      "id": "1GY23EA#ABA",
      "usItemId": "497219257", 
      "name": "HP 14-inch Laptop, Intel Core i3-1005G1, 4GB SDRAM, 128GB SSD, Pale Gold, Windows 10 Home",
      "description": "A laptop with the performance you need and..."
      ...
    }
    ...
  }
</script>

يمكننا استخراج هذا وتحليل JSON للحصول على حقول مثل:

import json
import requests
from bs4 import BeautifulSoup

product_url = "https://www.walmart.com/ip/497219257" 

response = requests.get(product_url)
soup = BeautifulSoup(response.text, ‘html.parser‘)

data = soup.find("script", {"id": "__WML_REDUX_INITIAL_STATE__"})
product_data = json.loads(data.contents[0])["product"]

title = product_data["name"]
walmart_id = product_data["usItemId"]
description = product_data["description"]

print(title)
# "HP 14-inch Laptop, Intel Core i3-1005G1, 4GB SDRAM, 128GB SSD, Pale Gold, Windows 10 Home" 

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

كشط وسائل الإعلام

يتم تضمين وسائط المنتج مثل الصور في كتلة نصية أخرى، imageAssets:

<script>
window.__WML_REDUX_INITIAL_STATE__.pdpData.item.imageAssets = [
  {
    "assetSize": "medium",
    "assetUrl": "https://i5.walmartimages.com/...", 
    "baseAsset": {...},
    "thumbnailUrl": "https://i5.walmartimages.com/..." 
  },
  {...}
];
</script>

يمكننا استخراج الأصول وتكرارها للعثور على عناوين URL ذات الأحجام المختلفة:

images = []

for asset in product_data["imageAssets"]:
  img_url = asset["assetUrl"]
  images.append(img_url)

print(images[0])
# "https://i5.walmartimages.com/asr/e95444a3-2e8b-41d2-a585-4f3ea9fc51b6.345fba144e9df8a6d290b2ed3857e90b.jpeg"

يتيح لنا ذلك الحصول على جميع صور المنتج بدقة مختلفة.

كشط الأسعار والمخزون

للحصول على تفاصيل أساسية مثل الأسعار والتوفر، يتم تضمين البيانات في علامة نص برمجي أخرى:

<script>
window.__WML_REDUX_INITIAL_STATE__.pdpData.item.priceInfo =  {
  "priceDisplayCodes": {
    "rollback": true,
    "reducedPrice": true    
  },
  "currentPrice": {
    "currencyUnit": "USD", 
    "price": 399
  }
  ...

يمكننا تحليل حقول التسعير:

price_data = product_data["priceInfo"]

regular_price = price_data["wasPrice"]["price"] # 499 
sale_price = price_data["currentPrice"]["price"] # 399
on_sale = "rollback" in price_data["priceDisplayCodes"] # True

print(f"On sale for {sale_price}, regular {regular_price}")

وبالمثل بالنسبة لحالة المخزون، الواردة في availabilityStatus:

in_stock = product_data["availabilityStatus"] == "IN_STOCK"

بتجميع كل ذلك معًا، يمكننا إنشاء أدوات استخراج لتفاصيل المنتج والوسائط والتسعير والمخزون والمزيد!

تجنب الكتل

عند إلغاء Walmart على نطاق واسع، من المحتمل أن نواجه عمليات حظر بسبب عدد كبير جدًا من الطلبات. إليك بعض النصائح لتجنب ذلك:

  • الحد من معدل الطلب - التزم بـ 2-3 طلبات في الثانية كحد أقصى

  • عشوائية التأخير - أدخل تأخيرات عشوائية تتراوح من 2 إلى 5 ثوانٍ بين الطلبات

  • تدوير وكلاء المستخدم - محاكاة ساخرة لوكلاء مستخدم متصفح سطح المكتب المختلفين

  • استخدم الوكلاء - توجيه حركة المرور من خلال خدمات الوكيل السكنية

  • أعد المحاولة على الكتل - إذا تم حظرها، توقف مؤقتًا عن الكشط لمدة تزيد عن 30 دقيقة

من خلال هذه الاحتياطات، يمكننا استخراج الآلاف من منتجات Walmart بأمان.

توفر بعض خدمات الوكيل المدفوعة أيضًا عناوين IP ورؤوسًا دوارة متقدمة لتجنب الحظر. هذه يمكن أن تساعد في تجريف على نطاق أوسع.

وضع كل ذلك معا

أخيرًا، دعونا نربط المكونات الرئيسية معًا في أداة استخراج ويب Walmart كاملة.

التدفق العام سيكون:

  1. اكتشف المنتجات باستخدام واجهة برمجة تطبيقات البحث وصفحات الفئات
  2. جمع عناوين URL للمنتج
  3. قم بالتكرار عبر عناوين URL لاستخراج كل صفحة منتج
  4. استخراج التفاصيل والوسائط والتسعير والمخزون وما إلى ذلك.
  5. احفظ بيانات المنتج المسروقة في ملف CSV/JSON

إليك رمز المثال:

from bs4 import BeautifulSoup
import requests, json, time, random

# Product URL extraction functions...

def scrape_search_api(query):
  # Search API logic...

def scrape_category_pages(url):
  # Category parsing logic...  

product_urls = []

product_urls.extend(scrape_search_api("laptops"))
product_urls.extend(scrape_category_pages("https://www...")) 

# Add proxies here...

for url in product_urls:

  response = requests.get(url)

  soup = BeautifulSoup(response.text, ‘html.parser‘)

  # Extract product data...

  product = {
    "name": name,
    "description": description,
    "price": price,
    "images": images,
    "in_stock": in_stock
  }

  # Save product to CSV, database, etc...

  # Random delay  
  time.sleep(random.uniform(2, 5))

يؤدي هذا إلى تنفيذ القطع الأساسية التي قمنا بتغطيتها:

  • إنشاء عناوين URL للمنتج لتغذيتها في المكشطة
  • تحليل كل صفحة منتج باستخدام BeautifulSoup
  • استخراج التفاصيل والوسائط والتسعير والمخزون
  • إضافة وكلاء وتأخير عشوائي لتجنب الكتل
  • حفظ البيانات المسروقة إلى ملف

باستخدام هذا الهيكل، يمكننا استخراج واستخراج الآلاف من منتجات Walmart بقوة.

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

نبذة عامة

في هذا الدليل، قمنا ببناء أداة استخراج بيانات ويب شاملة لبيانات منتج Walmart باستخدام Python.

وشملت التقنيات الرئيسية ما يلي:

  • استخدام واجهة برمجة تطبيقات بحث Walmart وصفحات الفئات لإنشاء عناوين URL للمنتج
  • تحليل صفحات المنتج واستخراج التفاصيل والوسائط والتسعير والمخزون
  • تجنب الكتل باستخدام الوكلاء والتأخير والانتحال
  • ربط البحث ← كشط المنتج ← حفظ سير العمل

يمكن لهذه الأساليب استخراج الآلاف من منتجات Walmart بقوة. يمكن بعد ذلك استخدام البيانات لمراقبة الأسعار وأبحاث السوق والدروبشيبينغ والمزيد.

مع بعض التحسينات مثل تعدد مؤشرات الترابط وتخزين قاعدة البيانات، سيكون لديك حل قوي لاستخلاص البيانات من Walmart جاهز للنشر على نطاق واسع.

الوسوم (تاج):

الانضمام إلى محادثة

لن يتم نشر عنوان بريدك الإلكتروني. الحقول المشار إليها إلزامية *