Walmart est l'un des plus grands détaillants en ligne du monde, et les données produits qu'il expose, titres, prix, évaluations et disponibilité, sont véritablement utiles si vous effectuez des études de prix, surveillez un marché ou construisez un produit retail. Le problème est que Walmart rend une grande partie de son contenu côté client et se défend fortement contre les bots, de sorte qu'une récupération HTTP ordinaire vous renvoie une coquille vide ou une page de blocage. Ce guide vous explique comment scraper une page produit Walmart avec Selenium : un petit build Python opérationnel qui pilote Firefox headless, route son trafic via le Crawlbase Smart AI Proxy pour que la requête soit lue comme un vrai visiteur, extrait les champs produits publics et les écrit sur disque.
Pour rester honnête et défendable, l'ensemble du tutoriel est limité aux données publiques : le titre du produit, le prix, l'évaluation et le nombre d'avis que tout le monde peut voir sans se connecter. Il ne touche pas aux comptes utilisateurs, au contenu protégé par connexion, aux actions de paiement ou aux données personnelles. La section juridique en fin d'article n'est pas un simple formulaire, lisez-la avant de pointer ce script sur un volume de production.
Pourquoi utiliser Selenium et un proxy ensemble
Selenium est un outil d'automatisation de navigateur. Il pilote un vrai navigateur par programmation, de sorte qu'il exécute le JavaScript de la page et voit le même DOM rendu qu'un humain. Cela résout la moitié rendu du problème : Walmart remplit ses détails produits côté client, et Selenium attend que ces éléments apparaissent avant que vous les lisiez. Ce que Selenium ne résout pas, c'est la moitié réseau. Par défaut, il envoie des requêtes depuis votre propre IP, et Walmart signale et bloque rapidement le trafic automatisé de datacenter et des visiteurs répétitifs, en le challengeant ou en le bloquant avant que la page finisse de se charger.
C'est là qu'un proxy intervient. Le Crawlbase Smart AI Proxy est un endpoint proxy unique qui effectue une rotation des requêtes sur un pool d'IP résidentielles côté serveur. Vous pointez Firefox sur lui une fois, et chaque requête que Selenium effectue sort via une adresse d'utilisateur réel fraîche. Vous obtenez le rendu de Selenium et le déblocage du proxy, chaque outil faisant la partie pour laquelle il est réellement doué. Vous pourriez assembler vous-même la rotation des IP avec une liste de proxies résidentiels rotatifs, mais maintenir ce pool en bonne santé et le faire tourner correctement représente la majeure partie du travail que le Smart AI Proxy fait déjà pour vous.
Gardez la frontière claire dans votre tête. Selenium rend et lit la page : il exécute le JavaScript, attend les éléments et extrait les champs. Le Smart AI Proxy gère le réseau : il effectue une rotation des IP résidentielles pour que la requête ressemble à un visiteur réel plutôt qu'à un bot. Confondre ces responsabilités, ou sauter le proxy complètement, est la raison la plus courante pour laquelle un scraper Walmart renvoie des champs vides ou une page de blocage.
Ce que vous allez construire
Un petit script Python opérationnel qui prend l'URL d'un produit Walmart, lance Firefox headless configuré pour router via le Smart AI Proxy, attend que le titre et le prix soient rendus, extrait les champs publics, réessaie en cas de timeout et affiche le résultat structuré. Vous pouvez exécuter chaque extrait tel quel ; remplacez simplement votre propre token d'accès et l'URL du produit.
Configurer Firefox, Python et geckodriver
Selenium a besoin de trois choses sur votre machine : un navigateur à piloter, les liaisons Python et le driver qui les connecte. Pour Firefox, ce driver est geckodriver.
Installez d'abord Mozilla Firefox depuis le site officiel si vous ne l'avez pas déjà. Confirmez ensuite que vous avez Python 3.8 ou supérieur.
python --version
Téléchargez ensuite geckodriver. C'est le pont entre Selenium et Firefox : rendez-vous sur la page des releases geckodriver sur GitHub, téléchargez la version pour votre système d'exploitation et extrayez-la quelque part où vous pouvez la référencer. Notez le chemin, car le script en a besoin. Les versions modernes de Selenium peuvent souvent trouver geckodriver automatiquement s'il est dans votre PATH, mais passer un chemin explicite est la valeur par défaut fiable qu'utilise ce guide.
Créez maintenant un environnement virtuel pour que les dépendances du projet restent isolées, puis installez les bibliothèques.
python -m venv walmart_env source walmart_env/bin/activate pip install selenium random-user-agent
Sur Windows, activez l'environnement avec walmart_env\Scripts\activate plutôt que la ligne source. Deux dépendances font le travail : selenium pilote Firefox, et random-user-agent génère des chaînes user-agent réalistes pour que chaque session semble un peu différente. Le user agent est un petit détail ; le proxy fait le gros du travail pour rester non bloqué.
Obtenir votre endpoint Smart AI Proxy
Créez un compte Crawlbase et ouvrez le tableau de bord pour trouver votre token d'accès Smart AI Proxy. Le proxy est un endpoint unique sur lequel vous pointez Firefox, et il prend la forme ci-dessous.
http://[email protected]:8012
L'hôte est smartproxy.crawlbase.com, le port est 8012 et votre token va dans la position utilisateur avant le @. Chaque requête que Firefox envoie via cet endpoint reçoit une IP résidentielle rotative, de sorte que vous ne gérez pas vous-même une liste de proxies. L'offre gratuite est suffisante pour exécuter l'ensemble de ce tutoriel sur une page publique avant de vous engager dans un plan.
Les exemples ci-dessous intègrent le token pour des raisons de lisibilité, mais dans du vrai code chargez-le depuis une variable d'environnement ou un fichier .env plutôt que de le committer. Un token proxy qui fuit est un identifiant qui fuit, et quiconque le possède peut dépenser votre quota.
Configurer Firefox headless pour utiliser le Smart AI Proxy
C'est le cœur de la configuration : construire un objet d'options Firefox qui s'exécute en mode headless, porte un user agent aléatoire et route chaque requête via le Smart AI Proxy. Firefox prend les paramètres de proxy comme préférences du navigateur, vous définissez donc le type de proxy sur manuel et pointez chaque protocole sur l'hôte et le port du proxy.
import selenium.webdriver as webdriver from selenium.webdriver.firefox.service import Service from selenium.webdriver.firefox.options import Options from random_user_agent.user_agent import UserAgent from random_user_agent.params import SoftwareName, OperatingSystem user_agent_rotator = UserAgent( software_names=[SoftwareName.FIREFOX.value], operating_systems=[OperatingSystem.WINDOWS.value, OperatingSystem.LINUX.value], limit=100, ) user_agent = user_agent_rotator.get_random_user_agent() firefox_options = Options() firefox_options.add_argument("--headless") firefox_options.add_argument("--no-sandbox") firefox_options.add_argument("--window-size=1420,1080") firefox_options.add_argument("--disable-gpu") firefox_options.add_argument(f"user-agent={user_agent}") proxy_host = "http://[email protected]" proxy_port = 8012 firefox_options.set_preference("network.proxy.type", 1) firefox_options.set_preference("network.proxy.http", proxy_host) firefox_options.set_preference("network.proxy.http_port", proxy_port) firefox_options.set_preference("network.proxy.ssl", proxy_host) firefox_options.set_preference("network.proxy.ssl_port", proxy_port) firefox_options.set_preference("network.http.use-cache", False)
Le flag --headless exécute Firefox sans fenêtre visible, ce qui est ce que vous voulez sur un serveur et ce qui maintient une faible utilisation des ressources. Le network.proxy.type réglé sur 1 signifie "configuration manuelle du proxy", et les lignes qui suivent routent le trafic HTTP et HTTPS (SSL) via l'hôte et le port du Smart AI Proxy. Désactiver le cache garantit que chaque exécution récupère une page fraîche plutôt que de servir du contenu périmé. La version héritée de cette configuration configurait également les préférences FTP et SOCKS, mais une page produit Walmart est du HTTPS simple, ces paramètres sont donc du bruit que vous pouvez supprimer.
Vérifier que le proxy fonctionne
Avant de pointer quoi que ce soit sur Walmart, confirmez que le trafic sort bien via le proxy. La vérification la plus simple consiste à appeler un service qui renvoie l'IP de la requête. Chargez httpbin.org/ip et affichez le corps : si le rendu et le routage fonctionnent, vous voyez l'une des adresses résidentielles du proxy plutôt que la vôtre.
import os from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC driver_path = os.path.join(os.getcwd(), "drivers", "geckodriver") service = Service(driver_path) driver = webdriver.Firefox(service=service, options=firefox_options) driver.get("https://httpbin.org/ip") try: WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.TAG_NAME, "body")) ) print(driver.find_element(By.TAG_NAME, "body").text) finally: driver.quit()
Ici, WebDriverWait associé à presence_of_element_located attend que l'élément body de la page apparaisse, jusqu'à dix secondes, pour ne pas lire le DOM avant qu'il existe. Le bloc finally ferme toujours la session du navigateur, même si l'attente expire, ce qui évite l'accumulation de processus Firefox parasites. Une exécution réussie affiche quelque chose comme ce qui suit.
{ "origin": "51.15.242.202" }
Si vous voyez une IP d'apparence résidentielle qui n'est pas la vôtre, le routage fonctionne et vous êtes prêt à pointer ce script sur une vraie cible. Si vous voyez votre propre adresse, les préférences de proxy n'ont pas été prises en compte, revérifiez l'hôte, le port et le token avant d'aller plus loin.
Selenium rend les pages, il ne masque pas votre IP. Le Smart AI Proxy comble cette lacune en tant qu'endpoint drop-in unique : pointez Firefox dessus une fois et chaque requête effectue une rotation via des IP résidentielles côté serveur, de sorte que Walmart lit votre scraper comme un vrai visiteur plutôt qu'un bot. Aucune liste de proxies à gérer, aucune logique de rotation à écrire. Pointez-le d'abord sur une page produit publique avec l'offre gratuite.
Comprendre la page produit Walmart
Pour extraire les champs d'une page produit Walmart, vous devez savoir où ils se trouvent dans le DOM rendu. La façon la plus propre de trouver les sélecteurs actuels est d'ouvrir une page produit dans votre navigateur, de faire un clic droit sur la valeur que vous voulez et de choisir Inspecter. Les champs que ce guide extrait et des sélecteurs raisonnables pour eux sont indiqués ci-dessous.
-
Titre du produit l'élément le plus proéminent de la page, un
h1qui porte un attributitemprop="name", donc le XPath//h1[@itemprop="name"]le cible. -
Prix du produit rendu à l'intérieur du bloc d'achat, généralement dans un élément marqué
itemprop="price", accessible avec//span[@itemprop="price"]. - Évaluation la note moyenne en étoiles, généralement exposée dans un label aria ou un élément d'évaluation dédié près du titre.
- Nombre d'avis le nombre d'avis clients, généralement un lien ou un span à côté de l'évaluation.
Walmart change son balisage et ses noms d'attributs sans préavis, traitez donc les sélecteurs ci-dessus comme un modèle de départ, pas comme un contrat. Quand l'extraction renvoie des chaînes vides, réinspectez la page en direct dans les outils de développement de votre navigateur et mettez à jour les sélecteurs. C'est une maintenance normale pour tout scraper en production, ce n'est pas le signe d'un problème.
Extraire les champs du produit
Une fois le routage vérifié et les sélecteurs en main, écrivez la fonction qui navigue vers l'URL d'un produit, attend que le titre et le prix soient rendus et lit les champs. Une boucle de retry enveloppe l'ensemble de sorte qu'un seul timeout ou blocage transitoire ne tue pas l'exécution ; elle réessaie avec une nouvelle session de navigateur jusqu'à une limite configurable.
from selenium.common.exceptions import TimeoutException from time import sleep TITLE_XPATH = '//h1[@itemprop="name"]' PRICE_XPATH = '//span[@itemprop="price"]' def scrape_walmart_product(url, max_retries=3, retry_delay=5): for attempt in range(1, max_retries + 1): driver = webdriver.Firefox(service=service, options=firefox_options) try: driver.get(url) WebDriverWait(driver, 15).until( EC.presence_of_element_located((By.XPATH, TITLE_XPATH)) ) title = driver.find_element(By.XPATH, TITLE_XPATH).text.strip() price = read_optional(driver, PRICE_XPATH) return {"url": url, "title": title, "price": price} except TimeoutException: print(f"Timeout on attempt {attempt} for {url}") except Exception as error: print(f"Error on attempt {attempt}: {error}") finally: driver.quit() if attempt < max_retries: print(f"Retrying in {retry_delay}s...") sleep(retry_delay) return None def read_optional(driver, xpath): try: return driver.find_element(By.XPATH, xpath).text.strip() except Exception: return None
Quelques décisions rendent ce code robuste. Le script attend sur le titre avant de lire quoi que ce soit, car le titre est présent de façon fiable sur chaque page produit et signale que la page a été rendue. Le prix, l'évaluation et le nombre d'avis sont lus via un petit helper read_optional qui retourne None quand un élément est manquant plutôt que de lever une exception, car tous les produits ne portent pas tous les champs. Et chaque tentative crée et ferme son propre navigateur, de sorte qu'un retry démarre depuis une session propre avec une IP proxy fraîche plutôt que de réutiliser une IP compromise.
Le script complet
Voici tout assemblé en un seul fichier exécutable. Renseignez votre token d'accès, définissez le chemin de geckodriver, changez l'URL du produit et exécutez-le.
import os import json from time import sleep import selenium.webdriver as webdriver from selenium.webdriver.firefox.service import Service from selenium.webdriver.firefox.options import Options from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.common.exceptions import TimeoutException from random_user_agent.user_agent import UserAgent from random_user_agent.params import SoftwareName, OperatingSystem ACCESS_TOKEN = os.getenv("CRAWLBASE_PROXY_TOKEN", "YOUR_ACCESS_TOKEN") PROXY_HOST = f"http://{ACCESS_TOKEN}@smartproxy.crawlbase.com" PROXY_PORT = 8012 TITLE_XPATH = '//h1[@itemprop="name"]' PRICE_XPATH = '//span[@itemprop="price"]' def build_options(): rotator = UserAgent( software_names=[SoftwareName.FIREFOX.value], operating_systems=[OperatingSystem.WINDOWS.value, OperatingSystem.LINUX.value], limit=100, ) user_agent = rotator.get_random_user_agent() options = Options() options.add_argument("--headless") options.add_argument("--no-sandbox") options.add_argument("--window-size=1420,1080") options.add_argument("--disable-gpu") options.add_argument(f"user-agent={user_agent}") options.set_preference("network.proxy.type", 1) options.set_preference("network.proxy.http", PROXY_HOST) options.set_preference("network.proxy.http_port", PROXY_PORT) options.set_preference("network.proxy.ssl", PROXY_HOST) options.set_preference("network.proxy.ssl_port", PROXY_PORT) options.set_preference("network.http.use-cache", False) return options def read_optional(driver, xpath): try: return driver.find_element(By.XPATH, xpath).text.strip() except Exception: return None def scrape_walmart_product(url, service, options, max_retries=3, retry_delay=5): for attempt in range(1, max_retries + 1): driver = webdriver.Firefox(service=service, options=options) try: driver.get(url) WebDriverWait(driver, 15).until( EC.presence_of_element_located((By.XPATH, TITLE_XPATH)) ) return { "url": url, "title": driver.find_element(By.XPATH, TITLE_XPATH).text.strip(), "price": read_optional(driver, PRICE_XPATH), } except TimeoutException: print(f"Timeout on attempt {attempt} for {url}") except Exception as error: print(f"Error on attempt {attempt}: {error}") finally: driver.quit() if attempt < max_retries: print(f"Retrying in {retry_delay}s...") sleep(retry_delay) return None def main(): driver_path = os.path.join(os.getcwd(), "drivers", "geckodriver") service = Service(driver_path) options = build_options() product_url = "https://www.walmart.com/ip/Ozark-Trail-Basic-Mesh-Chair-Blue-Adult/577309300" result = scrape_walmart_product(product_url, service, options) if result: with open("walmart_product.json", "w") as f: json.dump(result, f, indent=2) print(json.dumps(result, indent=2)) else: print("Could not scrape the product after all retries.") if __name__ == "__main__": main()
À quoi ressemble le résultat
Exécutez avec python walmart_scraper.py et vous obtenez des données structurées propres écrites dans walmart_product.json et affichées dans la console.
{ "url": "https://www.walmart.com/ip/Ozark-Trail-Basic-Mesh-Chair-Blue-Adult/577309300", "title": "Ozark Trail Basic Mesh Chair, Blue, Adult", "price": "$12.98" }
Ajoutez les sélecteurs d'évaluation et de nombre d'avis au dictionnaire de résultats de la même façon une fois que vous les avez inspectés sur la page en direct, et chaque exécution capture l'ensemble complet des champs publics du produit. Pour transformer ce scraper en job de surveillance des prix, parcourez une liste d'URLs de produits via scrape_walmart_product et ajoutez chaque résultat à une liste avant d'écrire le fichier.
Rester non bloqué à volume
Le Smart AI Proxy gère la rotation des IP pour vous, mais quelques habitudes maintiennent une exécution plus importante en bonne santé, et elles s'appliquent à toute cible commerciale difficile.
- Cadencez vos requêtes. Marteler Walmart en boucle serrée est la façon la plus rapide d'être limité. Espacez les requêtes et variez les produits que vous consultez plutôt que de boucler sur la même URL.
- Misez sur la rotation. Le Smart AI Proxy répartit votre trafic sur de nombreuses IP d'utilisateurs réels de sorte qu'aucune adresse ne déclenche une limite de débit. C'est la partie que vous devriez sinon construire et maintenir vous-même.
- Lisez les codes de statut. Une exécution qui commence à retourner des challenges ou des pages vides vous indique que le débit actuel est trop élevé. Traitez les codes d'erreur de statut proxy comme un signal, pas du bruit, et ralentissez quand vous en voyez.
Pour le guide plus complet, consultez comment scraper des sites sans se faire bloquer. Si vous préférez ignorer complètement le navigateur headless et laisser une API retourner des données produits analysées, comparez ce build avec la Crawling API, qui renvoie du JSON pré-analysé pour les sites supportés, ou la Crawling API pour du HTML rendu sans exécuter vous-même Selenium. Le même pattern Selenium fonctionne sur d'autres détaillants aussi ; scraper Amazon par ASIN décrit un job très similaire.
Est-il légal de scraper Walmart ?
Scraper un grand détaillant commercial se situe dans une zone grise juridique, et la réponse à "est-ce 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.
Quelques lignes à respecter. Collectez uniquement les données publiques : le titre, le prix, l'évaluation et le nombre d'avis que tout le monde peut voir sans compte. Respectez le robots.txt de Walmart et ses attentes déclarées en matière de débit, et maintenez votre volume de requêtes suffisamment bas pour ne pas solliciter les serveurs. Si vous prévoyez de réutiliser les données commercialement, obtenez une autorisation ou un accord de données officiel plutôt que de supposer que le silence vaut consentement. Et ne collectez jamais de données personnelles, y compris tout ce qui est lié aux comptes clients individuels ou aux avis attribuables à de vraies personnes.
Ce guide est délibérément limité aux données produits 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 actions de paiement ou de paiement, ni toute tentative de contourner l'authentification. Si votre projet nécessite plus que des champs produits publics, la bonne démarche est une API officielle ou un accord de données avec Walmart, pas un scraper plus ingénieux.
Points clés
- Divisez le travail. Selenium rend et lit la page ; le Smart AI Proxy gère le réseau. Chaque outil fait une partie, et cette séparation est ce qui rend le scraper fiable.
-
Routez Firefox via le proxy. Définissez
network.proxy.typesur manuel et pointez HTTP et SSL sursmartproxy.crawlbase.com:8012avec votre token, puis vérifiez avechttpbin.org/ipavant de scraper. -
Attendez, puis lisez. Utilisez
WebDriverWaitsur le titre avant d'extraire, et lisez les champs optionnels via un helper qui retourneNonequand un élément est manquant. - Attendez-vous à ce que les sélecteurs évoluent. Walmart change son balisage sans préavis, réinspectez et mettez à jour les XPaths quand l'extraction renvoie des chaînes vides.
- Restez sur les données publiques. Respectez les CGU et le robots.txt de Walmart ; pas de comptes, pas de données personnelles, pas d'actions de paiement ou de contournement d'authentification.
Foire aux questions
Pourquoi une requête ordinaire ne retourne-t-elle aucune donnée depuis une page produit Walmart ?
Deux facteurs jouent contre une requête HTTP basique. D'abord, Walmart rend une grande partie de ses détails produits côté client, de sorte que le HTML initial est une coquille qui ne se remplit qu'après l'exécution du JavaScript de la page dans un vrai navigateur. Ensuite, Walmart signale rapidement le trafic automatisé et le challenge ou le bloque. Selenium résout le rendu en pilotant un vrai Firefox, et router ce navigateur via le Smart AI Proxy vous donne une IP que le site lit comme un vrai visiteur.
Ai-je besoin d'un proxy pour scraper Walmart avec Selenium ?
Pour tout ce qui dépasse une seule requête de test, oui. Selenium rend la page, mais il envoie des requêtes depuis votre propre IP par défaut, et Walmart limite ou bloque rapidement le trafic automatisé répété. Router Firefox via le Smart AI Proxy effectue une rotation de vos requêtes sur des IP résidentielles côté serveur, de sorte qu'aucune adresse ne déclenche une limite de débit. C'est la différence entre une démo qui fonctionne une fois et un scraper qui continue de fonctionner.
Comment pointer Firefox sur le Smart AI Proxy dans Selenium ?
Définissez la préférence Firefox network.proxy.type sur 1 pour la configuration manuelle, puis définissez network.proxy.http et network.proxy.ssl sur http://[email protected] avec les préférences _port correspondantes définies sur 8012. Passez ces options lors de la création du driver, et chaque requête Firefox sort via le proxy. Vérifiez en chargeant httpbin.org/ip et en confirmant que l'adresse retournée n'est pas la vôtre.
Mes sélecteurs XPath renvoient des chaînes vides. Qu'est-ce qui a changé ?
Presque certainement le balisage de Walmart. Ses noms d'attributs et sa structure de classes changent sans préavis, de sorte que des sélecteurs qui fonctionnaient le mois dernier peuvent se casser. Réinspectez une page produit en direct dans les outils de développement de votre navigateur, trouvez l'attribut ou l'élément actuel pour le champ que vous voulez et mettez à jour le XPath. Une maintenance périodique des sélecteurs est normale pour tout scraper en production, ce n'est pas le signe que l'approche est défaillante.
Dois-je utiliser Selenium ou une API pour scraper Walmart ?
Utilisez Selenium quand vous voulez un contrôle total sur un vrai navigateur, besoin d'interagir avec la page, ou apprenez comment le rendu et les proxies s'articulent. Si vous préférez ignorer le navigateur headless, la Scraper API renvoie du JSON produit pré-analysé pour les sites supportés, et la Crawling API renvoie du HTML rendu en un seul appel sans exécuter vous-même une flotte de navigateurs. Pour les mises en page inhabituelles ou ponctuelles, le build Selenium de ce guide est l'option flexible.
Est-il légal de scraper Walmart ?
Cela dépend des conditions d'utilisation de Walmart, de votre juridiction et de votre objectif, et leurs conditions restreignent l'accès automatisé. Limitez-vous strictement aux données produits publiques, respectez le robots.txt et les attentes de débit, et ne touchez jamais aux comptes, aux données personnelles ni aux flux de paiement et d'authentification. Pour une réutilisation commerciale, obtenez une autorisation ou un accord de données officiel plutôt que de vous appuyer sur un scraper.
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.
