← Todos los artículos

Cómo hacer scraping de precios de Amazon: el plugin y el spider cloud

Hay dos formas de obtener datos de precios de Amazon, y cuál necesitas depende del volumen. Para una ficha de producto o una búsqueda por palabra clave, el plugin de Amazon lo devuelve todo como JSON limpio en una sola llamada. Para millones de páginas de forma programada, ejecutas tu propio spider de Scrapy en nuestro spider cloud, con cada petición ya enrutada a través de la misma API anti-bot. Esta guía cubre ambos, y dónde está la línea entre ellos.

Dos problemas hunden a la mayoría de los scrapers de precios de Amazon, y conviene nombrarlos antes de escribir código:

  1. El muro anti-bot. Una petición HTTP simple a una página de producto /dp/ recibe el “Robot Check” de Amazon o un 503, no el precio. Necesitas una huella de navegador real y una IP de salida limpia, rotada.
  2. La moneda. Esta es más silenciosa y pilla a mucha gente. Amazon pone el precio de cada página en la moneda de la ubicación de entrega que infiere de tu IP de salida. Haz scraping de amazon.com desde un datacenter cualquiera en Dinamarca y el precio vuelve en DKK, o recibes una página de “no se puede enviar a tu ubicación” sin precio alguno. El scraping “funcionó”, solo que el número está mal.

El plugin resuelve ambos por ti. Empecemos por ahí.

Scraping de un producto de Amazon como JSON

El endpoint de producto recibe un ASIN (o una URL de producto completa) y devuelve los campos que la gente realmente quiere: título, marca, precio y moneda, precio de lista y el descuento, disponibilidad, valoración, número de reseñas, vendedor, características, categorías e imágenes.

curl -X POST "https://api.scrapeunblocker.com/marketplace/amazon-product?asin=B0BSHF7WHW&marketplace=amazon.com" \
  -H "x-scrapeunblocker-key: YOUR_API_KEY"
{
  "asin": "B0BSHF7WHW",
  "title": "Apple 2023 MacBook Pro Laptop M2 Pro chip",
  "brand": "Apple",
  "price": 1999.00,
  "currency": "USD",
  "listPrice": 2499.00,
  "savingsPercent": 20,
  "availability": "In Stock",
  "inStock": true,
  "rating": 4.7,
  "reviewCount": 386,
  "images": ["https://m.media-amazon.com/images/I/61fd2oCrvyL.jpg"]
}

Fíjate en que la moneda es USD, no la que resultara ser la IP de salida. Ese es el punto: proxy_country toma por defecto el país de origen del mercado - amazon.com a US, amazon.de a DE, amazon.co.uk a GB - y la petición se fija a una salida ISP en ese país. El precio está en la moneda que tus usuarios esperan, sin nada que configurar. Si quieres una región de entrega concreta, pasa proxy_country tú mismo.

Búsqueda en Amazon por palabra clave

El endpoint de búsqueda recibe una palabra clave y devuelve las tarjetas de resultados - ASIN, título, precio, precio de lista, valoración, número de reseñas, una URL de producto limpia y los indicadores de patrocinado / Prime. Es la mitad de descubrimiento: busca para obtener ASINs y luego trae el detalle completo de cada uno con el endpoint de producto.

import requests

BASE = "https://api.scrapeunblocker.com/marketplace"
HEAD = {"x-scrapeunblocker-key": "YOUR_API_KEY"}

# Encuentra productos, del más barato al más caro
search = requests.post(
    f"{BASE}/amazon-search",
    params={"keyword": "wireless headphones", "sort": "price_asc"},
    headers=HEAD, timeout=180,
).json()

for card in search["results"][:5]:
    print(card["asin"], card["price"], card["currency"], card["rating"])

# Luego trae el producto completo del más barato
top = search["results"][0]["asin"]
product = requests.post(
    f"{BASE}/amazon-product",
    params={"asin": top},
    headers=HEAD, timeout=180,
).json()
print(product["title"], product["priceRaw"], product["availability"])

Puedes filtrar con min_price / max_price, ordenar por price_asc, price_desc, avg_review o newest, y paginar con page. Algunas tarjetas vuelven con price: null - eso es Amazon aplazando el precio en la página de búsqueda, o un artículo que solo muestra opciones de compra. Esas tarjetas se mantienen en la lista en lugar de descartarse, así que siempre ves la página completa.

Con un SDK

Todos los SDK oficiales exponen ambos métodos, así que no construyes la petición tú mismo:

// Node.js
const product = await su.amazonProduct({ asin: "B0BSHF7WHW" });
const results = await su.amazonSearch("wireless headphones", { sort: "price_asc" });
# Python
product = su.amazon_product(asin="B0BSHF7WHW")
results = su.amazon_search("wireless headphones", sort="price_asc")

Ruby (amazon_search) y PHP (amazonSearch) tienen el mismo par. Todos fijan la salida al país del mercado, así que la moneda se maneja igual.

Cuando necesitas escala: un spider en la nube

El plugin es la herramienta adecuada para una ficha de producto, una búsqueda, una comprobación de precio, un panel que refresca unos miles de SKUs. Cuando cruzas a cientos de miles o millones de páginas de forma programada - una categoría entera seguida a diario, el catálogo completo de un competidor, el histórico de precios en cada mercado - quieres un crawler, no un bucle de llamadas. Para eso está el spider cloud.

Ejecuta tu propio proyecto de Scrapy en nuestra infraestructura, y lo importante para Amazon es que cada petición ya pasa por la misma API anti-bot que usa el plugin. Escribes Scrapy normal - spiders, items, pipelines - y el muro anti-bot y la rotación de salidas se manejan por debajo. No estás construyendo gestión de proxies, lógica de reintentos ni fingerprinting; estás escribiendo el parseo.

Un spider mínimo de precios de Amazon se parece a cualquier otro spider de Scrapy:

import scrapy

class AmazonPriceSpider(scrapy.Spider):
    name = "amazon_prices"

    def start_requests(self):
        for asin in self.settings.get("ASINS", []):
            yield scrapy.Request(
                f"https://www.amazon.com/dp/{asin}",
                meta={"asin": asin},
            )

    def parse(self, response):
        price = response.css("#corePriceDisplay_desktop_feature_div "
                             ".a-price-whole::text").get()
        yield {
            "asin": response.meta["asin"],
            "title": response.css("#productTitle::text").get(default="").strip(),
            "price": price,
            "scraped_at": self.crawler.stats.get_value("start_time"),
        }

Lo despliegas con un comando desde la raíz del proyecto:

su-cloud deploy --notes "amazon price spider"

La forma más rápida de llegar ahí es nuestra plantilla starter de Spider Cloud en GitHub: un proyecto Scrapy listo para ejecutar, con un spider de ejemplo que funciona y todo el flujo deploy -> run -> leer tus datos ya montado. Haz clic en Use this template, pon tu token y tendrás un spider corriendo en la nube en unos minutos; luego cambia el ejemplo por tu spider de Amazon.

A partir de ahí compras el paralelismo que necesitas, lo pones en un horario (diario, cada hora) y lees los items como JSON mientras el trabajo sigue corriendo. Trabajos, logs, recuentos de items en vivo y estadísticas están todos en el panel. El spider cloud es nuestro equivalente propio de un servicio Scrapy alojado, con la capa anti-bot integrada en lugar de añadida - la misma capa, tanto si llamas al plugin como si ejecutas un spider a través de ella.

¿Cuál deberías usar?

  • Un producto, una búsqueda, una comprobación de precio, un panel modesto - el plugin. Una llamada, JSON de vuelta, moneda correcta, sin infraestructura.
  • Un catálogo entero, una categoría seguida de forma programada, histórico de precios a millones de páginas - un spider de Scrapy en el spider cloud. Tú escribes el crawl; nosotros manejamos el bloqueo y la escala.

Ambos leen las mismas páginas que ve un comprador, con tu clave de ScrapeUnblocker y nada más - sin cuenta de Selling Partner, sin aprobación de la Product Advertising API, sin vínculo de afiliado. Empieza con el plugin en el panel y pasa a la nube cuando el volumen lo pida.

Prueba ScrapeUnblocker gratis

Tasa de éxito del 95%+ · desde 0,55 € por cada 1000 llamadas · 500 solicitudes gratis al registrarte.

Pruébalo gratis → Ver precios