Le catalogue de Walmart est l'une des sources publiques de données retail les plus riches du web : chaque requête de recherche renvoie une grille de fiches produits avec des noms, des prix, des notes en étoiles, des nombres d'avis et des liens vers chaque page produit. Ces données servent au suivi des prix des concurrents, à la recherche de marché, à l'analyse des assortiments et au suivi des tendances. Le problème est que Walmart rend ces fiches dans le navigateur et se défend fortement contre le trafic automatisé, de sorte qu'une requête HTTP ordinaire vous donne une coquille JavaScript plutôt que les produits que vous cherchez.

Ce guide vous explique comment scraper les résultats de recherche Walmart avec Python de façon fiable. Vous construisez un petit scraper opérationnel qui récupère une page de résultats rendue via la Crawling API, analyse la grille de résultats avec BeautifulSoup et extrait un enregistrement propre pour chaque fiche : nom du produit, prix, évaluation, nombre d'avis et lien. Nous limitons le tutoriel aux données de recherche et de liste publiques, et la section juridique en fin d'article n'est pas un simple formulaire, lisez-la avant de pointer ce script sur un volume réel.

Ce que vous allez construire

Un script Python qui prend une requête de recherche Walmart, récupère la page de résultats rendue via la Crawling API et extrait un enregistrement structuré par produit. Nous utilisons une recherche iPhone comme exemple fil directeur et extrayons ces champs depuis chaque fiche :

  • Nom le titre du produit, par exemple "Apple iPhone 15, 128GB, Black".
  • Prix le prix affiché sur la fiche.
  • Évaluation la note moyenne en étoiles, quand le produit en a une.
  • Avis le nombre d'avis clients derrière cette note.
  • Lien l'URL vers la page détail du produit.

Pourquoi un fetch ordinaire échoue sur Walmart

Si vous demandez une URL de recherche Walmart avec un client HTTP basique, vous obtenez une réponse avec le statut 200 et presque aucune donnée produit dans le corps. Deux facteurs jouent contre vous. D'abord, Walmart construit sa grille de recherche côté client : le HTML initial est une coquille qui ne se remplit qu'après l'exécution du JavaScript de la page dans un navigateur. Ensuite, Walmart signale rapidement le trafic automatisé. Les IP de datacenter et les schémas de requêtes qui ne ressemblent pas à un vrai navigateur sont challengés avec un CAPTCHA ou bloqués avant d'atteindre les fiches rendues.

Un scraper Walmart fonctionnel a donc besoin de deux choses en une seule requête : un navigateur qui rend réellement la page, et une IP que la plateforme lit comme un vrai acheteur. Vous pouvez assembler cela vous-même avec un navigateur headless et un pool de proxies résidentiels rotatifs, mais connecter ces briques et les maintenir en bonne santé représente la majeure partie du travail. La Crawling API regroupe les deux en un seul appel : vous lui envoyez l'URL avec un token JavaScript, elle rend la page derrière une IP résidentielle de confiance et vous renvoie le HTML complet à analyser.

Pourquoi le token JS

Crawlbase propose deux types de tokens. Le token normal récupère du HTML statique ; le token JavaScript (JS) rend d'abord la page dans un vrai navigateur. La grille de recherche de Walmart est rendue côté client, vous avez donc besoin du token JS ici. Utiliser le token normal renvoie la même coquille vide qu'un fetch ordinaire, et il n'y a rien à analyser dedans.

Prérequis

Quelques éléments doivent être en place avant d'écrire le moindre code. Rien de long à mettre en oeuvre.

Bases de Python. Vous devez être à l'aise pour écrire et exécuter un script Python et installer des paquets avec pip. Si vous débutez avec le langage, la documentation officielle Python et n'importe quel cours pour débutants vous amèneront au niveau qu'assume ce tutoriel.

Python 3.8 ou supérieur. Vérifiez votre version avec python --version. Si vous ne l'avez pas, installez-le depuis python.org ou via une distribution comme Anaconda.

Un compte Crawlbase et un token JS. Inscrivez-vous, ouvrez votre tableau de bord et copiez votre token JavaScript (JS) depuis la page de documentation du compte. Traitez le token comme un mot de passe : il authentifie vos requêtes, gardez-le hors du contrôle de version.

Configurer le projet

Créez un environnement virtuel pour que les dépendances du projet restent isolées, puis installez les deux bibliothèques dont le scraper a besoin.

bash
python --version

python -m venv walmart_env
source walmart_env/bin/activate

pip install crawlbase beautifulsoup4

Sur Windows, activez l'environnement avec walmart_env\Scripts\activate plutôt que la ligne source. Deux dépendances font le travail : crawlbase est le client officiel pour la Crawling API, et beautifulsoup4 analyse le HTML retourné pour que vous puissiez extraire chaque champ de la grille de résultats par sélecteur CSS.

Comprendre la page de recherche Walmart

Une page de résultats de recherche Walmart affiche une grille de fiches produits, une par fiche. Chaque fiche porte les mêmes quelques champs : un titre, un prix, une note en étoiles avec un nombre d'avis et un lien vers la page détail du produit. Sous la grille se trouvent des contrôles de pagination qui vous permettent de parcourir les pages de résultats supplémentaires pour la même requête.

Avant d'écrire les sélecteurs, ouvrez une page de recherche dans votre navigateur, faites un clic droit sur une fiche produit et choisissez Inspecter. Vous verrez chaque fiche enveloppée dans un conteneur avec des attributs de données stables, et le titre, le prix et l'évaluation exposés via des marqueurs data-automation-id. Ce sont ces attributs que vous ciblez. Les noms de classes utilitaires de Walmart changent souvent, mais les IDs d'automatisation sont plus durables, misez donc dessus où vous pouvez.

Étape 1 : Récupérer la page de recherche rendue

Commencez par obtenir la page complète. Importez la classe CrawlingAPI, initialisez-la avec votre token JS, construisez l'URL de recherche à partir d'une requête et demandez-la. Vérifier le code de statut avant d'analyser permet de rendre les échecs visibles plutôt que silencieux.

python
from crawlbase import CrawlingAPI

api = CrawlingAPI({"token": "YOUR_CRAWLBASE_JS_TOKEN"})

def crawl(page_url):
    options = {"ajax_wait": "true", "page_wait": 5000}
    response = api.get(page_url, options)
    if response["status_code"] == 200:
        return response["body"].decode("latin1")
    print(f"Request failed: {response['status_code']}")
    return None

if __name__ == "__main__":
    query = "iPhone"
    search_url = f"https://www.walmart.com/search?q={query}"
    html = crawl(search_url)
    print(html[:500] if html else "No HTML returned")

Les deux options d'attente importent pour une cible rendue côté client comme celle-ci. ajax_wait indique à l'API d'attendre que le contenu asynchrone finisse de se charger, et page_wait attend un nombre fixe de millisecondes après le chargement pour que la grille à rendu tardif apparaisse avant la capture de la page. Cinq secondes est un bon point de départ ; augmentez si des fiches reviennent manquantes. Le corps est décodé en latin1 car les pages Walmart contiennent des caractères qui peuvent faire échouer un décodage UTF-8 strict. Exécutez le script et vous devriez voir un vrai balisage produit, pas la coquille vide qu'un fetch ordinaire renvoie. Cela confirme que le rendu fonctionne avant d'écrire un seul sélecteur.

Crawlbase Walmart Scraper

Walmart nécessite une page rendue derrière une IP de confiance, en un seul appel. La Crawling API prend un token JS, exécute la page dans un vrai navigateur, effectue une rotation via des IP résidentielles côté serveur et vous remet le HTML complet, pour que vous n'ayez pas à gérer vous-même une flotte headless et un pool de proxies. Pointez-la d'abord sur une requête de recherche avec l'offre gratuite.

Étape 2 : Analyser la grille de résultats avec BeautifulSoup

Une fois le HTML rendu disponible, chargez-le dans BeautifulSoup, trouvez chaque fiche produit et extrayez chaque champ par son sélecteur. Walmart enveloppe chaque fiche dans un conteneur que vous pouvez sélectionner et expose le titre et le prix via des attributs data-automation-id. Lisez le lien depuis l'ancre de la fiche et analysez la chaîne combinée d'évaluation et d'avis en deux valeurs. Enveloppez chaque fiche dans un try/except pour qu'une fiche malformée ne fasse pas planter toute l'exécution.

python
from bs4 import BeautifulSoup

def text_of(card, selector):
    el = card.select_one(selector)
    return el.get_text(strip=True) if el else None

def parse_rating(card):
    el = card.select_one("span.w_iUH7")
    if not el:
        return None, None
    text = el.get_text(strip=True)
    rating = text.split(" out of")[0] if "out of" in text else None
    reviews = None
    if "reviews" in text:
        reviews = text.split("Stars.")[-1].replace("reviews", "").strip()
    return rating, reviews

def scrape_results(html):
    soup = BeautifulSoup(html, "html.parser")
    cards = soup.select("div[data-item-id]")
    results = []
    for card in cards:
        try:
            rating, reviews = parse_rating(card)
            link = card.select_one("a[href]")
            results.append({
                "name": text_of(card, 'span[data-automation-id="product-title"]'),
                "price": text_of(card, 'div[data-automation-id="product-price"] span.f2'),
                "rating": rating,
                "reviews": reviews,
                "link": link["href"] if link else None,
            })
        except Exception as e:
            print(f"Skipped a card: {e}")
    return results

Le helper text_of interroge un seul élément dans une fiche et retourne None quand l'élément est manquant, au lieu de lever une exception sur un appel .get_text() sur rien. Cela rend l'extraction résiliente quand un champ est absent, ce qui est courant car toutes les fiches ne portent pas une évaluation. Le prix est lu depuis le span du nombre entier dans le bloc de prix, et le lien produit vient du href de l'ancre de la fiche plutôt que de son texte. Le helper parse_rating découpe la chaîne combinée "4.2 out of 5 Stars. 3244 reviews" de Walmart en une note numérique et un nombre d'avis pour les stocker comme champs séparés.

Les sélecteurs évoluent

Les noms de classes utilitaires de Walmart (le span de prix span.f2, la chaîne d'évaluation span.w_iUH7) changent sans préavis, et les attributs du conteneur de fiche évoluent aussi occasionnellement. Traitez les sélecteurs ci-dessus comme un modèle de départ, pas comme un contrat. Quand un champ revient None pour chaque fiche, réinspectez la page de recherche en direct dans les outils de développement de votre navigateur et mettez à jour le sélecteur. Une maintenance périodique est normale pour tout scraper en production, ce n'est pas le signe d'un problème.

Étape 3 : Assembler le tout

Reliez maintenant la récupération et l'analyse en un seul script exécutable. Récupérez la page de recherche rendue, transmettez-la au parseur et affichez les enregistrements structurés.

python
import json
from crawlbase import CrawlingAPI
from bs4 import BeautifulSoup

api = CrawlingAPI({"token": "YOUR_CRAWLBASE_JS_TOKEN"})

def crawl(page_url):
    options = {"ajax_wait": "true", "page_wait": 5000}
    response = api.get(page_url, options)
    if response["status_code"] == 200:
        return response["body"].decode("latin1")
    print(f"Request failed: {response['status_code']}")
    return None

def text_of(card, selector):
    el = card.select_one(selector)
    return el.get_text(strip=True) if el else None

def parse_rating(card):
    el = card.select_one("span.w_iUH7")
    if not el:
        return None, None
    text = el.get_text(strip=True)
    rating = text.split(" out of")[0] if "out of" in text else None
    reviews = None
    if "reviews" in text:
        reviews = text.split("Stars.")[-1].replace("reviews", "").strip()
    return rating, reviews

def scrape_results(html):
    soup = BeautifulSoup(html, "html.parser")
    cards = soup.select("div[data-item-id]")
    results = []
    for card in cards:
        try:
            rating, reviews = parse_rating(card)
            link = card.select_one("a[href]")
            results.append({
                "name": text_of(card, 'span[data-automation-id="product-title"]'),
                "price": text_of(card, 'div[data-automation-id="product-price"] span.f2'),
                "rating": rating,
                "reviews": reviews,
                "link": link["href"] if link else None,
            })
        except Exception as e:
            print(f"Skipped a card: {e}")
    return results

def main():
    query = "iPhone"
    search_url = f"https://www.walmart.com/search?q={query}"
    html = crawl(search_url)
    if not html:
        return
    data = scrape_results(html)
    print(json.dumps(data, indent=2))

if __name__ == "__main__":
    main()

À quoi ressemble le résultat

Exécutez le script complet avec python scraper.py et vous obtenez une liste propre d'enregistrements, un par résultat, prêts à écrire en JSON, CSV ou dans une base de données.

json
[
  {
    "name": "AT&T Apple iPhone 11, 64GB, Black - Prepaid Smartphone",
    "price": "399",
    "rating": "3.8",
    "reviews": "202",
    "link": "https://www.walmart.com/ip/..."
  },
  {
    "name": "Straight Talk Apple iPhone 11, 64GB, Black",
    "price": "249",
    "rating": "4.2",
    "reviews": "3244",
    "link": "https://www.walmart.com/ip/..."
  }
]

Gérer la pagination sur plusieurs pages de résultats

Une page est une démonstration ; un vrai projet s'exécute sur toutes les pages de résultats d'une requête. Walmart pagine la recherche avec un paramètre &page=, vous parcourez donc les pages en l'incrémentant et en vous arrêtant quand une page ne renvoie aucune fiche. Cela évite de coder en dur un nombre de pages et gère naturellement les requêtes avec seulement quelques résultats.

python
import time

def scrape_all_pages(query, max_pages=5):
    base = f"https://www.walmart.com/search?q={query}"
    all_results = []
    for page in range(1, max_pages + 1):
        page_url = f"{base}&page={page}"
        html = crawl(page_url)
        if not html:
            break
        results = scrape_results(html)
        if not results:
            break
        all_results.extend(results)
        print(f"Page {page}: {len(results)} products")
        time.sleep(2)
    return all_results

Le plafond max_pages maintient une exécution bornée pour qu'une requête large ne tourne pas indéfiniment, et la rupture sur résultats vides vous arrête tôt quand Walmart est à court de pages. Le time.sleep(2) entre les pages cadence les requêtes pour que vous ne marteliez pas la recherche en boucle serrée, ce qui est la façon la plus rapide d'être limité. Ajustez les deux en fonction de votre volume et des limites de débit ci-dessous.

Rester non bloqué

Même avec le rendu pris en charge, Walmart surveille le trafic ressemblant à celui de scrapers. Quelques habitudes maintiennent une exécution en bonne santé, et elles s'appliquent à toute cible commerciale difficile.

  • Cadencez vos requêtes. Espacez les requêtes avec un délai entre les pages et variez vos requêtes au lieu de crawler un terme à plein débit. Le time.sleep dans la boucle de pagination est le plancher, pas le plafond.
  • Misez sur la rotation. Un pool d'IP résidentielles répartit les requêtes sur de nombreuses adresses d'utilisateurs réels de sorte qu'aucune ne déclenche une limite de débit. La Crawling API gère cela pour vous ; si vous construisez votre propre infrastructure, c'est la partie à soigner.
  • Lisez les codes de statut. Une exécution qui commence à retourner des challenges ou des erreurs vous indique que le débit ou le niveau d'IP actuel n'est plus suffisant. Traitez cela comme un signal pour ralentir, pas comme du bruit à ignorer.

Pour le guide plus complet, consultez comment contourner les captchas lors du scraping web, et si vous voulez scraper une seule fiche en profondeur après avoir collecté des liens de recherche, le guide complémentaire sur le scraping d'une page produit Walmart avec Selenium prend le relais. Pour des chiffres sur la façon dont une API gérée se comporte face à un pool de proxies bruts sur cette cible, le benchmark des proxies de scraping Walmart vaut la lecture. Si vous préférez router votre propre trafic via un pool rotatif plutôt qu'utiliser l'API gérée, le Smart AI Proxy (également appelé AI Proxy) vous donne la même rotation d'IP résidentielles sous la forme d'un endpoint proxy drop-in.

Est-il légal de scraper Walmart ?

La question de savoir si le scraping de Walmart est autorisé dépend des conditions d'utilisation de Walmart, de votre juridiction et de ce que vous faites avec les données. Les conditions de Walmart restreignent l'accès automatisé, de sorte que le scraping peut aller à l'encontre de ces conditions quelle que soit la prudence de vos outils. Rien dans le code ci-dessus ne change cela ; il rend seulement la partie technique fonctionnelle. Lisez les Conditions d'utilisation de Walmart et son robots.txt, et traitez les deux comme la limite de ce que vous collectez.

Quelques lignes à respecter. Collectez uniquement les données publiques : les noms de produits, les prix, les évaluations, les nombres d'avis et les liens de liste que tout le monde peut voir sur une page de résultats de recherche sans compte. Respectez les attentes déclarées de Walmart en matière de débit et maintenez votre volume de requêtes suffisamment bas pour ne pas solliciter ses serveurs. Évitez les données personnelles, y compris tout ce qui est lié à des acheteurs, évaluateurs ou vendeurs identifiables au-delà de ce qui est listé publiquement sur une page de résultats. Si vous prévoyez de réutiliser les données commercialement, obtenez une autorisation ou un accord officiel plutôt que de supposer que le silence vaut consentement.

Ce guide est délibérément limité aux pages de recherche et de liste publiques car c'est la ligne qui maintient le travail défendable. Il ne couvre rien derrière un accès connecté, les données de compte ou de commande, les informations personnelles, les flux de paiement ou toute tentative de contourner l'authentification. Pour un accès sous licence ou en volume, Walmart propose des API officielles et des programmes partenaires, et c'est le bon outil quand vous avez besoin de grands volumes, d'une structure garantie ou de droits commerciaux. Si votre projet nécessite plus que des listes publiques, une API officielle ou un accord de données est la bonne voie, pas un scraper plus ingénieux.

Récapitulatif

Points clés

  • La recherche Walmart est rendue côté client. Un fetch ordinaire renvoie une coquille vide, vous devez donc rendre la page avant de l'analyser.
  • Vous avez besoin du rendu et d'une IP de confiance ensemble. La Crawling API avec un token JS fait les deux en un seul appel ; ajax_wait et page_wait contrôlent le temps d'attente pour la grille.
  • BeautifulSoup fait l'extraction. Parcourez les fiches de résultats et mappez le nom, le prix, l'évaluation, les avis et le lien vers les sélecteurs actuels, en vous attendant à ce que ces sélecteurs évoluent.
  • Paginez avec le paramètre page. Parcourez &page= jusqu'à ce qu'une page ne retourne aucune fiche, cadencez les requêtes avec un délai et limitez le nombre de pages.
  • Restez sur les données publiques. Respectez les CGU et le robots.txt de Walmart, préférez une API Walmart officielle pour les données sous licence ou en volume, et ne touchez jamais aux comptes, commandes ou informations personnelles.

Foire aux questions

Pourquoi un fetch ordinaire ne retourne-t-il aucun produit depuis Walmart ?

Parce que Walmart construit sa grille de recherche côté client avec JavaScript. Le HTML initial est une coquille qui ne se remplit qu'après l'exécution des scripts de la page dans un navigateur, donc une requête HTTP brute renvoie le statut 200 avec les fiches vides. Pour obtenir des données réelles, vous devez d'abord rendre la page, ce que le token JS de la Crawling API gère pour vous.

Ai-je besoin du token normal ou du token JS pour Walmart ?

Le token JS. Le token normal récupère du HTML statique, ce qui sur Walmart est la même coquille vide qu'un fetch ordinaire renvoie. Le token JS rend la page dans un vrai navigateur avant de retourner le HTML, de sorte que les fiches produits sont présentes quand BeautifulSoup les analyse.

Comment scraper toutes les pages d'une recherche Walmart ?

Walmart pagine avec un paramètre &page= sur l'URL de recherche. Incrémentez-le dans une boucle, scrapez chaque page avec le même parseur et arrêtez-vous quand une page ne renvoie aucune fiche. Limitez le nombre de pages et ajoutez un court délai entre les requêtes pour cadencer l'exécution et éviter la limitation.

Mes sélecteurs retournent None. Qu'est-ce qui a changé ?

Presque certainement le balisage de Walmart. Ses noms de classes utilitaires comme span.f2 pour le prix et span.w_iUH7 pour la chaîne d'évaluation changent sans préavis, et les attributs du conteneur de fiche évoluent aussi occasionnellement. Réinspectez une page de recherche en direct dans les outils de développement de votre navigateur, préférez les marqueurs data-automation-id plus durables où vous pouvez, et mettez à jour les sélecteurs. Une maintenance périodique est normale pour tout scraper en production.

Puis-je scraper les données de commande, de compte ou de paiement sur Walmart ?

Non, et ce guide ne le couvre pas. L'historique des commandes, les détails des comptes et les flux de paiement se trouvent derrière un accès connecté, ils ne sont donc pas des données publiques. Scraper du contenu protégé par connexion, ou contourner l'authentification pour y accéder, est hors périmètre ici et va à l'encontre des conditions de Walmart. Pour un accès autorisé à des données plus riches, la bonne voie est une API Walmart officielle ou un accord partenaire.

Comment éviter d'être bloqué lors du scraping de Walmart ?

Maintenez un débit de requêtes bas par IP, ajoutez un délai entre les pages, variez vos requêtes au lieu de boucler sur un seul terme et routez via des IP résidentielles rotatives de sorte qu'aucune adresse ne déclenche une limite de débit. La Crawling API gère la rotation et un pool d'IP de confiance pour vous ; si vous construisez votre propre infrastructure, c'est la partie dans laquelle investir. Surveillez les codes de statut et ralentissez quand vous commencez à voir des challenges.

Commencer à construire

Crawlez n'importe quel site à grande échelle, sans combattre l'infrastructure.

Crawlbase gère les proxies, les empreintes et les CAPTCHA afin que votre équipe livre des pipelines de données au lieu de maintenir la plomberie de crawl. 1 000 requêtes gratuites, sans carte requise.

En libre-service · Sans appel commercial requis · Volumes de crawl entreprise disponibles