Walmart gère l'un des plus grands catalogues de vente au détail du web, et presque tout est public : résultats de recherche, pages de détail de produits, avis clients, classements des meilleures ventes et emplacements sponsorisés dispersés dans les résultats de recherche et de catégorie. Ces données alimentent le suivi des prix, la recherche concurrentielle, l'analyse d'assortiment et les prévisions de la demande, ce qui explique pourquoi les développeurs continuent de les cibler. Le problème est de les extraire proprement, car Walmart rend la plupart d'une page dans le navigateur et challenge agressivement le trafic automatisé.

Ce guide est la feuille de route pour l'ensemble du cluster Walmart. Il cartographie les surfaces de données que vous pouvez extraire, explique pourquoi une simple requête HTTP revient presque vide, et présente un exemple complet exécutable en JavaScript et Node.js : une page de résultats de recherche Walmart analysée en JSON structuré avec cheerio, récupérée via la Crawling API. Il se limite aux données de produits publiques, vous oriente vers les guides plus approfondis sur les prix, les avis, les meilleures ventes et les publicités, et se termine par un bilan honnête du côté juridique. Lisez cette section avant de pointer ce script sur un volume réel.

Les surfaces de données Walmart que vous pouvez extraire

Avant tout code, il est utile de savoir ce qui est réellement disponible. Walmart expose plusieurs surfaces publiques distinctes, et chacune est un travail d'extraction différent avec sa propre mise en page et ses propres sélecteurs. Traitez ceci comme la carte du cluster :

La technique est la même pour tous : rendre la page, puis analyser les champs souhaités avec des sélecteurs CSS. L'exemple ici utilise les résultats de recherche car la mise en page des cartes montre presque tous les types de champs que Walmart possède, donc une fois que vous pouvez lire une carte SERP, vous pouvez lire le reste.

Ce que vous allez construire

Un script Node.js qui prend une URL de recherche publique Walmart, récupère le HTML rendu via la Crawling API et extrait un enregistrement structuré pour chaque produit sur la page de résultats. Nous utilisons la requête "iphone 14 pro" comme exemple de référence et extrayons ces champs par article :

  • Titre le nom du produit, par exemple "Straight Talk Apple iPhone 14 Pro Max, 128GB, Silver".
  • Prix le prix affiché, comme "1,099".
  • Devise le symbole de devise, par exemple "$".
  • Note la chaîne de notation, telle que "4.4 out of 5 Stars. 31 reviews".
  • Nombre d'avis le nombre d'avis sur la carte.
  • Message de livraison la ligne d'exécution, comme "Free shipping, arrives in 3+ days".
  • Badge produit un badge de carte comme "Popular pick" quand présent.
  • Statut de stock "In Stock" ou "Out of stock".
  • Est sponsorisé un indicateur booléen pour les emplacements payants.
  • Image l'URL de la vignette du produit.

Pourquoi une requête simple échoue sur Walmart

Si vous demandez une URL de recherche Walmart avec un client HTTP ordinaire, vous obtenez une réponse qui manque presque tout ce que vous cherchez. Deux forces jouent contre vous. Premièrement, Walmart rend les prix, les notes, les messages de livraison et la plupart des détails des cartes dans le navigateur avec JavaScript, donc le HTML initial est une coquille vide jusqu'à ce que les scripts de la page s'exécutent. Deuxièmement, Walmart détecte rapidement le trafic automatisé : les adresses IP de centre de données et les schémas de requêtes qui ne ressemblent pas à un vrai navigateur se voient soumis à un défi, limités en débit ou bloqués avant même d'atteindre le contenu rendu.

Un scraper Walmart fonctionnel a donc besoin de deux choses en une seule requête : un navigateur qui rende réellement la page, et une adresse IP que la plateforme identifie comme un vrai visiteur. Vous pouvez assembler cela vous-même avec un navigateur sans tête et un pool de proxies résidentiels rotatifs, mais les connecter et les maintenir en bon état représente l'essentiel du travail. La Crawling API regroupe les deux en un seul appel : vous lui envoyez l'URL, elle rend la page derrière une IP de confiance et vous renvoie le HTML complet à analyser. Pour le côté proxies de ce compromis en particulier, le benchmark des proxies pour le scraping Walmart va plus loin.

Requêtes normales vs JavaScript

Crawlbase propose deux types de tokens. Le token normal récupère le HTML statique ; le token JavaScript rend la page dans un vrai navigateur d'abord. Walmart charge les champs clés des cartes côté client, le token JavaScript vous donne donc la page la plus complète. Le token normal peut renvoyer un résultat partiel avec des prix ou des notes manquants, ne vous laissant rien de fiable à analyser. Les requêtes JavaScript coûtent plus de crédits, utilisez-les donc là où la page en a réellement besoin.

Prérequis

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

JavaScript de base et Node.js. Vous devez être à l'aise pour écrire et exécuter un script Node et installer des paquets avec npm. Si vous êtes nouveau sur Node, la documentation officielle et n'importe quel cours pour débutant vous amèneront au niveau que ce tutoriel suppose. Pour un guide plus complet, voir notre guide sur la façon de construire un scraper web avec Node.js.

Node.js 16 ou supérieur. Vérifiez votre version avec node --version. Si vous ne l'avez pas, installez-le depuis le site Node.js ou via un gestionnaire de versions comme nvm.

Un compte Crawlbase et un token. Inscrivez-vous, ouvrez votre tableau de bord et copiez votre token depuis la page de documentation du compte. Vous obtenez 1 000 requêtes gratuites à l'inscription sans carte, ce qui est largement suffisant pour ce projet. 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 dossier de projet, initialisez-le et installez les deux bibliothèques dont le scraper a besoin.

bash
node --version

mkdir walmart-scraper && cd walmart-scraper
npm init -y

npm install crawlbase cheerio

Deux dépendances font le travail : crawlbase est le client Node officiel pour la Crawling API, et cheerio analyse le HTML renvoyé avec une API style jQuery pour extraire les champs individuels par sélecteur CSS. Si les sélecteurs sont nouveaux pour vous, le guide sur XPath et les sélecteurs CSS est un bon complément. La version précédente de ce projet utilisait également Express pour exposer un endpoint /scrape, ce qui est un bon schéma si vous voulez appeler le scraper via HTTP, mais c'est facultatif et nous gardons le script de base autonome ici.

É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 et demandez l'URL de recherche. Vérifier le code de statut avant d'analyser permet de rendre les échecs visibles plutôt que silencieux.

javascript
const { CrawlingAPI } = require('crawlbase');

const api = new CrawlingAPI({ token: 'YOUR_CRAWLBASE_TOKEN' });

async function crawl(pageUrl) {
  const response = await api.get(pageUrl);
  if (response.statusCode === 200) {
    return response.body;
  }
  console.error(`Request failed: ${response.statusCode}`);
  return null;
}

const searchUrl = 'https://www.walmart.com/search?q=iphone+14+pro';
crawl(searchUrl).then((html) => {
  console.log(html ? html.slice(0, 500) : 'No HTML returned');
});

Exécutez le script avec node scraper.js et vous devriez voir le vrai balisage Walmart, pas une coquille allégée. Cela confirme que le rendu et la rotation d'IP fonctionnent avant d'écrire le moindre sélecteur. Si le corps revient vide, la page nécessitait une requête JavaScript : passez à votre token JavaScript, qui rend la page dans un vrai navigateur avant de renvoyer le HTML.

Crawlbase Walmart Scraper

Ce premier appel vient de rendre une page de recherche Walmart derrière une IP de confiance sans que vous touchiez à un navigateur ou un proxy. La Crawling API exécute la page dans un vrai navigateur, fait tourner les IP résidentielles côté serveur et remet le HTML complet, vous évitant ainsi de gérer votre propre flotte sans tête et un pool de proxies. Pointez-la sur une page de recherche publique depuis le niveau gratuit d'abord.

Étape 2 : analyser chaque produit avec cheerio

Avec le HTML rendu en main, chargez-le dans cheerio et parcourez les cartes de résultats. Walmart présente chaque résultat de recherche dans un bloc list-view répétitif, vous sélectionnez donc chaque carte puis lisez les champs à l'intérieur. Les sélecteurs ci-dessous proviennent directement d'un SERP Walmart en direct. Lire chaque champ défensivement évite qu'une valeur manquante ne fasse planter l'exécution.

javascript
const cheerio = require('cheerio');

function parseProductsFromHTML(html) {
  const $ = cheerio.load(html);
  const products = [];

  $('div[role="group"] div[data-testid="list-view"]').each((_, element) => {
    const el = $(element);
    const title = el.find('[data-automation-id="product-title"]').text();
    if (!title) return;

    products.push({
      title,
      image: el.find('[data-testid="productTileImage"]').attr('src'),
      price: el.find('[data-automation-id="product-price"] .lh-copy span.f2').text(),
      currency: el.find('[data-automation-id="product-price"] .f6.f5-l:first').text(),
      reviewsCount: el.find('[aria-hidden=true].f7').text(),
      reviewStar: el.find('.flex.items-center.mt2 .w_iUH7').text(),
      deliveryMessage: el.find('[data-automation-id="fulfillment-badge"]').text().trim(),
      productBadge: el.find('.tag-leading-badge').text(),
      inventoryStatus: el.find('[data-automation-id="inventory-status"]').text() || 'In Stock',
      isSponsored: el.find('.lh-title > .gray.f7').text() ? true : false,
    });
  });

  return { products, productsCount: products.length };
}

Cette fonction parcourt chaque carte list-view sur la page et lit chaque champ par son sélecteur : title, image, price, currency, reviewsCount, reviewStar, deliveryMessage, productBadge, inventoryStatus et l'indicateur isSponsored. Le statut de stock revient à "In Stock" quand aucun marqueur de rupture de stock n'est présent, et isSponsored se résout en booléen en vérifiant la présence du petit label sponsorisé dans la carte. Cette même boucle est ce que vous adapteriez pour isoler les emplacements payants dans le travail publicitaire, puisque l'indicateur sponsorisé est déjà dans l'enregistrement.

Les sélecteurs évoluent

Les noms de classes et les marqueurs data-testid de Walmart changent sans préavis, et ils diffèrent entre les pages de recherche, de produits et de catégories. Traitez les sélecteurs ci-dessus comme un modèle de départ, pas comme un contrat. Quand un champ revient vide, inspectez à nouveau la page en direct dans les outils de développement de votre navigateur et mettez à jour le sélecteur. La 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 : assembler le tout

Reliez maintenant la récupération et l'analyse en un script exécutable unique. Récupérez le HTML rendu, passez-le au parseur et affichez les enregistrements structurés en JSON.

javascript
const { CrawlingAPI } = require('crawlbase');
const cheerio = require('cheerio');

const api = new CrawlingAPI({ token: 'YOUR_CRAWLBASE_TOKEN' });

async function crawl(pageUrl) {
  const response = await api.get(pageUrl);
  if (response.statusCode === 200) return response.body;
  console.error(`Request failed: ${response.statusCode}`);
  return null;
}

function parseProductsFromHTML(html) {
  const $ = cheerio.load(html);
  const products = [];
  $('div[role="group"] div[data-testid="list-view"]').each((_, element) => {
    const el = $(element);
    const title = el.find('[data-automation-id="product-title"]').text();
    if (!title) return;
    products.push({
      title,
      image: el.find('[data-testid="productTileImage"]').attr('src'),
      price: el.find('[data-automation-id="product-price"] .lh-copy span.f2').text(),
      currency: el.find('[data-automation-id="product-price"] .f6.f5-l:first').text(),
      reviewsCount: el.find('[aria-hidden=true].f7').text(),
      reviewStar: el.find('.flex.items-center.mt2 .w_iUH7').text(),
      deliveryMessage: el.find('[data-automation-id="fulfillment-badge"]').text().trim(),
      productBadge: el.find('.tag-leading-badge').text(),
      inventoryStatus: el.find('[data-automation-id="inventory-status"]').text() || 'In Stock',
      isSponsored: el.find('.lh-title > .gray.f7').text() ? true : false,
    });
  });
  return { products, productsCount: products.length };
}

async function main() {
  const searchUrl = 'https://www.walmart.com/search?q=iphone+14+pro';
  const html = await crawl(searchUrl);
  if (!html) return;
  const data = parseProductsFromHTML(html);
  console.log(JSON.stringify(data, null, 2));
}

main();

Une fois qu'une URL est fournie, le script rend la page via la Crawling API, analyse chaque carte produit et retourne un objet propre avec la liste des produits et un compteur. C'est l'ensemble de la boucle, de l'URL aux données structurées, dans un seul fichier.

À quoi ressemble le résultat

Exécutez le script complet avec node scraper.js et vous obtenez un objet propre : un tableau products, une entrée par carte, plus un productsCount. Il est prêt à écrire en JSON, CSV ou dans une base de données.

json
{
  "products": [
    {
      "title": "Straight Talk Apple iPhone 14 Pro Max, 128GB, Silver- Prepaid Smartphone",
      "image": "https://i5.walmartimages.com/seo/Straight-Talk-Apple-iPhone-14-Pro-Max.jpeg",
      "price": "1,099",
      "currency": "$",
      "reviewsCount": "31",
      "reviewStar": "4.4 out of 5 Stars. 31 reviews",
      "deliveryMessage": "Free shipping, arrives in 3+ days",
      "productBadge": "Popular pick",
      "inventoryStatus": "In Stock",
      "isSponsored": true
    },
    {
      "title": "Restored Apple iPhone 14 Pro 128GB Deep Purple (Unlocked) Used Excellent",
      "image": "https://i5.walmartimages.com/asr/1385d15c-17b0-4392-8fc1-414cae1a51ed.jpeg",
      "price": "899",
      "currency": "$",
      "reviewsCount": "5",
      "reviewStar": "4.2 out of 5 Stars. 5 reviews",
      "deliveryMessage": "Free shipping, arrives in 3+ days",
      "productBadge": "",
      "inventoryStatus": "In Stock",
      "isSponsored": false
    }
  ],
  "productsCount": 2
}

Passer à l'échelle sur plusieurs pages de résultats

Une page de résultats est une démonstration ; un vrai travail parcourt la pagination. Walmart structure ses URLs de recherche avec un paramètre page, vous pouvez donc construire chaque URL de page dans une boucle, la récupérer via la Crawling API, l'analyser avec la même fonction et collecter les lignes. Une séquence typique ressemble à ceci :

  • https://www.walmart.com/search?q=iphone+14+pro
  • https://www.walmart.com/search?q=iphone+14+pro&page=2
  • https://www.walmart.com/search?q=iphone+14+pro&page=3
javascript
async function scrapePages(query, totalPages) {
  const all = [];
  for (let page = 1; page <= totalPages; page++) {
    const url =
      `https://www.walmart.com/search?q=${encodeURIComponent(query)}&page=${page}`;
    const html = await crawl(url);
    if (html) all.push(...parseProductsFromHTML(html).products);
  }
  return all;
}

scrapePages('iphone 14 pro', 3).then((rows) => {
  console.log(`Collected ${rows.length} products`);
});

À partir de là, vous pouvez passer à des milliers de pages de recherche et stocker le résultat dans une base de données ou dans le cloud. Pour enrichir chaque ligne avec tous les détails (description longue, toutes les images, la ventilation complète des avis), prenez le lien d'un produit, récupérez cette page produit individuelle via la même fonction crawl, puis écrivez un petit parseur pour la mise en page du produit. Le schéma est identique : rendre, puis analyser. Le guide de la page produit et le guide des avis reprennent exactement là.

Rester non bloqué

Même avec le rendu pris en charge, Walmart surveille le trafic à l'allure d'un scraper. Il y a un risque réel de blocages si vous exécutez sans un large pool d'IPs rotatives, et en construire un soi-même est à la fois chronophage et coûteux. Quelques habitudes gardent une exécution saine, et elles s'appliquent à n'importe quelle cible commerciale difficile.

  • Cadencez vos requêtes. Bombarder les pages dans une boucle serrée est le moyen le plus rapide d'être limité. Répartissez les requêtes et variez vos requêtes plutôt que de crawler un seul chemin à pleine vitesse.
  • Appuyez-vous sur la rotation. Un pool d'IPs résidentielles distribue les requêtes sur de nombreuses adresses d'utilisateurs réels pour qu'aucune ne déclenche une limite de débit. La Crawling API gère cela pour vous ; si vous construisez votre propre pile, c'est la partie à bien réussir.
  • Lisez les codes de statut. Une exécution qui commence à renvoyer des défis ou des erreurs vous indique que le débit actuel ou le niveau d'IP n'est plus suffisant. Traitez cela comme un signal pour ralentir, pas comme du bruit à ignorer.

Pour le guide général, voir comment extraire des données sans être bloqué. Si vous préférez router votre propre trafic via un pool rotatif plutôt que d'utiliser l'API gérée, le Smart AI Proxy vous offre la même rotation d'IP résidentielles comme endpoint de substitution. Walmart est également une cible fréquente pour le scraping e-commerce plus large, où le même schéma rendre-puis-analyser s'applique à tous les sites, et les flux de prix résultants s'intègrent directement au travail d'intelligence tarifaire.

Est-il légal d'extraire des données de Walmart ?

L'autorisation de scraper Walmart dépend des conditions d'utilisation de Walmart, de votre juridiction et de l'usage que vous faites des données. Les conditions de Walmart restreignent l'accès automatisé, le scraping peut donc aller à l'encontre de ces conditions quel que soit le soin apporté à votre outillage. Aucun code ici ne change cela ; il ne fait que rendre 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 à respecter. Collectez uniquement les données publiques de produits : titre, prix, note, nombre d'avis, message de livraison, badge, statut de stock et indicateur sponsorisé que tout le monde peut voir sans compte. Respectez les attentes de débit de Walmart et maintenez votre volume de requêtes assez bas pour ne pas surcharger ses serveurs. Évitez les données personnelles, y compris tout ce qui est lié à des évaluateurs identifiables au-delà du texte de l'avis public lui-même, et ne redistribuez pas les médias protégés par droits d'auteur tels que les images de produits comme s'ils vous appartenaient.

Pour un volume ou un usage commercial, préférez un canal officiel. Walmart gère une plateforme développeur ainsi que des API d'affiliation et de marketplace, et ce sont les bons outils quand vous avez besoin de grands volumes, d'une structure garantie ou de droits commerciaux. Ce guide est délibérément limité aux pages de recherche et de produits publiques car c'est la ligne qui rend le travail défendable. Il ne couvre rien derrière une connexion, les données de compte client ou vendeur, l'historique des commandes, les messages privés, ni aucune tentative de contournement de l'authentification. Si votre projet nécessite plus que des listes de produits publiques, les API officielles de Walmart ou un accord de données sont la bonne voie, pas un scraper plus ingénieux.

Récapitulatif

Points clés

  • Walmart a plusieurs surfaces publiques. Recherche, pages produit, prix, avis, meilleures ventes et publicités sponsorisées s'analysent de la même façon, rendre puis lire les champs par sélecteur, et chacune a son propre guide approfondi dans ce cluster.
  • Une simple requête renvoie une coquille. Walmart rend les cartes côté client et challenge les bots, vous devez donc rendre la page derrière une IP de confiance avant de l'analyser.
  • La Crawling API fait les deux en un appel. Elle rend la page et fait tourner les IPs résidentielles côté serveur, vous évitant ainsi de gérer une flotte sans tête et un pool de proxies ; les requêtes JavaScript coûtent plus de crédits, utilisez-les donc où la page en a besoin.
  • cheerio fait l'extraction. Sélectionnez chaque carte list-view, puis mappez titre, prix, devise, note, livraison, badge, stock et indicateur sponsorisé vers les sélecteurs actuels, et attendez-vous à ce que ces sélecteurs évoluent.
  • Restez sur les données publiques. Respectez les CGU et le robots.txt de Walmart, cadencez vos requêtes, préférez les API officielles pour un usage en volume ou commercial, et ne touchez jamais aux connexions, données de compte ou informations personnelles.

Foire aux questions

Pourquoi une simple requête renvoie-t-elle des données incomplètes de Walmart ?

Parce que Walmart rend les prix, les notes, les messages de livraison et la plupart des détails des cartes côté client avec JavaScript. Le HTML initial est une coquille vide jusqu'à ce que les scripts de la page s'exécutent dans un navigateur, donc une requête HTTP brute renvoie les champs clés manquants ou vides. Pour obtenir une page complète, vous devez d'abord la rendre, ce que gère la Crawling API, et le token JavaScript force un rendu complet dans le navigateur quand une page en a besoin.

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

Commencez avec le token normal et vérifiez le corps. Si les prix, les notes ou d'autres champs des cartes reviennent vides, passez au token JavaScript, qui rend la page dans un vrai navigateur avant de renvoyer le HTML. Les requêtes JavaScript coûtent plus de crédits, utilisez donc le token normal là où il suffit et réservez le token JavaScript pour les pages qui en ont réellement besoin.

Comment scraper les pages suivantes des résultats de recherche Walmart ?

Walmart structure ses URLs de recherche avec un paramètre page, donc ajouter &page=2, &page=3 et ainsi de suite permet de parcourir les pages de résultats. Construisez chaque URL de page dans une boucle, récupérez-la via la Crawling API et exécutez le même parseur sur chaque page. Comme chaque page de résultats partage la même structure de carte, le parseur que vous avez déjà écrit fonctionne sur toutes sans modifications.

Mes sélecteurs renvoient des chaînes vides. Qu'est-ce qui a changé ?

Presque certainement le balisage de Walmart. Ses noms de classes et marqueurs data-testid changent sans préavis, et ils diffèrent entre les pages de recherche, de produits et de catégories, les sélecteurs qui fonctionnaient le mois dernier peuvent donc se casser. Inspectez à nouveau une page en direct dans les outils de développement de votre navigateur et mettez à jour les sélecteurs. La maintenance périodique des sélecteurs est normale pour tout scraper en production.

Puis-je extraire des données personnelles de clients ou de vendeurs sur Walmart ?

Non, et ce guide ne le couvre pas. Les détails de compte, l'historique des commandes et les messages privés sont derrière une connexion, il ne s'agit donc pas de données publiques. Le texte des avis publics est visible sur une page produit, mais vous devriez quand même éviter de le lier à des individus identifiables. Extraire du contenu protégé par connexion, des données personnelles ou contourner l'authentification pour y accéder sort du cadre de ce guide et va à l'encontre des conditions de Walmart.

Où aller ensuite pour les prix, les avis, les meilleures ventes ou les publicités ?

Cette feuille de route couvre les résultats de recherche de bout en bout ; le cluster a un guide dédié pour chaque autre surface. Voir l'extraction des prix Walmart, le guide d'extraction des avis, les meilleures ventes et les publicités sponsorisées. Chacun utilise la même approche rendre-puis-analyser sur une page Walmart différente.

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