Le prix est le seul champ d'une page produit Walmart qui change tandis que tout le reste demeure stable. Le titre, la marque, le modèle restent fixes, mais le nombre affiché à côté du bouton d'achat évolue selon les promotions, la demande et les réajustements saisonniers. Si vous souhaitez suivre cette évolution, comparer un panier d'articles ou surveiller le catalogue d'un concurrent, vous devez relever ce prix régulièrement au fil du temps et consigner chaque lecture quelque part pour pouvoir l'analyser graphiquement.

Ce guide vous montre comment scraper les prix Walmart avec Python et les transformer en un journal continu que vous pouvez analyser. Vous construirez un scraper fonctionnel qui récupère une page produit Walmart rendue via la Crawling API, extrait le titre et le prix du HTML avec BeautifulSoup, et ajoute chaque lecture dans des fichiers JSON et CSV horodatés pour suivre l'évolution du prix dans le temps. Nous limitons volontairement la démonstration aux données de produits et de listes publiques, et la section sur la légalité vers la fin n'est pas un simple avertissement générique, lisez-la avant de viser un volume réel.

Ce que vous allez construire

Un script Python qui prend une URL de produit Walmart, récupère la page rendue via la Crawling API, extrait un enregistrement structuré et l'ajoute à un journal de prix horodaté. Nous utilisons un iPhone reconditionné comme exemple fil rouge et relevons ces champs sur chaque page produit :

  • Titre le nom du produit, par exemple "Restored Apple iPhone 13, Carrier Unlocked, 128GB Red".
  • Prix le prix affiché à côté du bouton d'achat.
  • Remise le montant économisé en dollars, lorsque la fiche le précise.
  • Note la note moyenne en étoiles, lorsque le produit a des avis.
  • Horodatage une heure ISO ajoutée au moment du scraping afin que chaque lecture soit un point traçable sur un graphique.

Pourquoi une requête classique échoue sur Walmart

Si vous sollicitez une URL de produit Walmart avec un client HTTP brut, vous obtenez une réponse avec le statut 200 mais quasiment aucune donnée de prix dans le corps. Deux obstacles se dressent contre vous. Premièrement, Walmart construit ses pages produit côté client : le HTML initial est une coquille vide qui n'affiche le titre, le prix et la note qu'une fois que le JavaScript de la page s'est exécuté dans un navigateur. Deuxièmement, Walmart détecte rapidement le trafic automatisé. Les adresses IP de datacenters et les schémas de requêtes qui ne ressemblent pas à un vrai navigateur se voient confrontés à un CAPTCHA ou bloqués avant même d'atteindre le prix rendu.

Un scraper de prix fonctionnel a donc besoin de deux éléments réunis en une seule requête : un navigateur qui rend réellement la page, et une adresse IP que la plateforme perçoit comme celle d'un vrai acheteur. Vous pouvez assembler cela vous-même avec un navigateur sans interface graphique et un pool de proxies résidentiels rotatifs, mais connecter ces composants et les maintenir en bonne santé représente l'essentiel du travail. La Crawling API les réunit en un seul appel : vous lui envoyez l'URL avec un token JavaScript, elle rend la page derrière une adresse IP résidentielle de confiance, et vous renvoie le HTML final à analyser.

Pourquoi le token JS

Crawlbase propose deux types de tokens. Le token normal récupère le HTML statique ; le token JavaScript (JS) rend d'abord la page dans un vrai navigateur. Walmart charge les prix et les notes côté client, vous avez donc besoin du token JS ici. Utiliser le token normal renvoie la même coquille vide qu'une récupération ordinaire, et l'élément prix n'y figure tout simplement pas.

Prérequis

Quelques éléments doivent être en place avant d'écrire le moindre code. Aucun ne prend longtemps.

Python de base. Vous devez être à l'aise pour écrire et exécuter un script Python et installer des paquets avec pip. Si vous débutez avec ce langage, notre tutoriel sur le scraping d'un site web avec Python couvre les bases supposées dans ce guide.

Python 3.8 ou version ultérieure. 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. Le niveau gratuit inclut jusqu'à 20 000 requêtes sans carte bancaire, ce qui est largement suffisant pour construire et tester ce scraper. Traitez le token comme un mot de passe : il authentifie vos requêtes, ne le mettez donc pas dans un dépôt de code.

Configurer le projet

Créez un environnement virtuel pour isoler les dépendances du projet, puis installez les trois bibliothèques nécessaires au scraper.

bash
python --version

python -m venv walmart_env
source walmart_env/bin/activate

pip install crawlbase beautifulsoup4 pandas

Sur Windows, activez l'environnement avec walmart_env\Scripts\activate au lieu de la ligne source. Trois dépendances font le travail : crawlbase est le client officiel pour la Crawling API, beautifulsoup4 analyse le HTML renvoyé afin d'extraire chaque champ par sélecteur CSS, et pandas gère l'export CSV en fin de traitement pour que votre historique de prix s'ouvre proprement dans n'importe quel tableur.

Comprendre la page produit Walmart

Une page produit Walmart concentre beaucoup d'informations sur un seul écran : un titre, un carrousel d'images, un bloc de prix, une note en étoiles avec un nombre d'avis, une description et les détails du vendeur. Pour le suivi des prix, seuls quelques-uns de ces éléments vous intéressent. Les champs qui comptent sont le titre (pour savoir à quel article appartient une lecture), le prix actuel, le montant de la remise ou de l'économie lorsqu'il est affiché, et la note.

Avant d'écrire des sélecteurs, ouvrez une page produit dans votre navigateur, faites un clic droit sur le prix et choisissez Inspecter. Vous verrez le prix exposé via un attribut itemprop="price" à l'intérieur d'un conteneur price-wrap, le titre dans un élément h1#main-title, et les économies et la note repérables via des marqueurs data-testid. Ce sont ces attributs que vous ciblez. Les noms de classes utilitaires de Walmart changent souvent, mais les attributs sémantiques sont plus durables : préférez-les lorsque c'est possible.

Étape 1 : Récupérer la page produit rendue

Commencez par obtenir la page finale. Importez la classe CrawlingAPI, initialisez-la avec votre token JS et demandez l'URL du produit. Vérifier le code de statut avant d'analyser rend les échecs visibles plutôt que silencieux.

python
from crawlbase import CrawlingAPI

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

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

if __name__ == "__main__":
    url = "https://www.walmart.com/ip/Restored-Apple-iPhone-13-Carrier-Unlocked-128-GB-Red-Refurbished/462799546"
    html = crawl(url)
    print(html[:500] if html else "No HTML returned")

Les deux options d'attente sont importantes 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 maintient un délai fixe en millisecondes après le chargement pour que le bloc de prix apparaisse avant la capture de la page. Trois secondes est un point de départ raisonnable ; augmentez cette valeur si le prix revient vide. Le corps est décodé en latin1 car les pages Walmart mélangent des caractères qui peuvent faire échouer un décodage UTF-8 strict. Exécutez le script et vous devriez voir le balisage réel du produit, et non la coquille vide que renverrait une récupération ordinaire. Cela confirme que le rendu fonctionne avant même que vous n'écriviez le moindre sélecteur.

Crawlbase Walmart Scraper

Ce bloc de prix n'existe qu'une fois que Walmart a rendu la page derrière une adresse IP de confiance, ce qui est exactement ce sur quoi s'appuie la fonction crawl ci-dessus. La Crawling API prend un token JS, exécute la page dans un vrai navigateur, fait tourner des adresses IP résidentielles côté serveur et vous remet le HTML final, vous évitant ainsi de gérer une flotte de navigateurs sans interface et un pool de proxies. Pointez-la vers une URL de produit sur le niveau gratuit en premier.

Étape 2 : Extraire le titre et le prix avec BeautifulSoup

HTML rendu en main, chargez-le dans BeautifulSoup et extrayez chaque champ par son sélecteur. Le prix se trouve dans un span portant itemprop="price" à l'intérieur du conteneur price-wrap, le titre dans h1#main-title, et les économies et la note derrière leurs marqueurs data-testid. Un petit utilitaire renvoie une chaîne vide lorsqu'un élément est absent, afin qu'un champ manquant ne fasse pas planter l'exécution.

python
from bs4 import BeautifulSoup
from datetime import datetime, timezone

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

def parse_product(html):
    soup = BeautifulSoup(html, "html.parser")
    return {
        "title": text_of(soup, "h1#main-title"),
        "price": text_of(soup, 'span[data-testid="price-wrap"] span[itemprop="price"]'),
        "discount": text_of(soup, 'div[data-testid="dollar-saving"] span:last-child'),
        "rating": text_of(soup, 'div[data-testid="reviews-and-ratings"] span.rating-number'),
        "scraped_at": datetime.now(timezone.utc).isoformat(),
    }

L'utilitaire text_of interroge un seul élément et renvoie une chaîne vide lorsqu'il est absent, évitant ainsi de déclencher une exception sur un appel .get_text() contre rien. Cela rend l'extraction robuste face à un champ absent, ce qui est courant car toutes les fiches ne comportent pas une remise ou une note. Le prix provient du span itemprop="price", l'emplacement canonique où Walmart indique le prix actuel, et scraped_at horodate chaque enregistrement au moment de sa lecture. Cet horodatage est ce qui transforme un scraping ponctuel en une série de prix traçable ultérieurement.

Les sélecteurs dérivent

Les noms de classes utilitaires de Walmart changent sans préavis, et les valeurs data-testid sur les blocs de prix et d'économies évoluent occasionnellement eux aussi. Considérez les sélecteurs ci-dessus comme un modèle de départ, non comme un contrat. Lorsque le prix revient vide sur une page où vous savez qu'il est affiché, réinspectez la page produit en direct dans les outils de développement de votre navigateur et mettez à jour le sélecteur. Une maintenance périodique des sélecteurs est normale pour tout scraper en production, ce n'est pas le signe que quelque chose est cassé.

Étape 3 : Ajouter chaque lecture à un journal de prix

Reliez maintenant la récupération et l'analyse en un script exécutable et ajoutez chaque lecture dans un fichier JSON et un fichier CSV. Ajouter plutôt qu'écraser est tout l'enjeu : chaque exécution ajoute une ligne datée par produit, et sur plusieurs jours ou semaines ces lignes forment un historique de prix que vous pouvez représenter graphiquement.

python
import json
import os
import pandas as pd
from bs4 import BeautifulSoup
from datetime import datetime, timezone
from crawlbase import CrawlingAPI

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

PRODUCTS = [
    "https://www.walmart.com/ip/Restored-Apple-iPhone-13-Carrier-Unlocked-128-GB-Red-Refurbished/462799546",
]

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

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

def parse_product(html, url):
    soup = BeautifulSoup(html, "html.parser")
    return {
        "title": text_of(soup, "h1#main-title"),
        "price": text_of(soup, 'span[data-testid="price-wrap"] span[itemprop="price"]'),
        "discount": text_of(soup, 'div[data-testid="dollar-saving"] span:last-child'),
        "rating": text_of(soup, 'div[data-testid="reviews-and-ratings"] span.rating-number'),
        "url": url,
        "scraped_at": datetime.now(timezone.utc).isoformat(),
    }

def append_json(record, path="walmart_prices.json"):
    history = []
    if os.path.exists(path):
        with open(path) as f:
            history = json.load(f)
    history.append(record)
    with open(path, "w") as f:
        json.dump(history, f, indent=2)
    return history

def main():
    for url in PRODUCTS:
        html = crawl(url)
        if not html:
            continue
        record = parse_product(html, url)
        append_json(record)
        print(json.dumps(record, indent=2))

    history = json.load(open("walmart_prices.json"))
    pd.DataFrame(history).to_csv("walmart_prices.csv", index=False)

if __name__ == "__main__":
    main()

La fonction append_json lit l'historique existant, ajoute la nouvelle lecture et réécrit la liste complète, de sorte que le fichier JSON grossit d'un enregistrement à chaque exécution. Après la boucle, le script reconstruit walmart_prices.csv à partir de cet historique avec pandas, ce qui vous donne un tableau plat que vous pouvez ouvrir dans n'importe quel tableur pour réaliser des graphiques. Ajoutez une URL à la liste PRODUCTS et le même code suit plusieurs articles à la fois. Pour collecter des lectures dans le temps, planifiez ce script en tâche cron quotidienne : chaque exécution ajoute une nouvelle ligne datée par produit.

À quoi ressemble le résultat

Exécutez le script complet avec python scraper.py et chaque lecture s'affiche en JSON et s'enregistre dans votre journal de prix. Après quelques exécutions sur quelques jours, le fichier JSON contient une petite série par produit.

json
[
  {
    "title": "Restored Apple iPhone 13, Carrier Unlocked, 128 GB Red (Refurbished)",
    "price": "$449.00",
    "discount": "$200.00",
    "rating": "(4.4)",
    "url": "https://www.walmart.com/ip/...462799546",
    "scraped_at": "2026-06-09T14:05:33+00:00"
  },
  {
    "title": "Restored Apple iPhone 13, Carrier Unlocked, 128 GB Red (Refurbished)",
    "price": "$429.00",
    "discount": "$220.00",
    "rating": "(4.4)",
    "url": "https://www.walmart.com/ip/...462799546",
    "scraped_at": "2026-06-10T14:04:11+00:00"
  }
]

Les deux enregistrements partagent un titre et une URL mais diffèrent sur le prix et la date, ce qui est exactement la forme dont le suivi des prix a besoin. À partir de là, charger walmart_prices.csv dans pandas vous permet de calculer le prix minimum, maximum et moyen par produit, de signaler une baisse en dessous d'un seuil ou de tracer la série. Si vous souhaitez transformer ce journal en vue comparative multi-enseignes, le guide complémentaire sur la construction d'un outil de comparaison de prix prend le relais là où celui-ci s'arrête.

Scraper les prix sur de nombreux produits

Suivre une seule fiche est une démonstration ; un vrai travail surveille un panier de produits, et souvent vous n'avez pas les URLs des produits à l'avance. Pour construire ce panier, vous scrapez d'abord une page de résultats de recherche, récoltez les liens produits, puis exécutez le scraper de prix ci-dessus sur chacun d'eux. L'extraction de ces liens depuis une page de recherche Walmart est une tâche à part, couverte en détail dans notre guide sur le scraping des pages de recherche Walmart avec Python. Une fois les URLs disponibles, injectez-les dans la liste PRODUCTS et la boucle relève un prix pour chacun.

Cadencez la boucle pour ne pas marteler Walmart en rafale serrée. Un court délai entre les requêtes de produits maintient votre taux de requêtes bas et votre exécution saine, la même discipline que toute cible commerciale exigeante récompense.

python
import time

def track_prices(urls):
    readings = []
    for url in urls:
        html = crawl(url)
        if not html:
            continue
        record = parse_product(html, url)
        append_json(record)
        readings.append(record)
        print(f"{record['title'][:40]}: {record['price']}")
        time.sleep(2)
    return readings

Le time.sleep(2) entre les produits est le plancher, non le plafond : augmentez-le pour des paniers plus grands. Comme append_json écrit après chaque produit, une exécution qui échoue à mi-parcours conserve quand même les lectures déjà collectées, vous ne perdez donc pas un long travail à cause d'une seule page défectueuse.

Rester non bloqué

Même avec le rendu pris en charge, Walmart surveille le trafic à l'allure d'un scraper. Quelques bonnes pratiques maintiennent une exécution saine, et elles s'appliquent à toute cible commerciale exigeante.

  • Cadencez vos requêtes. Espacez les requêtes avec un délai entre les produits et évitez de re-scraper la même fiche plus souvent que nécessaire. Pour le suivi des prix, une ou deux fois par jour par produit suffit généralement à détecter tout changement significatif.
  • Misez sur la rotation. Un pool d'adresses IP résidentielles répartit les requêtes sur de nombreuses adresses d'utilisateurs réels, de sorte qu'aucune n'atteint un seuil de débit. La Crawling API s'en charge pour vous ; si vous constituez votre propre pile, c'est la partie à bien soigner.
  • Lisez les codes de statut. Une exécution qui commence à renvoyer 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, non comme du bruit à ignorer.

Pour le guide de stratégie plus large, consultez notre article sur comment scraper des sites sans se faire bloquer. Si vous souhaitez scraper une seule fiche en profondeur, notamment les données de variantes et de spécifications, le guide complémentaire sur le scraping d'une page produit Walmart avec Selenium va plus loin que le seul prix, et le cas général pour le suivi des prix concurrents est exposé dans l'utilisation du web scraping pour l'intelligence des prix.

Est-il légal de scraper Walmart ?

La légalité du scraping de Walmart dépend des conditions d'utilisation de Walmart, de votre juridiction et de ce que vous faites des 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 votre outillage. Aucun des codes présentés ici ne change cela ; il rend simplement la partie technique fonctionnelle. Lisez les Conditions d'utilisation de Walmart et son fichier robots.txt, et traitez les deux comme la limite de ce que vous collectez.

Quelques lignes directrices à respecter. Collectez uniquement les données publiques : les titres de produits, les prix, les remises et les notes que n'importe qui peut voir sur une page produit ou de recherche sans compte. Respectez les attentes de débit de Walmart et maintenez votre volume de requêtes suffisamment bas pour ne pas solliciter excessivement ses serveurs, ce qui est facile pour le suivi des prix car une lecture par jour et par produit est amplement suffisante. Évitez les données personnelles, y compris tout ce qui est lié à des acheteurs, évaluateurs ou vendeurs identifiables au-delà de ce qui est publiquement listé. Si vous envisagez de réutiliser les prix 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 publiques de produits et de listes car c'est la limite qui rend ce travail défendable. Il ne couvre rien derrière une connexion, les données de compte ou de commande, les informations personnelles, les flux de paiement ou de paiement, ni aucune tentative de contournement de 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 lorsque vous avez besoin de grands volumes, d'une structure garantie ou de droits commerciaux. Si votre projet nécessite plus que des prix publics, une API officielle ou un accord de données est la bonne voie, non un scraper plus astucieux.

Récapitulatif

Points clés

  • Les prix Walmart sont rendus côté client. Une récupération simple renvoie une coquille vide, vous devez donc rendre la page avec un token JS avant que l'élément prix existe à analyser.
  • Ciblez les attributs durables. Extrayez le prix depuis le span itemprop="price" et le titre depuis h1#main-title ; prévoyez que les noms de classes environnants évolueront et réinspectez lorsqu'un champ revient vide.
  • Un horodatage transforme un scraping en série. Horodatez chaque lecture avec scraped_at et ajoutez plutôt qu'écrasez, et vos fichiers JSON et CSV deviennent un historique de prix traçable.
  • Passez de la recherche au panier. Récoltez les URLs de produits depuis une page de recherche, injectez-les dans la boucle, cadencez les requêtes avec un délai et exécutez selon un calendrier quotidien pour suivre dans le temps.
  • Restez sur les données publiques. Respectez les CGU de Walmart et son robots.txt, 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 une requête simple ne renvoie-t-elle aucun prix de Walmart ?

Parce que Walmart charge le prix dans la page côté client avec JavaScript. Le HTML initial est une coquille vide, et l'élément prix n'apparaît qu'une fois que les scripts de la page s'exécutent dans un navigateur. Une requête HTTP brute renvoie donc le statut 200 avec le prix absent. Pour le lire, vous devez d'abord rendre la page, ce dont le token JS de la Crawling API s'occupe pour vous.

Comment suivre un prix Walmart dans le temps ?

Exécutez le scraper selon un calendrier, une ou deux fois par jour, et ajoutez chaque lecture dans les mêmes fichiers JSON et CSV avec un horodatage. L'utilitaire append_json de ce guide ajoute un enregistrement daté par exécution au lieu d'écraser, de sorte que le fichier devient une série de prix. Chargez ce CSV dans pandas pour calculer le minimum, le maximum et la moyenne, ou pour signaler une baisse en dessous d'un seuil.

Puis-je scraper les prix de plusieurs produits à la fois ?

Oui. Ajoutez chaque URL de produit à la liste PRODUCTS, ou passez une liste d'URLs à la fonction track_prices, et la boucle relève un prix pour chacun. Si vous n'avez pas les URLs à l'avance, scrapez d'abord une page de recherche Walmart pour collecter les liens produits, puis injectez ces liens dans la boucle. Maintenez un court délai entre les requêtes pour cadencer l'exécution.

Mon sélecteur de prix renvoie une chaîne vide. Qu'est-ce qui a changé ?

Très certainement le balisage de Walmart. Ses noms de classes utilitaires changent sans préavis, et les valeurs data-testid autour des blocs de prix et d'économies évoluent occasionnellement eux aussi. Réinspectez une page produit en direct dans les outils de développement de votre navigateur, préférez les cibles durables itemprop="price" et h1#main-title lorsque possible, et mettez à jour les sélecteurs. Une maintenance périodique est normale pour tout scraper en production.

Dois-je stocker les prix en CSV, JSON ou dans une base de données ?

Pour quelques produits suivis sur plusieurs semaines, les fichiers JSON et CSV de ce guide suffisent et s'ouvrent partout. À mesure que l'historique grandit ou que vous suivez des centaines d'articles, passez à une base de données comme SQLite ou PostgreSQL pour pouvoir interroger par plage de dates et par produit sans charger le fichier entier. La structure des enregistrements reste la même ; seule la couche de stockage change.

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

Maintenez un faible taux de requêtes par IP, ajoutez un délai entre les produits, ne re-scrapez pas la même fiche plus souvent que nécessaire, et routez via des adresses IP résidentielles rotatives pour qu'aucune adresse unique n'atteigne un seuil de débit. La Crawling API gère la rotation et un pool d'IP de confiance pour vous ; si vous construisez votre propre pile, c'est la partie sur laquelle investir. Surveillez les codes de statut et ralentissez lorsque 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