Tony Wang6 min de lecturaCómo hacer scraping de Zappos en 2026 (API y Python)
Haz scraping de Zappos en 2026: búsqueda, precios, ratings, reviews destacadas y variantes de color como JSON — DIY, sin código o API.
La forma más rápida de hacer scraping de Zappos en 2026 es llamar a una API estructurada que devuelve JSON normalizado para la búsqueda de productos y el detalle de producto — en lugar de parsear tú mismo las páginas de Zappos.com. Zappos, una subsidiaria de Zappos.com LLC / Amazon, no tiene una API pública de autoservicio para desarrolladores externos, y sus Términos de Uso nombran explícitamente el data mining, los bots y las herramientas de extracción de datos como excluidos de la licencia para usar el sitio. Esta guía cubre los tres enfoques, qué devuelve cada uno, dónde falla el DIY y la realidad legal desde el principio.
¿Por qué hacer scraping de Zappos?
Los datos de producto y reviews de Zappos impulsan:
- Seguimiento de precios y ofertas — observar cómo cambia el precio de un zapato o prenda y cuándo entra en oferta.
- Investigación de surtido — ver qué marcas y estilos tiene Zappos dentro de una categoría o término de búsqueda.
- Análisis de reviews y sentimiento — extraer desgloses de rating y el texto de reviews destacadas de una línea de producto.
- Mapeo de variantes de color — enumerar cada color en el que se vende un zapato determinado y obtener el detalle de uno específico.
- Benchmarking de retail — comparar precios y surtido de calzado y ropa frente a otros minoristas del sector.
¿Es legal hacer scraping de Zappos?
Opción 1: DIY en Python (y por qué falla)
Las páginas de producto de Zappos se renderizan a partir de datos del lado del servidor en lugar de un endpoint JSON público estable, así que un scraper DIY tiene que obtener y parsear la página renderizada:
import requests
from bs4 import BeautifulSoup
resp = requests.get(
"https://www.zappos.com/p/nike-air-zoom-pegasus-40/product/9876543/color/3",
headers={"User-Agent": "Mozilla/5.0 (compatible; research-bot/1.0)"},
)
soup = BeautifulSoup(resp.text, "html.parser")
# Price, rating breakdown, featured reviews, and sibling color
# variants are embedded in page data, not consistently exposed
# as selectable markup
Funciona en la demo y luego se rompe:
- Los Términos de Uso son explícitos. Los términos de Zappos excluyen «data mining, robots (bots), or similar data gathering and extraction tools» de la licencia para usar el sitio, y por separado prohíben recopilar o usar listados, descripciones, imágenes o precios de producto — no es un caso ambiguo.
- No hay API oficial y documentada. Zappos no tiene un programa de autoservicio para desarrolladores — un puñado de herramientas de scraping de terceros existen precisamente porque no hay una alternativa autorizada para desarrolladores externos.
- Las variantes de color se ramifican por producto. Una sola página de producto muestra un color; cada color adicional es un render distinto, así que cubrir un estilo por completo implica descubrir y obtener cada variante individualmente.
- Las reviews destacadas están curadas, no son un feed completo de reviews. La página muestra un conjunto pequeño y seleccionado por Zappos, no un listado paginado, así que parsear la página solo te da lo que Zappos eligió mostrar.
- No hay un esquema público estable. Un parser basado en scraping de páginas se rompe en silencio cada vez que Zappos cambia su markup o renderizado, sin changelog ni versionado que lo avise.
Opción 2: Herramientas sin código
Existen actors de marketplace scraper para extracciones puntuales de Zappos, pero heredan la misma exposición a los términos de servicio y la misma fragilidad de renderizado que el DIY, y aun así te obligan a ramificar por cada variante de color para armar la cobertura completa de un estilo.
Opción 3: Una API estructurada de Zappos
Para un flujo de trabajo repetible y estructurado, la API de Zappos de Crawlora devuelve JSON normalizado para búsqueda y detalle de producto — sin parsear páginas, sin credenciales. Busca en el catálogo:
curl "https://api.crawlora.net/api/v1/zappos/search?query=running+shoes" \
-H "x-api-key: $CRAWLORA_API_KEY"
Luego resuelve un product_id (y opcionalmente un color_id) y obtén el detalle completo en Python:
import requests
h = {"x-api-key": "YOUR_API_KEY"}
base = "https://api.crawlora.net/api/v1/zappos"
hits = requests.get(f"{base}/search", headers=h, params={"query": "running shoes"}).json()["data"]["products"]
product_id = hits[0]["product_id"]
color_id = hits[0]["color_id"]
detail = requests.get(
f"{base}/product/{product_id}",
headers=h,
params={"colorId": color_id},
).json()["data"]
Una respuesta de búsqueda es JSON paginado y normalizado (campos reales — revisa los docs):
{
"code": 200,
"msg": "OK",
"data": {
"query": "running shoes",
"page": 1,
"page_count": 42,
"products": [
{
"product_id": "9876543",
"color_id": "3",
"brand": "Nike",
"name": "Air Zoom Pegasus 40",
"price": 130.0,
"original_price": 130.0,
"on_sale": false,
"rating": 4.6,
"review_count": 812,
"url": "https://www.zappos.com/p/nike-air-zoom-pegasus-40/product/9876543/color/3"
}
]
}
}
Pedir una página más allá de page_count devuelve un 200 normal con un array products vacío, no un error — esa es tu condición natural de parada al paginar una búsqueda.
El detalle de producto anida breadcrumbs, un desglose de rating, hasta dos reviews destacadas y cada variante de color del mismo producto:
{
"data": {
"product_id": "9876543",
"color_id": "3",
"brand": "Nike",
"name": "Air Zoom Pegasus 40",
"description": "A responsive daily trainer with...",
"price": 130.0,
"original_price": 130.0,
"on_sale": false,
"breadcrumbs": [
{ "name": "Shoes", "url": "https://www.zappos.com/shoes" },
{ "name": "Running", "url": "https://www.zappos.com/running-shoes" }
],
"rating": {
"average": 4.6,
"review_count": 812,
"breakdown": { "5": 540, "4": 190, "3": 60, "2": 15, "1": 7 }
},
"featured_reviews": [
{
"author": "RunnerJen",
"date": "2026-06-02",
"rating": 5,
"text": "Best daily trainer I've owned. True to size, great cushioning.",
"comfort": 5,
"width": "True to Size"
}
],
"color_variants": [
{ "color_id": "3", "color_name": "Black/White", "url": "https://www.zappos.com/p/.../color/3" },
{ "color_id": "7", "color_name": "Photon Dust", "url": "https://www.zappos.com/p/.../color/7" }
]
}
}
Un producto sin reviews todavía devuelve una lista featured_reviews vacía — maneja ese caso en lugar de asumir que siempre hay al menos una review presente. Guarda una fila por product_id + color_id y vuelve a ejecutarlo con un cronograma para hacer seguimiento de los cambios de price/on_sale.
Qué puedes recopilar
Datos públicos de página de producto por endpoint: resultados de búsqueda paginados (product_id, color_id, marca, nombre, precio, estado de oferta, rating, número de reviews); y detalle completo de producto (marca, descripción, breadcrumbs, precio, rating agregado con desglose por estrellas, hasta dos reviews de clientes destacadas y cada variante de color del mismo producto). Solo datos públicos de página de producto — no información de cuenta, pedidos ni pagos.
Limitaciones y retos habituales
- Los Términos de Uso son explícitos. Los términos de Zappos excluyen el data mining, los robots y las herramientas de recopilación/extracción de datos de la licencia para usar el sitio, y por separado prohíben recopilar o usar listados, descripciones, imágenes o precios de producto.
- No hay API pública de autoservicio. Zappos no tiene un programa documentado para desarrolladores externos — todo lo que se scrapea corre contra el propio renderizado del storefront, que cambia sin aviso.
- Defensas anti-bot en el storefront. Como la mayoría de los grandes sitios de e-commerce, Zappos ejecuta defensas contra tráfico automatizado en el edge; espera que las peticiones ingenuas, sin autenticar y de alto volumen sean desafiadas.
- Las reviews destacadas no son el corpus completo de reviews. Obtienes hasta dos reviews seleccionadas por el sitio por producto, no un feed paginado de todas las reviews.
- Las variantes de color se ramifican. Cubrir un estilo por completo implica iterar cada
color_idadicional, no una sola llamada por producto. - Solo datos públicos. Estos son datos de página de producto que Zappos ya muestra públicamente — nunca una forma de evadir un login o acceder a información a nivel de cuenta.
Dónde se usa esto
- Seguimiento de precios y ofertas — observar
pricefrente aoriginal_pricey los cambios deon_saleen calzado y ropa a lo largo del tiempo. - Investigación de surtido — medir la cobertura de marcas y estilos que devuelve un término de búsqueda.
- Investigación de reviews — hacer seguimiento de los desgloses de rating y el sentimiento de las reviews destacadas por producto.
- Cobertura de variantes de color — enumerar cada color en el que se vende un estilo para análisis de catálogo o merchandising.
Fuentes
Empieza a recopilar
Pruébalo primero, gratis: pasa cualquier URL pública por el Free Web Scraper, o comprueba si un sitio bloquea bots con el Anti-Bot Checker — sin registro.
Prueba los endpoints de búsqueda y producto en el Playground, revisa el esquema en los docs de la API y consulta los precios. Para el mismo patrón de calzado y ropa en una tienda directa de marca, mira how to scrape Nike; para el lado de reventa del mismo mercado de zapatillas, mira how to scrape StockX. Consulta también how to choose a web scraping API y is web scraping legal.
Preguntas frecuentes
¿La búsqueda de Zappos admite paginación?
Sí — /zappos/search usa paginación real basada en páginas (hasta 100 resultados por página). Pedir una página más allá de page_count devuelve un 200 normal con un array products vacío, no un error.
¿Puedo obtener reviews de clientes de un producto de Zappos con una API?
Sí — /zappos/product/{productId} devuelve hasta dos reviews destacadas seleccionadas por el propio sitio de Zappos, cada una con autor real, fecha, texto de la review y dimensiones de rating. Un producto sin reviews todavía devuelve una lista vacía.
¿Puedo obtener una variante de color específica de un producto de Zappos?
Sí — pasa un colorId opcional a /zappos/product/{productId}. Si se omite o es inválido, igualmente resuelve el producto base usando una variante de color real en lugar de fallar.