Passer au contenu

Comment gratter le Web Walmart.com

Walmart est le plus grand détaillant au monde avec plus de 10,000 24 magasins répartis dans XNUMX pays. Compte tenu de son énorme inventaire et de ses riches données sur les produits, Walmart est une cible extrêmement précieuse pour le web scraping.

Dans ce guide complet, nous expliquerons comment créer un grattoir Web pour extraire les données des produits Walmart à grande échelle.

Vue d’ensemble

Voici un bref aperçu des étapes clés que nous aborderons :

  • Trouver des produits à gratter
    • Utilisation de l'API de recherche Walmart
    • Analyse des pages de catégories
    • Gérer les limites de résultats
  • Grattage des pages de produits
    • Analyser les données produit
    • Supports de grattage, prix, spécifications, etc.
  • Éviter le blocage
    • Retards randomisés
    • Utilisation de proxys
    • Imitant de vrais navigateurs
  • Rassemblement
    • API de recherche → URL des produits → scrape
    • Gestion de grands ensembles de résultats

À la fin, vous disposerez d'un grattoir Walmart entièrement fonctionnel en Python, prêt à extraire des milliers de produits. Commençons!

installation

Nous utiliserons Python ainsi que plusieurs packages clés :

  • demandes – pour envoyer des requêtes HTTP à l'API et aux pages Web de Walmart
  • bellesoupe4 – Analyse HTML
  • pandas – pour la manipulation de données

Installez-les via pip :

pip install requests beautifulsoup4 pandas

Nous utiliserons également proxies pour éviter les blocages, qui peuvent être achetés auprès de différents fournisseurs.

Trouver des produits à gratter

La première étape consiste à découvrir les URL ou identifiants de produits à alimenter dans notre scraper. Nous pouvons utiliser plusieurs approches :

Utilisation de l'API de recherche

Walmart propose une API de recherche qui renvoie des données JSON structurées. Nous pouvons interroger cette API pour trouver des produits correspondant à des mots-clés.

Essayons-le pour "ordinateur portable" :

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

Cette API renvoie des résultats paginés dans un format JSON structuré contenant :

  • productId – l'identifiant Walmart de ce produit
  • title – nom du produit
  • description – brève description textuelle
  • price - prix actuel

Nous pouvons parcourir les pages pour collecter des identifiants et des données.

Une limitation est que l'API ne permet de récupérer que jusqu'à 1000 XNUMX résultats. Pour obtenir une plus grande couverture, nous devrons également utiliser d'autres approches.

Analyse des pages de catégorie

Walmart propose également des pages de catégories consultables que nous pouvons analyser :

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

Ces pages contiennent les grilles de produits que nous voyons sur le site Walmart.

Pour extraire les produits, nous utiliserons Beautiful Soup :

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)

Cela analyse les produits de la vue Grille/Liste, en récupérant le titre et l'URL.

Nous pouvons ensuite insérer les URL dans notre grattoir de produits.

Les pages de catégories peuvent contenir des milliers de produits sur plusieurs pages, cette méthode offre donc une grande couverture.

Gérer les limites

Entre l’API de recherche et les pages de catégories, nous pouvons découvrir des dizaines de milliers de produits. Mais il y a quelques limites à considérer :

  • L'API de recherche permet uniquement de récupérer 1000 XNUMX résultats
  • Chaque page de catégorie comporte 24 pages maximum, ~50 produits par page

Donc, pour un scratch complet, nous devrons faire preuve de créativité :

  • Utilisez plusieurs requêtes de recherche avec des filtres restrictifs
  • Parcourez plusieurs pages de catégories
  • Élargissez la portée, par exemple. gratter tous les ordinateurs portables de l'électronique

Avec un peu d'itération, nous pouvons créer un vaste corpus de plus de 10,000 XNUMX URL de produits pouvant être alimentées par notre scraper.

Grattage des pages de produits

Une fois que nous avons les URL ou les identifiants des produits, nous pouvons extraire les données des pages de produits elles-mêmes.

Les pages de produits Walmart contiennent un riche ensemble d'informations que nous pouvons extraire :

  • Description du titre
  • Ajouter des images
  • Prix, données de ventes
  • Spécifications
  • Informations sur le vendeur
  • Avis
  • Produits associés
  • Disponibilité des stocks

Et plus encore.

Passons en revue quelques éléments clés.

Détails du produit de grattage

Les pages produits contiennent un objet JavaScript appelé window.__WML_REDUX_INITIAL_STATE__ avec une grande partie des données structurées :

<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>

Nous pouvons extraire ceci et analyser le JSON pour obtenir des champs tels que :

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" 

Ce champ JSON contient la plupart des informations de base sur le produit que nous souhaitons extraire.

Médias de grattage

Les médias du produit comme les images sont contenus dans un autre bloc de script, imageAssets:

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

Nous pouvons parcourir et parcourir les ressources pour trouver les URL de différentes tailles :

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"

Cela nous permet d'obtenir toutes les images du produit à différentes résolutions.

Prix ​​de grattage et inventaire

Pour les détails clés tels que les prix et la disponibilité, les données sont contenues dans une autre balise de script :

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

Nous pouvons analyser les champs de tarification :

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}")

Et de même pour l'état des stocks, contenu dans le availabilityStatus:

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

En mettant tout cela ensemble, nous pouvons créer des grattoirs pour les détails des produits, les supports, les prix, l'inventaire et bien plus encore !

Éviter les blocages

Lors du scraping de Walmart à grande échelle, nous rencontrerons probablement des blocages dus à un trop grand nombre de demandes. Voici quelques conseils pour éviter cela :

  • Limiter le taux de demande – s’en tenir à 2-3 requêtes par seconde maximum

  • Randomiser les retards – insérer des délais aléatoires de 2 à 5 secondes entre les demandes

  • Rotation des agents utilisateurs – usurper différents agents utilisateurs du navigateur de bureau

  • Utiliser des proxys – acheminer le trafic via des services proxy résidentiels

  • Réessayer sur les blocs – en cas de blocage, suspendez le grattage pendant plus de 30 minutes

Avec ces précautions, nous pouvons gratter des milliers de produits Walmart en toute sécurité.

Certains services proxy payants proposent également des adresses IP et des en-têtes rotatifs avancés pour éviter les blocages. Ceux-ci peuvent aider à un grattage à plus grande échelle.

Rassemblement

Enfin, regroupons les composants clés dans un grattoir Web Walmart complet.

Le flux général sera :

  1. Découvrez des produits à l'aide de l'API de recherche et des pages de catégories
  2. Collecter les URL des produits
  3. Parcourez les URL pour gratter chaque page de produit
  4. Extrayez les détails, les médias, les prix, l'inventaire, etc.
  5. Enregistrer les données produit récupérées au format CSV/JSON

Voici un exemple de code :

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))

Cela implémente les éléments clés que nous avons abordés :

  • Générer des URL de produits à alimenter dans le scraper
  • Analyser chaque page produit avec BeautifulSoup
  • Extraction des détails, des médias, des prix, de l'inventaire
  • Ajout de proxys et de délais aléatoires pour éviter les blocages
  • Enregistrer les données récupérées dans un fichier

Avec cette structure, nous pouvons gratter et extraire des milliers de produits Walmart de manière robuste.

Le code complet contiendrait une gestion des erreurs plus avancée, le multithreading, etc. Mais cela couvre la logique de base et le flux de travail.

Résumé

Dans ce guide, nous avons expliqué la création d'un grattoir Web complet pour les données des produits Walmart à l'aide de Python.

Les techniques clés comprenaient :

  • Utilisation de l'API de recherche et des pages de catégories de Walmart pour générer des URL de produits
  • Analyser les pages de produits et extraire les détails, les médias, les prix et l'inventaire
  • Éviter les blocages avec les proxys, les retards et l'usurpation d'identité
  • Lier la recherche → la récupération du produit → enregistrer le flux de travail

Ces approches peuvent extraire des milliers de produits Walmart de manière robuste. Les données peuvent ensuite être utilisées pour le suivi des prix, les études de marché, le dropshipping et bien plus encore.

Avec quelques améliorations telles que le multithreading et le stockage de base de données, vous disposerez d'une puissante solution de scraping Walmart prête pour un déploiement à grande échelle.

Mots clés:

Prendre part à la conversation

Votre adresse email n'apparaitra pas. Les champs obligatoires sont marqués *