Surveiller les prix Walmart pour une liste de produits avec Python

Construisez une URL de recherche Walmart, parcourez les groupes et articles imbriqués dans la réponse, et associez-la à l'endpoint Amazon pour comparer un prix entre les deux. Testé en août 2026.

Le repricing et la veille concurrentielle partent tous les deux de la même question : à combien ce produit se vend-il sur Walmart en ce moment. Voici comment récupérer ça sous forme de champs structurés avec Python, à quoi ressemble vraiment la réponse une fois dépassé le premier niveau, et l’astuce qui économise des crédits à connaître si vous suivez aussi le même produit sur Amazon.

L’endpoint veut une URL, pas une chaîne de requête

/v1/walmart ne prend pas de paramètre query. Il prend url, et cette url doit être une vraie URL de recherche Walmart, du genre que vous taperiez dans la barre d’adresse. Vous la construisez vous-même :

from urllib.parse import urlencode

def walmart_search_url(query):
    return "https://www.walmart.com/search?" + urlencode({"q": query})

C’est toute l’astuce : la page de recherche de Walmart elle-même prend un paramètre q, donc n’importe quel nom de produit, marque, ou UPC que vous taperiez normalement dans la barre de recherche fonctionne aussi ici. Passez l’URL finie comme url et FastAF la récupère et l’analyse. Comme c’est une URL réelle et ordinaire plutôt qu’un format de requête inventé, n’importe quel tri ou filtre que vous pouvez régler à la main sur la page de recherche de Walmart se retrouve de la même façon, puisque c’est cette URL qui est réellement récupérée.

La version qui fonctionne

import requests

API_KEY = "faf_live_..."  # votre clé FastAF

resp = requests.get(
    "https://api.fastaf.co/v1/walmart",
    params={"url": walmart_search_url("web scraping api")},
    headers={"Authorization": f"Bearer {API_KEY}"},
    timeout=60,
)
resp.raise_for_status()

for group in resp.json()["search_results"]:
    for item in group["item"]:
        print(f'{item["current_price"]:>10}  {item["seller_name"]:<20}  {item["usItemId"]}  {item["title"][:50]}')

Ça coûte 5 crédits et affiche une ligne par produit : prix actuel, vendeur, l’usItemId que vous utilisez pour suivre cette annonce précise, et le titre.

D’abord les groupes, les produits à l’intérieur des groupes

search_results n’est pas une liste plate de produits. C’est une liste de groupes, chacun avec son propre title, description, totalItemCount, et une liste item, et les produits vivent à l’intérieur d’item. En lançant la requête ci-dessus, la réponse est revenue avec deux groupes : un groupe “Results for …” avec zéro article, et un groupe “Other options to consider” portant 40 des 54 articles annoncés. Un code qui ne lit que le premier groupe n’afficherait rien et aurait l’air cassé. Parcourez chaque groupe, comme le fait l’exemple ci-dessus, et vous récupérez les 40.

Les prix arrivent sous forme de chaînes d’affichage, pas de nombres : "$19.59" normalement, "Now $18.61" quand before_price contient la valeur avant réduction. Un petit helper gère les deux :

def clean_price(raw):
    if not raw:
        return None
    return float(raw.replace("Now $", "").replace("$", "").replace(",", ""))

Stockez usItemId comme clé stable. current_price, seller_name et availability_status sont les trois champs qui changent réellement entre deux vérifications ; tout le reste sur une annonce (titre, marque, canonicalUrl) est là pour l’affichage et vaut rarement la peine d’être comparé d’une fois sur l’autre.

Deux champs à connaître avant de compter dessus : rating et reviews reviennent à null sur la plupart des résultats de recherche en pratique, donc construisez votre surveillance autour du prix et du stock, pas du nombre d’avis, sauf si vous avez confirmé qu’une annonce donnée les porte. seller_name vaut aussi le coup d’œil : une recherche Walmart mélange des annonces vendues directement par Walmart.com avec des annonces vendues par des marchands tiers, et l’échantillon ci-dessus a fait remonter les deux plus une poignée de libraires tiers, chaque entrée portant son propre seller_name et current_price. Si votre règle de repricing consiste spécifiquement à suivre le prix de Walmart lui-même plutôt que tous les revendeurs qui apparaissent dans la recherche, filtrez sur seller_name avant de comparer quoi que ce soit.

Suivez-le dans le temps, puis comparez avec Amazon

Une tâche de repricing, c’est juste cet appel sur un planning : enregistrez clean_price(item["current_price"]) par usItemId, comparez à la dernière valeur enregistrée, et alertez au-delà du seuil qui compte pour vous. Trois vérifications par jour et par SKU font 15 crédits par jour, soit environ 450 crédits par mois et par produit suivi.

Si vous vendez le même article à plusieurs endroits, l’endpoint Amazon (1 crédit, contre 5 ici) répond à l’autre moitié de la question :

def amazon_price(query):
    resp = requests.get(
        "https://api.fastaf.co/v1/amazon",
        params={"query": query, "domain": "com"},
        headers={"Authorization": f"Bearer {API_KEY}"},
        timeout=60,
    )
    resp.raise_for_status()
    for item in resp.json()["results"]:
        if item["type"] == "search_product":
            return item["extracted_price"]

Six crédits vous donnent le prix du même produit sur les deux marketplaces en un seul passage, ce qui est normalement exactement ce dont une règle de repricing a besoin : pas juste “est-ce que notre prix a bougé” mais “sommes-nous encore compétitifs face à l’autre canal”. Lancez les deux appels sur le même planning et stockez les deux prix côte à côte, pour qu’un écart entre marketplaces apparaisse comme une ligne dans vos propres données plutôt que comme quelque chose que vous remarquez par hasard des semaines plus tard.

Ce que ça coûte

Volume Crédits (30 jours) Pack qui le couvre Coût
300 SKU, vérifiés une fois par jour 45 000 Growth, 29 $ ~17,40 $ du pack
1 000 SKU, vérifiés deux fois par jour 300 000 Scale, 99 $ tout le pack
5 000 SKU, balayage ponctuel 25 000 Growth, 29 $ ~9,67 $ du pack

Les requêtes échouées ne sont jamais facturées, les crédits sont réservés quand une requête démarre et rendus si rien ne revient. Commencez avec l’offre gratuite : 500 crédits, sans carte, assez pour pointer ça sur votre propre catalogue et voir à quoi ressemble la réponse avant de vous engager sur un planning.