Comment extraire les données produits de Walmart : JSON, prix géographiques, blocages

Walmart n'a pas d'API publique, personnalise chaque page et protège les scrapers avec un CAPTCHA à maintenir. Mais son JSON Next.js vous offre des données structurées propres — si votre IP passe la porte. Voici toute la méthode.

Walmart est le plus grand détaillant mondial, ce qui fait de ses prix un signal économique en direct — et il n'y a pas d'API publique Walmart pour les lire. Donc, les gens extraient. La bonne nouvelle : Walmart est un site Next.js, et chaque page produit contient un seul blob JSON avec toutes les données propres déjà analysées. La mauvaise nouvelle : une IP de centre de données rencontre un CAPTCHA à maintenir avant de voir ce JSON. Ce guide couvre la méthode fiable — lisez le JSON d'hydratation au lieu du HTML stylisé, passez la défense anti-bot de HUMAN avec la bonne IP, et récupérez les prix géographiques au niveau des magasins.

Arrêtez d'analyser les balises. Lisez le JSON __NEXT_DATA__

La plupart des tutoriels vous apprennent à trouver le h1 pour le titre et un span pour le prix. Cela fonctionne jusqu'à ce que Walmart réorganise ses noms de classe, ce qui arrive souvent. L'approche durable : Walmart rend React à partir d'une balise script avec id="__NEXT_DATA__" contenant le modèle complet du produit en JSON. Saisissez-le une fois et chaque champ est structuré :

import requests, json
from bs4 import BeautifulSoup

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
                  "(KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36",
    "Accept-Language": "en-US,en;q=0.9",
}
proxies = {"http": "http://USER:PASS@gate.quantumproxies.io:8000",
           "https": "http://USER:PASS@gate.quantumproxies.io:8000"}

url = "https://www.walmart.com/ip/1756765288"
r = requests.get(url, headers=headers, proxies=proxies, timeout=20)

soup = BeautifulSoup(r.text, "html.parser")
blob = soup.find("script", id="__NEXT_DATA__")
data = json.loads(blob.string)
product = data["props"]["pageProps"]["initialData"]["data"]["product"]
print(product["name"], product["priceInfo"]["currentPrice"]["price"])

Le chemin exact des clés change avec le temps, alors imprimez les clés de niveau supérieur une fois et naviguez à partir de là. Mais le principe reste : le JSON est la source de vérité, et il inclut le prix, la disponibilité, le vendeur, les variantes et les évaluations en un seul endroit — pas de sélecteur par champ à casser.

La porte : "Robot ou humain ?"

Exécutez la requête depuis une IP de centre de données nue et vous n'obtiendrez pas le JSON produit — vous obtiendrez une page qui dit "Robot ou humain ? Activez et maintenez le bouton pour confirmer que vous êtes humain." C'est HUMAN (anciennement PerimeterX), la couche de défense anti-bot que Walmart utilise. Elle évalue la réputation de l'IP, l'empreinte TLS et les en-têtes ensemble, et un défi à maintenir est ce qu'elle sert lorsque le score est bas.

Vous ne résolvez pas ce CAPTCHA ; vous évitez de le déclencher. Le levier le plus important est l'IP. Un proxy résidentiel se présente comme la connexion d'un véritable acheteur Walmart, ce qui maintient le score suffisamment élevé pour servir la vraie page. Les plages de centres de données sont pré-évaluées comme suspectes et rencontrent le mur dès la première requête. Notre analyse de comment HUMAN détecte l'automatisation couvre ce qui alimente également ce score.

Pipeline pour extraire les données produits de Walmart : URL du produit via une sortie résidentielle vers le JSON __NEXT_DATA__ et lignes structurées
Passez par une sortie résidentielle, puis lisez le JSON d'hydratation — pas de sélecteurs HTML fragiles sur le chemin.

Prix géographiques : un produit, plusieurs prix

Les prix et stocks de Walmart sont spécifiques aux magasins. Le même article affiche un prix et une disponibilité différents selon le lieu d'achat, donc un scraper sans emplacement défini lit un magasin arbitraire. Définissez l'emplacement par code postal pour contrôler le magasin que vous évaluez — Walmart le conserve dans un cookie d'emplacement, alors envoyez-le à chaque requête :

# pin the store location by US ZIP before reading price/stock
cookies = {"assortmentStoreId": "3081", "locationData": '{"postalCode":"10001"}'}

r = requests.get(url, headers=headers, cookies=cookies,
                 proxies=proxies, timeout=20)
# now priceInfo + availabilityStatus reflect that store

Pour comparer un produit sur plusieurs marchés, bouclez votre liste de codes postaux et associez chacun à une sortie résidentielle dans cette région — un acheteur de New York lisant les prix des magasins de NYC est bien plus cohérent qu'une requête qui prétend un emplacement mais sort ailleurs. Cette cohérence géographique est exactement ce sur quoi repose la surveillance des prix des concurrents.

Pages de recherche et pagination

Pour le travail de catalogue, extrayez les résultats de recherche, pas seulement les pages produits. Deux choses à savoir : Walmart personnalise l'ordre de recherche par utilisateur, donc ne vous attendez pas à un classement stable à chaque exécution, et les résultats s'étendent sur plusieurs pages que vous parcourez avec un paramètre page. Le même modèle __NEXT_DATA__ s'applique — le JSON de recherche contient la liste complète des articles avec les prix et les identifiants, donc vous n'avez rarement besoin de toucher la page produit à moins que vous ne vouliez des détails au niveau des variantes :

def search(query, pages=5):
    items = []
    for page in range(1, pages + 1):
        url = f"https://www.walmart.com/search?q={query}&page={page}"
        html = requests.get(url, headers=headers, cookies=cookies,
                            proxies=proxies, timeout=20).text
        blob = BeautifulSoup(html, "html.parser").find("script", id="__NEXT_DATA__")
        data = json.loads(blob.string)
        stacks = data["props"]["pageProps"]["initialData"]["searchResult"]["itemStacks"]
        for stack in stacks:
            items += stack["items"]
    return items

Quand arrêter de le faire à la main

Les requêtes brutes plus les IP résidentielles vous mènent loin sur Walmart. Le point où cela cesse d'être rentable est l'échelle : faire tourner les sorties par requête, réessayer celles qui rencontrent encore le mur, et garder la logique du cookie de magasin cohérente à travers des milliers de codes postaux est une vraie charge de maintenance. Une API de Scraper qui transporte l'empreinte du navigateur, fait tourner les IP résidentielles et peut renvoyer le JSON analysé réduit cela à un seul appel — vous envoyez une URL Walmart et obtenez le modèle de produit en retour, les blocages gérés. Si votre page revient sous forme de coquille CAPTCHA au lieu de données, c'est le symptôme classique de page vide et c'est un problème de rendu et d'IP, pas un bug de parseur.

CAPTCHA à maintenir de Walmart HUMAN bloquant une IP de centre de données tandis qu'une IP résidentielle passe pour obtenir le JSON produit propre
Vous ne résolvez pas la barrière à maintenir — vous gardez votre score de confiance suffisamment élevé pour qu'elle n'apparaisse jamais.

Obtenez des IP résidentielles qui atteignent Walmart

Questions fréquemment posées

Walmart a-t-il une API de données produits ?

Il n'y a pas d'API publique ouverte pour des données produits et prix arbitraires, c'est pourquoi l'extraction est la voie courante. Les API d'affiliation et de vendeurs de marché de Walmart existent mais sont limitées et restreintes. Pour une collecte large de produits, prix et disponibilité, lire le JSON __NEXT_DATA__ de la page via des IP résidentielles est la méthode pratique.

Comment extraire les prix de Walmart sans être bloqué ?

Faites passer les requêtes par des proxies résidentiels pour que la défense anti-bot de HUMAN vous évalue comme un véritable acheteur, envoyez un User-Agent et un Accept-Language de navigateur cohérents, et lisez le JSON d'hydratation plutôt que de marteler de nombreuses requêtes de sélecteurs. Fixez le magasin par cookie de code postal et gardez la région de sortie cohérente avec celui-ci. Cette combinaison évite le CAPTCHA à maintenir sur la plupart des requêtes.

Pourquoi Walmart affiche-t-il des prix différents pour le même produit ?

Les prix et stocks de Walmart sont au niveau des magasins. Le prix que vous voyez dépend de l'emplacement défini pour la session, donc deux requêtes avec des emplacements de code postal différents renvoient légitimement des prix différents. Pour collecter des données comparables, fixez le code postal explicitement et faites correspondre votre sortie proxy à cette région plutôt que de laisser Walmart deviner à partir de l'IP.

Le JSON __NEXT_DATA__ est-il meilleur que l'analyse HTML ?

Oui, pour la durabilité. Les noms de classe visibles de Walmart changent fréquemment, cassant les scrapers de sélecteurs CSS, mais le JSON d'hydratation Next.js est un modèle structuré stable du produit avec prix, variantes, vendeur et disponibilité en un seul objet. Analysez le JSON une fois et vous évitez une pile de sélecteurs fragiles par champ.

Walmart n'est pas difficile parce que les données sont cachées — elles sont là dans le JSON de la page. C'est difficile parce que la porte vérifie qui frappe. Lisez __NEXT_DATA__ au lieu des balises, définissez le magasin par code postal, et frappez avec une IP résidentielle, et vous obtenez des données produits propres et comparables à grande échelle. Pour le travail de prix des grandes surfaces plus généralement, le même plan s'étend à Best Buy et Target.

Extraire Walmart avec un seul appel API