Cómo extraer datos de productos de Amazon a gran escala en Python
El tutorial de tres líneas de BeautifulSoup funciona una vez, luego Amazon te sirve un CAPTCHA. Esto es lo que realmente se rompe a gran escala: selectores de precios cambiantes, precios geolocalizados, bloqueos de IP, y el pipeline que sobrevive a esto.
La extracción de datos de productos de Amazon parece trivial en cada tutorial para principiantes: requests, BeautifulSoup, obtener el título y el precio, listo. Eso funciona exactamente hasta que lo ejecutas unas pocas cientos de veces, momento en el cual Amazon te entrega una página de verificación de robots y tu selector de precios devuelve None. Esta guía trata sobre la versión que sobrevive al contacto con el sitio real: un pipeline centrado en ASIN, los selectores que realmente se rompen, por qué el mismo producto muestra un precio diferente a diferentes IPs, y la configuración de proxy que te mantiene alejado del muro de CAPTCHA. Se trata de datos de productos públicos (títulos, precios, calificaciones, disponibilidad), no de nada detrás de un inicio de sesión.
La estructura de la URL: los ASIN son la clave
Cada producto de Amazon tiene un ASIN, un identificador de 10 caracteres como B08N5WRWNW, y todo el catálogo depende de él. Una página de producto es simplemente https://www.amazon.com/dp/<ASIN>, y el mismo ASIN se mapea en todos los mercados (amazon.co.uk/dp/<ASIN>, amazon.de/dp/<ASIN>). Las páginas de búsqueda y categoría se encuentran bajo /s? con parámetros de consulta y nodo de navegación. Así que un pipeline escalable tiene dos etapas: descubrir ASINs de las páginas de búsqueda o más vendidos, luego hidratar cada uno desde su página /dp/. Un aviso: un ASIN "padre" (un producto con variantes de tamaño o color) se resuelve en una variación infantil auto-seleccionada, así que captura el ASIN de la variante en la que realmente aterrizaste.
import requests
from bs4 import BeautifulSoup
PROXY = "http://USER:PASS@gate.quantumproxies.io:8000"
HEADERS = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36",
"Accept-Language": "en-US,en;q=0.9"}
def product(asin, domain="com"):
url = f"https://www.amazon.{domain}/dp/{asin}"
r = requests.get(url, headers=HEADERS,
proxies={"http": PROXY, "https": PROXY}, timeout=20)
soup = BeautifulSoup(r.text, "html.parser")
return parse(soup, asin)
El selector que todos copian y Amazon retiró
Casi todos los tutoriales antiguos leen el precio de span#priceblock_ourprice. Amazon ofrece múltiples diseños de bloques de precios y los prueba A/B, por lo que ese único ID está vacío en la mayoría de las páginas hoy en día. El enfoque duradero es probar varios contenedores de precios conocidos en orden y tomar el primero que coincida, y tratar un precio faltante como un estado real (generalmente fuera de stock), no como un fallo.
def parse(soup, asin):
title = soup.select_one("#productTitle")
price = None
for sel in ["span.a-price span.a-offscreen", # current layout
"#priceblock_ourprice", # legacy
"#priceblock_dealprice", # deal layout
"#corePrice_feature_div .a-offscreen"]:
el = soup.select_one(sel)
if el and el.get_text(strip=True):
price = el.get_text(strip=True)
break
rating = soup.select_one("span.a-icon-alt")
return {
"asin": asin,
"title": title.get_text(strip=True) if title else None,
"price": price, # None -> likely out of stock
"rating": rating.get_text(strip=True) if rating else None,
}

Por qué el mismo producto muestra dos precios
Este es el hecho que arruina silenciosamente los conjuntos de datos de precios. Amazon localiza el precio y la disponibilidad a la ubicación de entrega del comprador, la configuración de "Entregar a", que infiere en gran medida de tu IP. Extrae amazon.com desde una IP de centro de datos alemán y puedes obtener precios en euros, ofertas diferentes o un ganador de Buy Box diferente al que ve un comprador de EE. UU. Si estás recopilando datos de precios competitivos, la geografía de la IP de salida es el experimento: para capturar el precio que ve un comprador de EE. UU., enruta a través de un proxy residencial de EE. UU.; para el mercado del Reino Unido, una salida del Reino Unido. Un producto, muchos precios, uno por mercado que muestras.
Obtén proxies residenciales geolocalizados
Por qué los extractores ingenuos son bloqueados
Amazon ejecuta sistemas automatizados de gestión de solicitudes: si te apresuras demasiado rápido desde una IP, obtienes un CAPTCHA, una prohibición de IP o una página reducida. Tres cosas mantienen vivo a un extractor a gran volumen. Primero, rota las IPs para que ninguna dirección individual soporte toda la carga: un grupo residencial rotativo distribuye las solicitudes a través de muchas IPs de consumidores reales. Segundo, modera tu ritmo: retrasos aleatorios y un límite de concurrencia, no un bucle a toda velocidad. Tercero, envía encabezados coherentes: un User-Agent de navegador real y Accept-Language, no la cadena predeterminada de Python. Cuando una página regresa sospechosamente corta o contiene un marcador de verificación de robots, descártala y vuelve a intentarlo con una IP nueva en lugar de analizar basura.
import time, random
def fetch_many(asins, domain="com"):
rows = []
for asin in asins:
for attempt in range(3):
data = product(asin, domain)
if data["title"]: # got a real page
rows.append(data)
break
time.sleep(1.5 + random.random()) # back off, rotate, retry
time.sleep(random.uniform(1, 3)) # pace between products
return rows
Búsqueda, más vendidos y paginación
Las páginas de productos son el detalle; las páginas de búsqueda y más vendidos son cómo descubres qué obtener. Una búsqueda por palabra clave es /s?k=<query>&page=<n>; los más vendidos dependen de los nodos de navegación de categoría. Recorre las páginas, extrae los ASINs de cada tarjeta de resultado, luego aliméntalos en la etapa de producto anterior. Mantén las dos etapas separadas: te permite deduplicar ASINs, reanudar un rastreo y volver a valorar una lista de ASINs conocida en un horario sin redescubrirla en cada ejecución. Para una construcción más amplia, nuestra guía sobre los mejores proxies para la extracción web cubre el lado del grupo de esto.
Para la salida en sí, mantén el esquema de filas plano y estable: un asin, la url de origen, title, price, rating, recuento de reseñas, una image_url y el domain del mercado del que extrajiste. Escribe el dominio en cada fila para que un conjunto de datos de mercado mixto nunca confunda un precio de EE. UU. con uno del Reino Unido. Captura el ASIN incluso cuando el precio está vacío: una lectura fuera de stock es un punto de datos, no un vacío, y rastrear cuándo un producto entra y sale de stock a menudo es tan valioso como el precio. Un CSV o tabla de base de datos con esas columnas se alimenta limpiamente en el seguimiento de precios, alertas de disponibilidad o un estudio de Buy Box sin más remodelación.

Proxies vs una API de extracción: cuándo cambiar
requests hecho a mano más un buen grupo residencial es la elección correcta mientras controlas el volumen y el objetivo se mantiene cooperativo. Una vez que estás manteniendo selectores rotativos, manejo de CAPTCHA, fijación geográfica y lógica de reintentos a través de miles de ASINs al día, ese mantenimiento se convierte en el trabajo. Una Scraper API lo colapsa: envía una URL de Amazon, obtén datos estructurados de productos con rotación, renderizado y geolocalización manejados por ti. La regla honesta: bricolaje mientras la fricción es baja, cambia cuando el mantenimiento anti-bot cuesta más tiempo de ingeniería que lo que vale la información. Nuestro desglose de construir vs comprar pone números en esa línea.
Preguntas frecuentes
¿Cómo extraigo datos de productos de Amazon con Python?
Obtén la página del producto en /dp/<ASIN> con requests y un User-Agent de navegador real, luego analiza título, precio, calificación y disponibilidad con BeautifulSoup. Prueba varios selectores de precios, no solo el retirado priceblock_ourprice. Enruta a través de un proxy residencial rotativo para que los picos no desencadenen un bloqueo, y fija la geolocalización de salida al mercado cuyo precio deseas.
¿Es legal extraer datos de productos de Amazon?
La recopilación de datos de productos públicamente visibles, como títulos, precios y calificaciones, generalmente se trata de manera diferente a eludir inicios de sesión o copiar contenido protegido, pero los términos de Amazon restringen el acceso automatizado y el panorama legal varía según la jurisdicción y el uso. Esta es información general, no asesoramiento legal: extrae solo datos públicos, respeta los límites de velocidad y busca asesoramiento para cualquier cosa comercial o en el límite.
¿Por qué mi extractor de Amazon obtiene un precio diferente al del sitio web?
Amazon localiza los precios y la disponibilidad a la ubicación de entrega que infiere de tu IP. Si tu proxy sale en un país diferente al mercado que estás estudiando, verás la moneda y las ofertas incorrectas. Fija la IP de salida al mercado objetivo: una IP residencial de EE. UU. para precios de EE. UU., una IP del Reino Unido para precios del Reino Unido, para que los datos coincidan con lo que ve un comprador real allí.
¿Cómo evito ser bloqueado al extraer datos de Amazon?
Rota a través de muchas IPs residenciales para que ninguna dirección individual soporte la carga, regula con retrasos aleatorios y un límite de concurrencia, y envía encabezados de navegador coherentes. Valida cada respuesta: un 200 aún puede ser una página de verificación de robots, y vuelve a intentarlo con una IP nueva en lugar de analizar una bloqueada. A gran volumen, una Scraper API maneja todo eso por ti.
Amazon a gran escala no es difícil porque el análisis sea difícil, es difícil porque el sitio se defiende y el precio depende de dónde te encuentres. Construye centrado en ASIN, combina varios contenedores de precios, fija tu geolocalización, rota tus IPs y trata una respuesta corta como un bloqueo, no como datos. Hazlo bien y el tutorial para principiantes finalmente escala.