Cómo extraer datos de productos de Walmart: JSON, precios geográficos, bloqueos

Walmart no tiene una API pública, personaliza cada página y bloquea a los scrapers con un CAPTCHA de presionar y mantener. Pero su JSON de Next.js te ofrece datos estructurados limpios, si tu IP sobrevive al acceso. Aquí está todo el método.

Walmart es el minorista más grande del mundo, lo que convierte sus precios en una señal económica en vivo, y no hay una API pública de Walmart para leerla. Así que la gente extrae datos. La buena noticia: Walmart es un sitio de Next.js, y cada página de producto lleva un único blob JSON con todos los datos limpios ya analizados. La mala noticia: una IP de centro de datos se encuentra con un CAPTCHA de presionar y mantener antes de ver ese JSON. Esta guía cubre el método confiable: lee el JSON de hidratación en lugar del HTML estilizado, supera la defensa contra bots de HUMAN con la IP correcta y obtén precios geográficos a nivel de tienda.

Deja de analizar etiquetas. Lee el JSON __NEXT_DATA__

La mayoría de los tutoriales te enseñan a encontrar el h1 para el título y un span para el precio. Eso funciona hasta que Walmart reorganiza sus nombres de clase, lo cual es frecuente. El enfoque duradero: Walmart renderiza React desde una etiqueta de script con id="__NEXT_DATA__" que contiene todo el modelo de producto como JSON. Captura eso una vez y cada campo está estructurado:

import requests, json
from bs4 import BeautifulSoup

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
                  "(KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36",
    "Accept-Language": "en-US,en;q=0.9",
}
proxies = {"http": "http://USER:PASS@gate.quantumproxies.io:8000",
           "https": "http://USER:PASS@gate.quantumproxies.io:8000"}

url = "https://www.walmart.com/ip/1756765288"
r = requests.get(url, headers=headers, proxies=proxies, timeout=20)

soup = BeautifulSoup(r.text, "html.parser")
blob = soup.find("script", id="__NEXT_DATA__")
data = json.loads(blob.string)
product = data["props"]["pageProps"]["initialData"]["data"]["product"]
print(product["name"], product["priceInfo"]["currentPrice"]["price"])

La ruta exacta de las claves cambia con el tiempo, así que imprime las claves de nivel superior una vez y navega desde allí. Pero el principio se mantiene: el JSON es la fuente de verdad e incluye precio, disponibilidad, vendedor, variantes y calificaciones en un solo lugar, sin selector por campo que se rompa.

La puerta: "¿Robot o humano?"

Ejecuta la solicitud desde una IP de centro de datos y no obtendrás el JSON del producto, obtendrás una página que dice "¿Robot o humano? Activa y mantén el botón para confirmar que eres humano." Eso es HUMAN (anteriormente PerimeterX), la capa de defensa contra bots que ejecuta Walmart. Evalúa la reputación de la IP, la huella digital TLS y los encabezados juntos, y un desafío de presionar y mantener es lo que sirve cuando la puntuación es baja.

No resuelves ese CAPTCHA; evitas activarlo. La palanca más grande es la IP. Un proxy residencial se presenta como la conexión de un comprador real de Walmart, lo que mantiene la puntuación lo suficientemente alta como para servir la página real. Los rangos de centros de datos están preevaluados como sospechosos y reciben el muro en la primera solicitud. Nuestro desglose de cómo HUMAN detecta la automatización cubre qué más alimenta esa puntuación.

Flujo para extraer datos de productos de Walmart: URL del producto a través de una salida residencial al JSON __NEXT_DATA__ y filas estructuradas
Ruta a través de una salida residencial, luego lee el JSON de hidratación, sin selectores HTML frágiles en el camino.

Precios geográficos: un producto, muchos precios

Los precios y el stock de Walmart son específicos de la tienda. El mismo artículo muestra un precio y disponibilidad diferentes según la ubicación de compra, por lo que un scraper sin ubicación configurada está leyendo una tienda arbitraria. Establece la ubicación por código postal para controlar qué tienda estás valorando: Walmart lo persiste en una cookie de ubicación, así que envíala en cada solicitud:

# pin the store location by US ZIP before reading price/stock
cookies = {"assortmentStoreId": "3081", "locationData": '{"postalCode":"10001"}'}

r = requests.get(url, headers=headers, cookies=cookies,
                 proxies=proxies, timeout=20)
# now priceInfo + availabilityStatus reflect that store

Para comparar un producto en diferentes mercados, recorre tu lista de códigos postales y empareja cada uno con una salida residencial en esa región: un comprador de Nueva York leyendo precios de la tienda de NYC es mucho más coherente que una solicitud que afirma una ubicación pero sale en otro lugar. Esa coherencia geográfica es exactamente lo que la monitorización de precios de la competencia depende.

Páginas de búsqueda y paginación

Para el trabajo de catálogo, extrae resultados de búsqueda, no solo páginas de productos. Dos cosas a saber: Walmart personaliza el orden de búsqueda por usuario, así que no esperes un rango estable en cada ejecución, y los resultados abarcan múltiples páginas que recorres con un parámetro page. El mismo patrón de __NEXT_DATA__ se aplica: el JSON de búsqueda lleva la lista completa de artículos con precios e IDs, por lo que rara vez necesitas tocar la página del producto a menos que quieras detalles a nivel de variante:

def search(query, pages=5):
    items = []
    for page in range(1, pages + 1):
        url = f"https://www.walmart.com/search?q={query}&page={page}"
        html = requests.get(url, headers=headers, cookies=cookies,
                            proxies=proxies, timeout=20).text
        blob = BeautifulSoup(html, "html.parser").find("script", id="__NEXT_DATA__")
        data = json.loads(blob.string)
        stacks = data["props"]["pageProps"]["initialData"]["searchResult"]["itemStacks"]
        for stack in stacks:
            items += stack["items"]
    return items

Cuándo dejar de hacerlo manualmente

Solicitudes en bruto más IPs residenciales te llevan lejos en Walmart. El punto donde deja de ser rentable es la escala: rotar salidas por solicitud, reintentar las que aún chocan con el muro y mantener la lógica de cookies de tienda coherente en miles de códigos postales es una verdadera carga de mantenimiento. Una Scraper API que lleva la huella digital del navegador, rota IPs residenciales y puede devolver JSON analizado colapsa eso en una sola llamada: envías una URL de Walmart y obtienes el modelo de producto de vuelta, bloqueos manejados. Si tu página regresa como la carcasa del CAPTCHA en lugar de datos, ese es el clásico síntoma de página vacía y es un problema de renderizado y IP, no un error de analizador.

Walmart HUMAN CAPTCHA de presionar y mantener bloqueando una IP de centro de datos mientras una IP residencial pasa a JSON de producto limpio
No resuelves la puerta de presionar y mantener, mantienes tu puntuación de confianza lo suficientemente alta como para que nunca aparezca.

Obtén IPs residenciales que lleguen a Walmart

Preguntas frecuentes

¿Walmart tiene una API de datos de productos?

No hay una API pública abierta para datos arbitrarios de productos y precios, por lo que la extracción es la ruta común. Existen las APIs de afiliados y vendedores del mercado de Walmart, pero están limitadas y restringidas en alcance. Para una recopilación amplia de productos, precios y disponibilidad, leer el JSON __NEXT_DATA__ de la página a través de IPs residenciales es el método práctico.

¿Cómo extraigo precios de Walmart sin ser bloqueado?

Ruta solicitudes a través de proxies residenciales para que la defensa contra bots de HUMAN te califique como un comprador real, envía un User-Agent de navegador coherente y Accept-Language, y lee el JSON de hidratación en lugar de golpear muchas solicitudes de selectores. Fija la tienda por cookie de código postal y mantén la región de salida consistente con ella. Esa combinación evita el CAPTCHA de presionar y mantener en la mayoría de las solicitudes.

¿Por qué Walmart muestra diferentes precios para el mismo producto?

Los precios y el stock de Walmart son a nivel de tienda. El precio que ves depende de la ubicación configurada para la sesión, por lo que dos solicitudes con diferentes ubicaciones de código postal legítimamente devuelven diferentes precios. Para recopilar datos comparables, fija el código postal explícitamente y empareja tu salida de proxy con esa región en lugar de dejar que Walmart adivine desde la IP.

¿Es mejor el JSON __NEXT_DATA__ que analizar HTML?

Sí, por durabilidad. Los nombres de clase visibles de Walmart cambian con frecuencia, rompiendo los scrapers de selectores CSS, pero el JSON de hidratación de Next.js es un modelo estructurado estable del producto con precio, variantes, vendedor y disponibilidad en un solo objeto. Analiza el JSON una vez y evitas una pila de selectores frágiles por campo.

Walmart no es difícil porque los datos estén ocultos, están justo ahí en el JSON de la página. Es difícil porque la puerta verifica quién está llamando. Lee __NEXT_DATA__ en lugar de etiquetas, establece la tienda por código postal y llama con una IP residencial, y obtendrás datos de productos limpios y comparables a escala. Para el trabajo de precios de grandes superficies más ampliamente, el mismo manual se extiende a Best Buy y Target.

Extrae datos de Walmart con una llamada de API