Cómo Extraer Datos de Productos de AliExpress para Investigación de Dropshipping
AliExpress oculta sus datos de productos en una variable de JavaScript, no en el HTML que ves. Obtén ese JSON y tendrás precios, descuentos, origen de envío y conteos de ventas en una sola solicitud — aquí te mostramos cómo, con la infraestructura anti-bloqueo.
AliExpress es el mayor mercado global y una fuente principal para la investigación de dropshipping: historial de precios y descuentos, qué se está vendiendo realmente, origen de envío, y cómo cambian las ofertas por país. En 2026 se apoya mucho en la renderización de JavaScript y nombres de clases aleatorios, lo que asusta a la gente a usar un navegador completo. Normalmente no necesitas uno. Los datos del producto ya están en el código fuente de la página dentro de una variable de JavaScript — extrae eso y obtendrás datos estructurados limpios en una sola solicitud. Esta guía muestra el método del JSON oculto, la dimensión geográfica que hace valiosos los datos de AliExpress, y la infraestructura de proxies que mantiene vivo un scraper.
Los datos están en window.runParams, no en el DOM
Abre una página de categoría o resultados de búsqueda y ve el código fuente. Todas las vistas previas de productos están almacenadas en una variable de JavaScript llamada window.runParams, escondida dentro de una etiqueta <script>. Este es un patrón moderno común — el servidor envía los datos como JSON y el frontend los renderiza del lado del cliente. Para un scraper es un regalo: te saltas los selectores CSS frágiles por completo, extraes la etiqueta script con una expresión regular y la analizas como un diccionario. Esta técnica se llama extracción de datos web ocultos, y es mucho más duradera que perseguir nombres de clases que cambian en cada despliegue.
import re, json, httpx
HEADERS = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
"(KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36",
"accept-language": "en-US,en;q=0.9",
}
PROXY = "http://USER:PASS@gate.quantumproxies.io:8000"
def get_run_params(html: str) -> dict:
# The product data lives in window.runParams = {...};
m = re.search(r"window\.runParams\s*=\s*(\{.+?\});", html, re.DOTALL)
if not m:
raise ValueError("runParams not found - page may be blocked or changed")
return json.loads(m.group(1))
url = "https://www.aliexpress.com/category/.../catName.html"
r = httpx.get(url, headers=HEADERS, proxy=PROXY, timeout=30)
data = get_run_params(r.text)
Analizando los campos que importan para la investigación
El blob de runParams es enorme, así que extrae solo los campos que la investigación de dropshipping y precios realmente utiliza: el título del listado, precio original vs precio de venta, el porcentaje de descuento, cuántos se han vendido, y — críticamente — el país de origen del envío, que influye en el tiempo de entrega y la confianza del comprador. La anidación parece intimidante pero es estable:
def parse_items(data: dict) -> list[dict]:
items = data.get("mods", {}).get("itemList", {}).get("content", [])
out = []
for it in items:
prices = it.get("prices", {})
sale = prices.get("salePrice", {})
orig = prices.get("originalPrice", {})
out.append({
"id": it.get("productId"),
"title": it.get("title", {}).get("displayTitle"),
"sale_price": sale.get("minPrice"),
"orig_price": orig.get("minPrice"),
"discount_pct": sale.get("discount"),
"currency": sale.get("currencyCode"),
"sold": it.get("trade", {}).get("tradeDesc"), # e.g. "1,000+ sold"
"store_id": it.get("store", {}).get("storeId"),
})
return out
for row in parse_items(data)[:5]:
print(row["title"][:40], row["sale_price"], f"-{row['discount_pct']}%", row["sold"])
Esa única llamada te da la economía de un producto: un listado que muestra un precio original de $65.85 bajando a un precio de venta de $23.29 es un descuento del 64% — el tipo de señal de margen que te dice si vale la pena abastecer un artículo. El conteo de "vendidos" es tu proxy de demanda; combinado en una categoría clasifica ganadores sin que toques una página de reseñas.

Paginación de búsqueda sin saturar el sitio
Las páginas de búsqueda usan paginación de longitud conocida, por lo que el idioma eficiente es: extraer la página uno, leer el conteo total de páginas de la respuesta, luego obtener el resto concurrentemente bajo un límite. No dispares todas las páginas a la vez — AliExpress limita agresivamente y comenzará a devolver 403s. Mantén la concurrencia modesta y rota la IP de salida en cada solicitud:
import asyncio, httpx
ROTATING = "http://USER:PASS@rotating.quantumproxies.io:8000"
async def fetch_page(client, query, page):
url = f"https://www.aliexpress.com/w/wholesale-{query}.html?page={page}"
for attempt in range(3):
r = await client.get(url, headers=HEADERS, timeout=30)
if r.status_code == 200:
return parse_items(get_run_params(r.text))
if r.status_code == 403: # blocked: back off, rotate exit
await asyncio.sleep(2 ** attempt)
return []
async def scrape_search(query, max_pages=5):
async with httpx.AsyncClient(proxy=ROTATING) as client:
sem = asyncio.Semaphore(3) # gentle concurrency
async def guarded(p):
async with sem:
return await fetch_page(client, query, p)
pages = await asyncio.gather(*[guarded(p) for p in range(1, max_pages + 1)])
return [row for page in pages for row in page]
results = asyncio.run(scrape_search("wireless earbuds"))
print(len(results), "products")
La rotación del gateway es importante aquí: una IP obteniendo página tras página es la forma más rápida de ganarse un bloqueo, mientras que la rotación por solicitud a través de un pool residencial distribuye la carga para que ninguna salida parezca anormal. La retroalimentación exponencial en el 403 da tiempo a una IP quemada para salir del ciclo.
Extrae datos de AliExpress en más de 90 millones de IPs residenciales
La geografía es el punto clave
AliExpress personaliza precios, moneda, promociones y almacén de origen de envío según la ubicación del visitante — el mismo producto puede mostrar una tarjeta local en EE.UU. con envío más rápido a una IP de EE.UU. y un precio y origen diferentes a una europea. Para la investigación de dropshipping esa dimensión geográfica es el dato: quieres saber qué ve realmente un cliente en tu mercado objetivo. Así que establece deliberadamente el país de salida. Enruta a través de una IP en cada mercado al que vendes y registra las diferencias; un producto que es barato y se envía localmente en una región pero lento y caro en otra es una apuesta muy diferente. Nuestra guía sobre proxies para investigación de dropshipping profundiza en convertir esas matrices en decisiones de abastecimiento.
# One product, three markets - compare price and ship-from per geo
MARKETS = {
"us": "http://USER:PASS-country-us@gate.quantumproxies.io:8000",
"de": "http://USER:PASS-country-de@gate.quantumproxies.io:8000",
"br": "http://USER:PASS-country-br@gate.quantumproxies.io:8000",
}
for market, proxy in MARKETS.items():
r = httpx.get(product_url, headers=HEADERS, proxy=proxy, timeout=30)
d = get_run_params(r.text)
# read price + shipFrom from the product detail runParams for this geo
print(market, "->", extract_price_and_origin(d))
Las reseñas y el stock viven en llamadas separadas
Los listados te dan precio y demanda, pero dos campos de alto valor están detrás de sus propias solicitudes. Las reseñas de clientes no están en el runParams de la página del producto — se cargan desde un endpoint de feedback dedicado, paginado, así que para recopilar calificaciones y texto de reseñas sigues esa llamada por producto en lugar de analizar la página principal. Las señales de stock son similares: el conteo de "vendidos" en un listado es un proxy de demanda acumulativa, mientras que la disponibilidad precisa por variante (color, tamaño, almacén de origen) proviene de los datos SKU en la carga útil del detalle del producto. Para la investigación de dropshipping esto importa porque un producto puede parecer un ganador en precio y ventas mientras que una variante específica que deseas vender está agotada en el almacén que sirve a tu mercado.
Trata los dos como un segundo paso: extrae listados primero para clasificar candidatos por descuento y conteo de vendidos, luego enriquece solo tu lista corta con páginas de reseñas y stock por variante. Eso mantiene el volumen de solicitudes — y tu riesgo de bloqueo — proporcional a cuán serio eres sobre cada producto, en lugar de saturar cada listado por datos que no usarás.
Cuándo omitir el scraper DIY
El método del JSON oculto es duradero, pero AliExpress cambia las formas de carga, bloquea reseñas detrás de un endpoint separado, y escala los bloqueos bajo volumen. Si prefieres no mantener lógica de regex y reintento, una Scraper API toma una URL y devuelve JSON analizado — maneja la renderización, rotación y capa anti-bloqueo, y geo-objetivo con un solo parámetro. Es la elección pragmática una vez que estás recopilando miles de productos en mercados según un horario. Para el patrón general de leer datos directamente de cargas útiles del lado del cliente, consulta nuestra nota sobre por qué un scraper devuelve una página vacía.

Preguntas frecuentes
¿Puedes extraer datos de productos de AliExpress?
Sí. Los datos de listados visibles públicamente — títulos, precios, descuentos, conteos de vendidos, imágenes y origen de envío — se sirven en la variable de JavaScript window.runParams en páginas de categoría, búsqueda y producto. Lo extraes con una expresión regular y lo analizas como JSON, sin necesidad de un navegador sin cabeza para los listados. Respeta los términos y límites de tasa de AliExpress.
¿AliExpress tiene una API pública?
AliExpress ofrece APIs de afiliados y plataforma abierta, pero requieren aprobación, tienen cobertura limitada y están vinculadas a un programa. Para una investigación amplia a través de categorías y mercados, extraer las páginas públicas te da más campos y control geográfico completo, por lo que la mayoría de los investigadores de dropshipping extraen el JSON en la página en su lugar.
¿Por qué recibo errores 403 al extraer datos de AliExpress?
Un 403 significa que AliExpress marcó la solicitud — generalmente demasiados accesos desde una IP, un rango de centro de datos, o un conjunto de encabezados delgado. Rota IPs residenciales por solicitud, añade retroalimentación exponencial en el 403, envía un User-Agent realista y acepta el idioma, y mantén baja la concurrencia. Si runParams falta en el HTML, ese es el bloqueo, no un cambio de diseño.
¿Cómo obtengo precios específicos por país en AliExpress?
Enruta la solicitud a través de una IP de salida en el país objetivo. AliExpress lee la ubicación para establecer moneda, precio, promociones y almacén de origen, por lo que una IP de EE.UU. y una IP alemana ven datos diferentes para el mismo producto. Geo-objetivo el proxy por mercado y registra cada versión para construir una matriz de precios por geografía.
El enfoque ganador es aburrido y duradero: lee el JSON que la página ya envía, paginación cortés, rota IPs residenciales limpias, y geo-objetivo cada mercado que te importa. Haz eso y AliExpress se convierte en un flujo confiable de precios, señales de demanda y economía de envío en lugar de un muro de 403s.