Walmart est l'un des plus grands détaillants sur le web, et chaque page produit publique porte un flux d'avis clients: une note en étoiles, un titre court, le texte du retour d'expérience, le nom d'affichage du rédacteur et une date. Ce texte est un signal utile pour l'analyse de sentiment, la recherche produit et le benchmarking concurrentiel, car il vous dit dans les propres mots des acheteurs ce qui fonctionne et ce qui ne fonctionne pas avec un produit.
Ce guide vous montre comment scraper les avis Walmart avec JavaScript et Node.js en utilisant cheerio. Vous construisez un petit scraper exécutable qui récupère une page produit Walmart via la Crawling API, analyse chaque avis en un enregistrement propre, parcourt la pagination des avis et exporte les résultats en JSON et CSV. L'ensemble du guide se limite au texte d'avis public, et la section sur la légalité vers la fin n'est pas du remplissage, alors lisez-la avant de pointer ceci sur un volume réel.
Ce que vous allez construire
Un script Node.js qui prend une URL de produit Walmart public, récupère le HTML rendu via la Crawling API et extrait un enregistrement structuré pour chaque avis sur la page. Nous utiliserons une seule page produit comme exemple courant et extrairons ces champs par avis:
- Rédacteur le nom d'affichage montré sur l'avis, par exemple "Optimistic" ou "First Time Shopper".
- Note la note en étoiles telle que Walmart la montre, comme "5 out of 5 stars review".
- Titre le court titre que le rédacteur a donné à son avis.
- Corps le texte de retour d'expérience rédigé de l'avis.
- Date la date à laquelle l'avis a été publié, quand elle est présente sur la carte.
Pourquoi une requête simple échoue sur Walmart
Si vous demandez une URL de produit Walmart avec un client HTTP nu, vous obtenez une réponse avec le statut 200 et seulement une fraction des données d'avis dans le corps. Deux choses jouent contre vous. Premièrement, Walmart rend les prix, les notes et la liste des avis dans le navigateur avec JavaScript, donc le HTML initial est incomplet jusqu'à ce que les scripts de la page s'exécutent. Deuxièmement, Walmart signale rapidement le trafic automatisé: les IP de centres de données et les schémas de requêtes qui ne ressemblent pas à un vrai navigateur sont challengés, limités en débit ou bloqués avant d'atteindre le contenu rendu.
Un scraper d'avis 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 visiteur. Vous pouvez assembler cela vous-même avec un navigateur sans en-tête plus un pool de proxies résidentiels rotatifs, mais les assembler et les maintenir en bonne santé 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 retourne le HTML fini pour que vous l'analysiez.
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 la liste des avis côté client, donc le token JS vous donne la page la plus complète ici. Utiliser le token normal peut retourner une page avec la section des avis vide, ne vous laissant rien à analyser.
Prérequis
Vous avez besoin de quelques éléments en place avant d'écrire du code. Aucun ne prend longtemps.
JavaScript et Node.js de base. Vous devez être à l'aise avec l'écriture et l'exécution d'un script Node et l'installation de paquets avec npm. Si vous êtes nouveau sur Node, consultez notre guide sur la façon de construire un web scraper avec Node.js.
Node.js 16 ou version ultérieure. Confirmez 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. Le niveau gratuit vous donne 1 000 requêtes sans carte requise, ce qui est largement suffisant pour suivre ce guide. Traitez le token comme un mot de passe: il authentifie vos requêtes, gardez-le donc 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.
node --version mkdir walmart-reviews-scraper && cd walmart-reviews-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 retourné avec une API de style jQuery pour que vous puissiez extraire des champs individuels par sélecteur CSS. Si les sélecteurs sont nouveaux pour vous, le primer sur XPath et les sélecteurs CSS est un bon complément.
Étape 1: Récupérer la page produit rendue
Commencez par obtenir la page finie. Importez la classe CrawlingAPI, initialisez-la avec votre token et demandez l'URL du produit. Nous pointons sur un seul produit Walmart comme exemple; toute page produit publique avec une section d'avis fonctionne. Vérifier le code de statut avant d'analyser garde les échecs visibles plutôt que silencieux.
const { CrawlingAPI } = require('crawlbase'); const api = new CrawlingAPI({ token: 'YOUR_CRAWLBASE_TOKEN' }); const productUrl = 'https://www.walmart.com/ip/Straight-Talk-Apple-iPhone-14-128GB-Midnight-Prepaid-Smartphone-Locked-to-Straight-Talk/1381920049'; async function crawl(pageUrl) { const options = { ajax_wait: 'true', page_wait: 5000 }; const response = await api.get(pageUrl, options); if (response.statusCode === 200) { return response.body; } console.error(`Request failed: ${response.statusCode}`); return null; } crawl(productUrl).then((html) => { console.log(html ? html.slice(0, 500) : 'No HTML returned'); });
Les deux options d'attente comptent pour une cible rendue côté client comme celle-ci. ajax_wait demande à l'API d'attendre que le contenu asynchrone finisse de se charger, et page_wait maintient l'attente pendant un nombre fixe de millisecondes après le chargement pour que les éléments à rendu tardif apparaissent avant la capture de la page. Cinq secondes est un bon début; augmentez si la liste des avis revient vide. Exécutez le script avec node scraper.js et vous devriez voir un vrai balisage produit, pas une coquille dépouillée. Cela confirme que le rendu fonctionne avant d'écrire un seul sélecteur.
Walmart a besoin d'une page rendue derrière une IP de confiance, en un seul appel, avant même que sa liste d'avis n'apparaisse. La Crawling API exécute la page dans un vrai navigateur, effectue la rotation via des IP résidentielles côté serveur et vous remet le HTML fini, vous évitant ainsi de faire tourner une flotte sans en-tête et un pool de proxies vous-même. Pointez-la sur une page produit publique sur le niveau gratuit d'abord.
Étape 2: Analyser chaque avis avec cheerio
Avec le HTML rendu en main, chargez-le dans cheerio et parcourez les cartes d'avis. Walmart dispose chaque avis dans un bloc répétitif à l'intérieur de la section des avis, vous sélectionnez donc chaque carte, puis lisez le nom du rédacteur, la note, le titre, le corps et la date à l'intérieur. Lire chaque champ de manière défensive évite qu'une valeur manquante ne fasse planter l'exécution.
const cheerio = require('cheerio'); function parseReviews(html) { const $ = cheerio.load(html); const reviews = []; $('#item-review-section li.dib').each((_, el) => { const card = $(el); const rating = card.find('.w_iUH7').text().trim(); const body = card.find('.lh-copy').text().trim(); if (!rating && !body) return; reviews.push({ reviewer: card.find('.f7.gray').first().text().trim() || null, rating: rating || null, title: card.find('.w_kV33.w_Sl3f.w_mvVb.f5.b').text().trim() || null, body: body || null, date: card.find('.f7.gray.mt1').text().trim() || null, }); }); return reviews; }
Quelques détails rendent ceci résilient. Le sélecteur de conteneur #item-review-section li.dib et les sélecteurs internes .w_iUH7 (note) et .lh-copy (corps de l'avis) viennent directement du balisage des avis Walmart en direct. Le nom du rédacteur, le titre et la date se trouvent dans leurs propres petits wrappers, donc chacun est lu avec son propre sélecteur. Chaque champ revient à null quand son élément est manquant, ce qui est courant car tous les avis ne portent pas un titre séparé ou une date visible. Le return anticipé ignore tout élément de liste qui n'a ni note ni corps, afin que les espaces réservés de mise en page ne polluent pas la sortie.
Les noms de classes de Walmart (w_iUH7, lh-copy, dib et les autres) sont générés et changent sans préavis, et peuvent différer entre les mises en page de produits. Traitez les sélecteurs ci-dessus comme un modèle de départ, pas un contrat. Quand un champ revient comme null, réinspectez 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 de production, ce n'est pas le signe que quelque chose est cassé.
Étape 3: Gérer la pagination des avis
Une page d'avis est une démo; un vrai travail parcourt la pagination. Walmart expose le numéro de page des avis via un paramètre de requête page sur l'URL du produit, 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. Parce que chaque page d'avis partage la même structure de carte, le parseur que vous avez déjà écrit fonctionne sur toutes les pages sans modifications.
async function scrapeAllReviews(baseUrl, totalPages) { const all = []; for (let page = 1; page <= totalPages; page++) { const sep = baseUrl.includes('?') ? '&' : '?'; const url = `${baseUrl}${sep}page=${page}`; const html = await crawl(url); if (html) all.push(...parseReviews(html)); } return all; }
Chaque itération ajoute page=N à l'URL du produit, récupère la page rendue et étale les avis analysés dans un tableau combiné. Gardez totalPages conservateur pendant les tests pour ne pas faire plus de requêtes que nécessaire, et augmentez une fois que la sortie a l'air correcte.
Étape 4: Exporter en JSON et CSV
Maintenant, reliez la récupération, l'analyse et la pagination en un seul script exécutable, puis écrivez les avis collectés dans un fichier JSON et un fichier CSV. Le JSON est le format naturel pour alimenter un modèle de sentiment; le CSV s'ouvre directement dans un tableur pour une recherche produit rapide.
const { CrawlingAPI } = require('crawlbase'); const cheerio = require('cheerio'); const fs = require('fs'); const api = new CrawlingAPI({ token: 'YOUR_CRAWLBASE_TOKEN' }); async function crawl(pageUrl) { const options = { ajax_wait: 'true', page_wait: 5000 }; const response = await api.get(pageUrl, options); if (response.statusCode === 200) return response.body; console.error(`Request failed: ${response.statusCode}`); return null; } function parseReviews(html) { const $ = cheerio.load(html); const reviews = []; $('#item-review-section li.dib').each((_, el) => { const card = $(el); const rating = card.find('.w_iUH7').text().trim(); const body = card.find('.lh-copy').text().trim(); if (!rating && !body) return; reviews.push({ reviewer: card.find('.f7.gray').first().text().trim() || null, rating: rating || null, title: card.find('.w_kV33.w_Sl3f.w_mvVb.f5.b').text().trim() || null, body: body || null, date: card.find('.f7.gray.mt1').text().trim() || null, }); }); return reviews; } async function scrapeAllReviews(baseUrl, totalPages) { const all = []; for (let page = 1; page <= totalPages; page++) { const sep = baseUrl.includes('?') ? '&' : '?'; const html = await crawl(`${baseUrl}${sep}page=${page}`); if (html) all.push(...parseReviews(html)); } return all; } function toCsv(rows) { const headers = ['reviewer', 'rating', 'title', 'body', 'date']; const escape = (v) => `"${(v ?? '').replace(/"/g, '""')}"`; const lines = [headers.join(',')]; for (const row of rows) { lines.push(headers.map((h) => escape(row[h])).join(',')); } return lines.join('\n'); } async function main() { const productUrl = 'https://www.walmart.com/ip/Straight-Talk-Apple-iPhone-14-128GB-Midnight-Prepaid-Smartphone-Locked-to-Straight-Talk/1381920049'; const reviews = await scrapeAllReviews(productUrl, 3); fs.writeFileSync('walmart_reviews.json', JSON.stringify(reviews, null, 2)); fs.writeFileSync('walmart_reviews.csv', toCsv(reviews)); console.log(`Saved ${reviews.length} reviews to JSON and CSV`); } main();
Exécutez le script complet avec node scraper.js. Il parcourt trois pages d'avis, collecte chaque avis dans un seul tableau et écrit walmart_reviews.json et walmart_reviews.csv dans le dossier du projet. L'échappement CSV enveloppe chaque valeur entre guillemets et double les guillemets internes, de sorte que les corps d'avis contenant des virgules ou des guillemets ne cassent pas les colonnes.
À quoi ressemble la sortie
Le fichier JSON contient un objet par avis, prêt à alimenter un pipeline de sentiment ou à charger dans un notebook.
[ { "reviewer": "Optimistic", "rating": "5 out of 5 stars review", "title": "Great camera and speed", "body": "Pictures are coming out great and the speed is what I've been needing", "date": "October 2, 2023" }, { "reviewer": "First Time Shopper", "rating": "5 out of 5 stars review", "title": "Awesome phone", "body": "Bought this last month and it's been awesome. The camera quality is perfect especially with the action mode.", "date": "September 18, 2023" } ]
Le CSV reprend les mêmes champs avec une ligne d'en-tête, de sorte qu'une équipe marketing ou produit peut l'ouvrir dans un tableur, trier par note et parcourir d'abord les scores les plus bas. Avec les données en main, vous pouvez effectuer une notation de sentiment, calculer la distribution des notes ou suivre l'évolution des retours d'expérience version après version. Pour le côté analyse, notre guide sur la façon de scraper les avis clients couvre la transformation du texte brut d'avis en informations structurées, et le même pipeline d'avis s'applique aux avis Amazon si vous comparez les deux marchés.
Rester non bloqué
Même avec le rendu géré, Walmart surveille le trafic ressemblant à un scraper. Quelques habitudes maintiennent une exécution saine, et elles s'appliquent à toute cible commerciale difficile.
-
Rythmez vos requêtes. Marteler des pages de revues dans une boucle serrée est le moyen le plus rapide d'être throttlé. Espacez les requêtes et gardez
totalPagesà ce dont vous avez vraiment besoin au lieu de crawler chaque page à pleine vitesse. - Misez sur la rotation. Un pool d'IP résidentielles répartit les requêtes sur de nombreuses adresses d'utilisateurs réels afin 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 faire.
- Lisez les codes de statut. Une exécution qui commence à retourner des défis 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 reculer, pas comme du bruit à ignorer.
Pour le guide plus large, voir comment scraper des sites web sans se faire bloquer. Si vous avez également besoin de titres de produits, de prix ou de la grille de recherche plutôt que d'avis, le guide compagnon sur la façon de scraper la recherche Walmart avec Python couvre ce côté, et Walmart est une cible fréquente pour le travail plus large de web scraping e-commerce, où le même schéma de récupération puis d'analyse s'applique entre les sites.
Est-il légal de scraper les avis Walmart?
Si le scraping des avis 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é, donc le scraping peut aller à l'encontre de ces conditions quel que soit le soin apporté à vos outils. Aucun code ici ne change cela; il fait juste fonctionner la partie technique. Lisez les Conditions d'utilisation de Walmart et son robots.txt sur https://www.walmart.com/robots.txt, et traitez les deux comme la limite de ce que vous collectez.
Quelques lignes à tenir. Collectez uniquement le texte d'avis public: la note en étoiles, le titre de l'avis, le corps, le nom d'affichage tel qu'il apparaît sur la carte et la date de publication que n'importe qui peut voir sans compte. Ne construisez pas un profil d'un rédacteur individuel, ne liez pas ses avis entre produits ou sites, et n'essayez pas d'identifier la vraie personne derrière un nom d'affichage. Un nom d'affichage et un corps d'avis public sont du contenu public; les traiter comme matière première pour suivre un acheteur spécifique est une limite de confidentialité à ne pas franchir. Respectez les attentes de débit indiquées par Walmart et gardez votre volume de requêtes suffisamment bas pour ne pas surcharger ses serveurs.
Ce guide est délibérément limité aux pages de produits et d'avis publics parce que c'est la ligne qui rend le travail défendable. Il ne couvre rien derrière une connexion, les données de compte ou de commande protégées par une inscription, les données personnelles sur les rédacteurs au-delà du texte public qu'ils ont publié, ni aucune tentative de contourner l'authentification. Si votre projet a besoin de plus que des avis publics, un accord de données formel avec Walmart est la bonne voie, pas un scraper plus malin. En cas de doute, préférez l'analyse agrégée (distributions de notes, thèmes communs) plutôt que tout ce qui cible un seul rédacteur.
Points clés
- Walmart rend les avis côté client. Une récupération simple retourne une page incomplète, vous devez donc la rendre avant de l'analyser.
-
Vous avez besoin du rendu et d'une IP de confiance ensemble. La Crawling API fait les deux en un seul appel;
ajax_waitetpage_waitcontrôlent combien de temps elle attend que la liste des avis se charge. -
cheerio effectue l'extraction. Sélectionnez chaque carte
#item-review-section li.dib, puis mappez le rédacteur, la note, le titre, le corps et la date sur les sélecteurs actuels, et attendez-vous à ce que ces sélecteurs évoluent. -
Montez en charge en parcourant les pages, exportez en JSON et CSV. Le paramètre
pageparcourt les pages d'avis, le même parseur fonctionne sur chaque page, et les deux fichiers alimentent le sentiment et la recherche produit. - Restez sur le texte d'avis public. Respectez les CGU et robots.txt de Walmart, ne profilez jamais les rédacteurs individuels et restez en dehors de tout ce qui se trouve derrière une connexion.
Foire aux questions
Pourquoi une requête simple retourne-t-elle des données incomplètes de Walmart?
Parce que Walmart rend le prix, le résumé des notes et la liste complète des avis côté client avec JavaScript. Le HTML initial est partiel jusqu'à ce que les scripts de la page s'exécutent dans un navigateur, donc une requête HTTP brute retourne un statut 200 avec la section des avis vide ou tronquée. Pour obtenir une page complète, vous devez d'abord la rendre, ce que la Crawling API gère pour vous.
Quels champs puis-je extraire d'un avis Walmart?
Le nom d'affichage du rédacteur, la note en étoiles (Walmart la formule comme "5 out of 5 stars review"), le court titre de l'avis, le texte du corps et la date de publication quand elle est présente sur la carte. Le scraper de ce guide extrait les cinq depuis les cartes d'avis #item-review-section li.dib en utilisant les sélecteurs .w_iUH7 et .lh-copy plus les petites classes wrapper pour le nom, le titre et la date.
Comment scraper toutes les pages d'avis, pas seulement la première?
Walmart pagine les avis via un paramètre de requête page sur l'URL du produit. La fonction scrapeAllReviews de ce guide boucle de la page 1 jusqu'à un nombre de pages que vous définissez, ajoute page=N à l'URL, récupère chaque page rendue via la Crawling API et exécute le même parseur sur chaque page avant de combiner les résultats en un seul tableau.
Mes sélecteurs retournent null. Qu'est-ce qui a changé?
Presque certainement le balisage de Walmart. Ses noms de classes générés (w_iUH7, lh-copy, dib et les wrappers autour du nom, du titre et de la date) changent sans préavis et peuvent différer entre les mises en page de produits, donc les sélecteurs qui fonctionnaient le mois dernier peuvent se casser. Réinspectez une page d'avis 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 de production.
Puis-je scraper des données personnelles sur les rédacteurs Walmart?
Non, et ce guide ne couvre pas cela. Un nom d'affichage public et un corps d'avis sont du contenu public, mais profiler un rédacteur spécifique, lier son activité entre produits ou sites, ou essayer d'identifier la personne derrière un nom d'affichage franchit une limite de confidentialité. Gardez votre analyse au niveau agrégé (distributions de notes, thèmes communs) et restez en dehors de tout ce qui se trouve derrière une connexion.
Puis-je analyser les avis Walmart scrapés?
Oui. Une fois les avis en JSON ou CSV, vous pouvez effectuer une analyse de sentiment pour classer chacun comme positif, négatif ou neutre, calculer la distribution des notes, faire ressortir les caractéristiques les plus appréciées et les plus critiquées, et suivre l'évolution des retours dans le temps. Cette vue agrégée est exactement ce qui rend les données d'avis utiles pour la recherche produit et le benchmarking concurrentiel.
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.
