Cómo extraer datos de listados y ventas de eBay para investigación de precios
El historial de listados vendidos de eBay es lo más parecido a una base de datos de precios de mercado libre, si conoces los dos parámetros de URL que lo desbloquean. Aquí te mostramos cómo extraer listados, variantes y precios de transacciones reales a gran escala.
eBay es uno de los mercados entre pares más grandes en la web, lo que lo convierte en una mina de oro para la investigación de precios, seguimiento de competidores y valoración de reventa. Tiene un SDK oficial para desarrolladores, pero los datos más útiles — por cuánto se vendieron realmente los artículos — son más fáciles de recopilar directamente de las páginas de búsqueda públicas. Esta guía muestra cómo extraer listados de eBay, datos de variantes y precios de ventas reales, además de la configuración de proxy que mantiene un scraper activo más allá de las primeras cientos de solicitudes.
La URL de búsqueda es la API
Cuando buscas en eBay, la consulta se codifica completamente en la URL, y un puñado de parámetros controlan exactamente lo que regresa. Domina estos cinco y podrás manejar el catálogo de eBay programáticamente sin tocar un navegador:
_nkw— la palabra clave de búsqueda (codifica espacios en URL como +)._sacat— restricción de categoría (0 = todas las categorías)._sop— orden de clasificación (por ejemplo, recién listados, precio + envío)._pgn— número de página para paginación._ipg— artículos por página (por defecto 60; el máximo práctico por solicitud).
El parámetro de orden _sop merece una mención: sus valores ordenan los resultados por recién listados, precio total más bajo incluyendo envío, o finalizando pronto, lo que te permite configurar feeds específicos — listados más recientes para un monitor de cambios, total más barato para un buscador de ofertas. Restringir con _sacat reduce una palabra clave amplia al departamento correcto, eliminando ruido antes de analizar una sola fila. Palabra clave, categoría y orden juntos te permiten expresar la mayoría de las consultas de investigación como una sola URL, lo que hace que eBay sea agradable de automatizar.
import requests
from urllib.parse import urlencode
proxy = "http://USER:PASS@gate.quantumproxies.io:8000"
proxies = {"http": proxy, "https": proxy}
def search_url(keyword, page=1, per_page=60, category=0):
params = {"_nkw": keyword, "_sacat": category,
"_ipg": per_page, "_pgn": page}
return "https://www.ebay.com/sch/i.html?" + urlencode(params)
r = requests.get(search_url("vintage seiko watch"),
proxies=proxies, timeout=20)
print(r.status_code) # parse r.text with your HTML library of choice

Listados vendidos y completados: el precio real de mercado
Este es el endpoint que importa para los precios. Los listados activos solo te dicen lo que los vendedores esperan obtener; muchos nunca se venden. eBay expone el historial de transacciones reales en la misma página de búsqueda a través de dos parámetros adicionales: LH_Complete=1 muestra todos los listados completados, y LH_Sold=1 se reduce a artículos que realmente se vendieron. En un listado vendido, el precio es el valor final de venta, no un precio de oferta — lo que hace de esta la fuente gratuita más limpia de lo que realmente valen las cosas:
def sold_url(keyword, page=1):
# append the completed + sold filters to any search
return ("https://www.ebay.com/sch/i.html?"
f"_nkw={keyword.replace(' ', '+')}"
"&LH_Complete=1&LH_Sold=1"
f"&_ipg=60&_pgn={page}")
# every sold row = a real transaction: use median, not mean,
# to shrug off outliers and shill bids
r = requests.get(sold_url("nike dunk low panda 10"),
proxies=proxies, timeout=20)
Debido a que la página de ventas utiliza el mismo marcado que una búsqueda estándar, tu analizador de listas lo maneja sin cambios — solo agregas los dos filtros. Toma la mediana de los últimos 30-60 precios vendidos en lugar del promedio, y obtienes un valor de mercado robusto en el que los flujos de trabajo de monitoreo de precios de competidores pueden confiar.
Analizando un listado: precio, especificaciones y variantes
Un listado de una sola variante es sencillo: el precio se encuentra en el elemento de precio principal, la tabla de especificaciones del artículo (condición, marca, modelo, tamaño) es un conjunto de pares etiqueta/valor, y la descripción se encuentra en un iframe que puedes obtener por separado. Observa la conversión de precios regional de eBay — algunas regiones obtienen un precio convertido junto al original, así que captura ambos.
Los productos de múltiples variantes (un teléfono con opciones de modelo, almacenamiento y color) son más complicados porque los precios por opción se actualizan mediante JavaScript. Esos datos no están en el HTML visible — son datos web ocultos, almacenados en una variable de JavaScript llamada MSKU dentro de una etiqueta <script>. Extrae ese JSON y obtienes el precio y stock de cada variante de un solo golpe, sin renderizar la página:
import re, json
def extract_msku(html):
# the variant matrix lives in a JS object keyed 'MSKU'
m = re.search(r'"MSKU"\s*:\s*(\{.*?\})\s*[,}]', html, re.S)
if not m:
return {} # single-variant listing, no matrix
data = json.loads(m.group(1))
# data now holds per-variant price, currency and stock flags
return data
variants = extract_msku(r.text)

Manteniéndose sin bloqueos a gran escala
Un listado es trivial. La escala es donde eBay se defiende — con limitación de tasa, desafíos CAPTCHA y contenido dinámico que marca patrones automatizados. Las IPs de centros de datos se limitan rápidamente en los mercados; la solución confiable son los proxies residenciales que se presentan como compradores ordinarios, rotados para que ninguna IP acumule un estallido obvio. Espacia las solicitudes, respeta cualquier 429 con retroceso, y localiza tu salida cuando necesites precios específicos de la región, ya que eBay adapta resultados y moneda por geografía.
Cuando un objetivo añade una gestión de bots más pesada o prefieres no mantener la pila de análisis y rotación tú mismo, una Scraper API maneja la rotación de IPs, el renderizado de JS y los reintentos detrás de un endpoint y devuelve HTML limpio, JSON o markdown. Para el manual más amplio del mercado, nuestra guía sobre automatización de mercados en Amazon, eBay y Etsy cubre la seguridad de cuentas y la geo-segmentación.
Extrae eBay con proxies residenciales limpios
De la extracción al conjunto de datos
Una vez que las filas están fluyendo, la disciplina es la deduplicación y el historial. Clave cada registro por su id de artículo de eBay para que una nueva extracción actualice la fila existente en lugar de duplicarla, y almacena el precio con una marca de tiempo y la condición del artículo en cada extracción — un precio de venta solo significa algo junto a su fecha y si el artículo era nuevo o usado. Mantén una ventana móvil de datos recientes vendidos por producto y tendrás una valoración en vivo que se actualiza sola, lo cual es la base de cualquier herramienta de reventa, reajuste de precios o arbitraje. Combina eso con alertas sobre movimientos repentinos de precios y el conjunto de datos comienza a vigilar por ti.
¿Es legal extraer datos de eBay?
Esta es información general, no asesoría legal. Recopilar datos de listados disponibles públicamente — precios, condiciones, historial de ventas — a tasas respetuosas es ampliamente considerado legítimo. La línea a observar son los datos personales: los nombres de los vendedores, ubicaciones y detalles de contacto están protegidos bajo el GDPR en la UE y leyes similares en otros lugares, así que evita almacenarlos sin una base legal. Extrae la señal del mercado, no a las personas.
Preguntas frecuentes
¿Cómo extraigo listados vendidos de eBay?
Toma cualquier URL de búsqueda de eBay y añade LH_Complete=1&LH_Sold=1. Eso cambia los resultados a listados completados que realmente se vendieron, donde el precio mostrado es el valor final de la transacción. La página utiliza el mismo marcado que una búsqueda normal, por lo que el mismo analizador extrae título, precio y fecha de venta para la investigación de precios.
¿Puedo extraer precios de eBay sin la API oficial?
Sí. Las páginas de búsqueda y listados públicos devuelven todo lo que un comprador ve, sin cuota ni OAuth. Los parámetros de búsqueda (_nkw, _sacat, _pgn, _ipg) manejan consultas y paginación, y las páginas de productos llevan precio, especificaciones del artículo y datos de variantes. Necesitarás proxies residenciales rotativos para mantener el volumen sin ser limitado por la tasa.
¿Cómo obtengo precios de variantes de eBay?
Los listados con múltiples opciones almacenan su precio y stock por variante en un objeto de JavaScript llamado MSKU incrustado en una etiqueta de script, no en el HTML visible. Extrae ese bloque JSON y obtienes el precio de cada combinación sin renderizar la página o hacer clic en cada opción — mucho más rápido y confiable que manejar un navegador.
¿Por qué mi scraper de eBay es bloqueado?
eBay aplica limitación de tasa y desafíos CAPTCHA al tráfico que parece automatizado, y los rangos de IP de centros de datos se limitan rápidamente. Distribuye las solicitudes a través de IPs residenciales rotativas, espácialas con retrasos, retrocede en cualquier 429, y mantén los encabezados coherentes. Si los desafíos persisten, una Scraper API que rota IPs y renderiza JavaScript elimina la carga de mantenimiento.
Extrae la página de búsqueda como una API, desbloquea el historial de ventas con dos parámetros, extrae matrices de variantes del JSON incrustado, y enruta todo a través de IPs residenciales limpias. Haz eso y eBay se convierte en un conjunto de datos de precios en vivo que controlas.