Monitorare i prezzi Walmart per un set di prodotti con Python

Costruisci un URL di ricerca Walmart, scorri i gruppi e gli articoli annidati nella risposta, e abbinalo all'endpoint Amazon per confrontare lo stesso prezzo su entrambi. Testato ad agosto 2026.

Repricing e monitoraggio competitivo partono entrambi dalla stessa domanda: a quanto si vende questo prodotto su Walmart in questo momento. Ecco come tirarlo fuori come campi strutturati con Python, come appare davvero la risposta una volta superato il primo livello, e la mossa che ti fa risparmiare crediti se tieni d’occhio lo stesso prodotto anche su Amazon.

L’endpoint vuole un URL, non una stringa di query

/v1/walmart non accetta un parametro query. Accetta url, e quell’url deve essere un vero URL di ricerca Walmart, il tipo che digiteresti nella barra degli indirizzi. Te lo costruisci da solo:

from urllib.parse import urlencode

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

Questo è tutto il trucco: la pagina di ricerca di Walmart stessa accetta un parametro q, quindi qualunque nome prodotto, marca, o UPC che normalmente digiteresti nella casella di ricerca funziona anche qui. Passa l’URL finito come url e FastAF lo recupera e lo analizza. Dato che è un URL vero e normale invece di un formato di query inventato, qualunque ordinamento o filtro che imposteresti a mano sulla pagina di ricerca di Walmart passa allo stesso modo, visto che è quell’URL a essere effettivamente recuperato.

La versione che funziona

import requests

API_KEY = "faf_live_..."  # la tua chiave 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]}')

Questo costa 5 crediti e stampa una riga per prodotto: prezzo attuale, venditore, lo usItemId che usi per tracciare quella scheda esatta, e il titolo.

Prima i gruppi, i prodotti dentro i gruppi

search_results non è una lista piatta di prodotti. È una lista di gruppi, ciascuno con un proprio title, description, totalItemCount, e una lista item, e i prodotti vivono dentro item. Eseguendo la query sopra, la risposta è tornata come due gruppi: un gruppo “Results for …” con zero elementi, e un gruppo “Other options to consider” che portava 40 dei suoi 54 elementi dichiarati. Un codice che legge solo il primo gruppo non stamperebbe niente e sembrerebbe rotto. Cicla su ogni gruppo, come fa l’esempio sopra, e li ottieni tutti e 40.

I prezzi arrivano come stringhe da mostrare, non numeri: "$19.59" normalmente, "Now $18.61" quando before_price contiene il valore prescontato. Un piccolo helper gestisce entrambi i casi:

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

Usa usItemId come chiave stabile. current_price, seller_name, e availability_status sono i tre campi che cambiano davvero tra un controllo e l’altro; tutto il resto su una scheda (titolo, marca, canonicalUrl) è lì per la visualizzazione e raramente vale la pena diffarlo.

Due campi da conoscere prima di farci affidamento: rating e reviews tornano null sulla maggior parte dei risultati di ricerca in pratica, quindi costruisci il tuo monitoraggio attorno a prezzo e disponibilità, non al numero di recensioni, a meno che tu non abbia verificato che una data scheda li porti. Vale la pena controllare anche seller_name: una ricerca Walmart mescola schede vendute direttamente da Walmart.com con altre vendute da venditori marketplace, e il campione sopra ne ha trovate di entrambi i tipi più una manciata di librerie terze, ciascuna voce con il proprio seller_name e current_price. Se la tua regola di repricing riguarda specificamente il prezzo di Walmart stesso e non ogni rivenditore che compare in ricerca, filtra su seller_name prima di diffare qualsiasi cosa.

Traccialo nel tempo, poi confrontalo con Amazon

Un job di repricing è solo questa chiamata su uno schedule: salva clean_price(item["current_price"]) per usItemId, confronta con l’ultimo valore salvato, e manda un alert oltre qualunque soglia ti interessi. Tre controlli al giorno per SKU sono 15 crediti al giorno, circa 450 crediti al mese per prodotto tracciato.

Se vendi lo stesso articolo in più di un posto, l’endpoint Amazon (1 credito, contro i 5 di qui) risponde all’altra metà della domanda:

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"]

Sei crediti ti danno il prezzo dello stesso prodotto su entrambi i marketplace in un solo passaggio, che è normalmente esattamente quello che serve a una regola di repricing: non solo “il nostro prezzo si è mosso” ma “siamo ancora competitivi contro l’altro canale”. Fai girare la coppia sullo stesso schedule e salva entrambi i prezzi uno accanto all’altro, così uno scarto tra marketplace compare come riga nei tuoi dati invece che come qualcosa che noti per caso settimane dopo.

Quanto costa

Volume Crediti (30 giorni) Pacchetto che lo copre Costo
300 SKU, controllati una volta al giorno 45.000 Growth, $29 ~$17,40 del pacchetto
1.000 SKU, controllati due volte al giorno 300.000 Scale, $99 tutto il pacchetto
5.000 SKU, scansione una tantum 25.000 Growth, $29 ~$9,67 del pacchetto

Le richieste fallite non vengono mai fatturate, i crediti vengono riservati quando una richiesta parte e restituiti se non torna nulla. Inizia con il piano gratuito: 500 crediti, senza carta, abbastanza per puntarlo sul tuo catalogo e vedere come appare la risposta prima di impegnarti su uno schedule.