Cómo raspar los resultados de búsqueda de eBay: Guía de preparación de sesión y anti-detección
Advanced Data Extraction Specialist
Principales Conclusiones:
- Una solicitud fría al endpoint de búsqueda de eBay está bloqueada. Una navegación automatizada directa a
https://www.ebay.com/sch/i.html?_nkw=laptoplleva a una página de error de eBay, incluso desde una sesión nueva de navegador en la nube residencial de EE. UU. — eBay restringe el camino de búsqueda más que sus páginas de artículos y navegación. - Calentar la sesión es la clave. Abre una sesión persistente de navegador en la nube, primero aterriza en la página de inicio de eBay para que las cookies y el estado de navegación se establezcan, luego navega a la URL de búsqueda en esa misma sesión. La página de búsqueda se carga entonces con toda la cuadrícula de resultados renderizada.
- Extracción de anclajes en
.su-card-container. eBay rotó su marcado de tarjetas de resultados; el antiguo selectorli.s-itemahora no coincide con nada. Las tarjetas de resultados orgánicos actuales llevan la clase.su-card-container— selecciona sobre eso y lee los campos hijos de cada tarjeta. - La integración es un único endpoint CDP. Construye una URL de WebSocket de Scrapeless Scraping Browser con tu clave API, y
connect_over_cdpde Playwright lo controla exactamente como lo haría un navegador local — así que el renderizado, la salida residencial y la detección de huellas digitales se mueven del lado de la nube. - La salida residencial lleva la ejecución. El Scrapeless Scraping Browser se conecta a través de proxies residenciales en más de 195 países y aleatoriza la huella digital del navegador por sesión, por lo que el navegador en la nube renderiza las páginas de eBay que un navegador automatizado local filtra.
- Gratis para comenzar. Las nuevas cuentas de Scrapeless incluyen tiempo de ejecución gratuito de Scraping Browser — regístrate en app.scrapeless.com.
Introducción: Por qué la página de búsqueda de eBay bloquea el enfoque obvio
eBay es uno de los marketplaces públicos más grandes en la web, y sus resultados de búsqueda son una fuente densa de datos sobre precios, listados y competitividad. Los equipos de precios rastrean por cuánto se venden artículos comparables, los equipos de protección de marca vigilan listados no autorizados y los agentes de IA obtienen contexto de listados para responder preguntas sobre productos. Todo eso vive detrás del endpoint de búsqueda en /sch/i.html.
El enfoque obvio — apuntar un cliente HTTP o un navegador sin cabeza local a esa URL — falla rápidamente. Una solicitud automatizada fría a https://www.ebay.com/sch/i.html?_nkw=laptop lleva a una página de error de eBay en lugar de resultados. Esto sucede incluso desde una IP residencial limpia de EE. UU.: eBay evalúa la reputación de la IP, la huella digital del dispositivo, la tasa de solicitudes y señales de comportamiento, y restringe el camino de búsqueda más agresivamente que sus páginas de artículos y navegación. La página se renderiza para un humano y se bloquea para un script.
Este tutorial construye un pipeline de Python sobre el Scrapeless Scraping Browser que supera esa restricción de la manera en que lo hace un visitante real — llegando primero a la página de inicio, dejando que la sesión se caliente, y luego moviéndose a la búsqueda dentro de la misma sesión. Te conectas al navegador en la nube a través de CDP con Playwright, el cliente oficialmente soportado, de modo que el renderizado, la salida residencial y el anti-detección se llevan a cabo del lado de la nube. Para una construcción diferente de un gran marketplace utilizando el mismo primitivo, consulta el resumen de los mejores scrapers de Amazon; para una comparación de precios localizados entre herramientas, consulta Los mejores scrapers de Zillow en 2026.
Lo Que Puedes Hacer Con Esto
El patrón de sesión caliente — página de inicio primero, luego búsqueda y páginas de detalles en una sesión mantenida de navegador en la nube — cubre la mayoría de los trabajos que necesita un pipeline de datos de eBay:
- Rastrear precios de competidores. Extrae el precio y el título del listado de cada tarjeta de resultado en una consulta de búsqueda, luego compáralos con tu propio catálogo de acuerdo a un horario.
- Monitorear una categoría de producto. Explora una categoría o consulta de palabra clave a través de páginas y recopila listados en registros tipados para análisis de tendencias.
- Vigilar listados no autorizados. Busca tu marca o SKU y marca a los vendedores que no deberían listarlo.
- Capturar resultados geo-específicos. Fija la salida residencial de EE. UU. para ver los listados, la moneda y la disponibilidad que un comprador de EE. UU. vería, en lugar de lo que sea que resuelva una IP de oficina.
- Alimentar contexto de listados a un agente de IA. Renderiza páginas de búsqueda y de artículos para limpiar campos estructurados de modo que una capa de recuperación o agente pueda responder preguntas sobre productos con datos actualizados.
- Construir un conjunto de datos de historial de precios. Captura las mismas consultas a lo largo del tiempo y almacena los resultados renderizados para estudiar cómo se mueven los precios.
Por Qué Scrapeless Scraping Browser
El Scrapeless Scraping Browser es un navegador en la nube personalizable y anti-detección diseñado para arañas web y agentes de IA. Para eBay específicamente, ofrece:
- Navegador en la nube anti-detección. Ejecuta una Chromium autodesarrollada con renderizado de JavaScript completo del lado de la nube, por lo que la cuadrícula de búsqueda, las imágenes cargadas de forma diferida y los detalles de los artículos se hidratan antes de que el analizador los lea.
- Proxies residenciales en más de 195 países. Establece
proxyCountryen la URL de conexión y el navegador en la nube utiliza IPs residenciales reales de la región que apuntas, de modo que eBay devuelve lo que ve un comprador local. - Aleatorización de huellas digitales por sesión. Cada sesión obtiene una huella digital aleatorizada — agente de usuario, zona horaria, WebGL y canvas — para que el navegador automatizado no se convierta en una única identidad detectable.
- Persistencia de sesión a través de
sessionTTL. Mantén una sesión abierta durante el calentamiento de la página de inicio y la navegación de búsqueda estableciendosessionTTLen la URL de conexión, para que las cookies y el estado de navegación se mantengan entre solicitudes en una misma ejecución. - Un único punto final de CDP. Crea una URL de WebSocket con tu clave de API;
connect_over_cdpde Playwright lo controla como si fuera un navegador local, por lo que tu código de análisis no cambia.
El tiempo de ejecución es gratuito para comenzar y se escala según el uso — consulta precios de Scrapeless para los niveles y obtén tu clave de API en el plan gratuito en app.scrapeless.com.
Requisitos previos
Antes de comenzar, asegúrate de tener:
- Python 3.10+ — requerido por la biblioteca fetcher a continuación.
- pip — para instalar los paquetes.
- Una cuenta y clave de API de Scrapeless — regístrate para el plan gratuito en app.scrapeless.com, luego obtén tu clave en Configuración → Gestión de Claves de API.
- Conocimientos básicos de selectores CSS y de la terminal — utilizarás ambos para recuperar páginas y extraer valores de ellas.
Instalación
Necesitas un paquete: Playwright para Python, el cliente oficialmente soportado para el Navegador de Scraping de Scrapeless.
1. Instalar Playwright
bash
pip install playwright
connect_over_cdp de Playwright se conecta al navegador en la nube de Scrapeless, por lo que no necesitas ejecutar playwright install ni descargar ningún binario de navegador local — el renderizado ocurre en la nube. Playwright mantiene una conexión abierta a través de múltiples cargas de página, lo que permite que el calentamiento de la página de inicio y la búsqueda compartan una única identidad de sesión.
2. Establecer tu clave de API de Scrapeless
Exporta tu clave para que pueda transportarse en la URL de conexión:
bash
export SCRAPELESS_API_KEY=tu_token_api_aqui
En Windows, utiliza setx SCRAPELESS_API_KEY "tu_token_api_aqui" (persistente, nueva terminal) o $env:SCRAPELESS_API_KEY="tu_token_api_aqui" (sesión actual de PowerShell). La ayuda de conexión a continuación lee esta variable y la incrusta en la URL como token.
Paso 1 — Construir la conexión y confirmar que la solicitud en frío está bloqueada
Comienza reproduciendo el bloqueo, para que el resto del pipeline tenga una línea base clara. Construye la URL del Navegador de Scraping de Scrapeless, conéctate con Playwright y navega directamente al punto final de búsqueda sin visitar primero la página de inicio.
python
import os
from urllib.parse import urlencode
from playwright.sync_api import sync_playwright
def scraping_browser_url(proxy_country="US", session_ttl=240):
# La clave de API viaja en la URL como `token`; el egreso y el tiempo de vida son parámetros de consulta.
params = urlencode({
"token": os.environ["SCRAPELESS_API_KEY"],
"sessionTTL": session_ttl,
"proxyCountry": proxy_country,
})
return f"wss://browser.scrapeless.com/api/v2/browser?{params}"
with sync_playwright() as p:
browser = p.chromium.connect_over_cdp(scraping_browser_url("US"))
page = browser.new_page()
# Navegación en frío directamente al punto final de búsqueda, sin calentamiento de la página de inicio.
page.goto("https://www.ebay.com/sch/i.html?_nkw=laptop",
wait_until="domcontentloaded")
print(page.title()) # -> "Página de error | eBay" / "Acceso denegado"
browser.close()
Una navegación automatizada en frío a /sch/i.html desemboca en una página de error de eBay, a pesar de que la sesión salga de una IP residencial limpia de EE.UU. eBay trata el punto final de búsqueda como una ruta sensible y desafía las solicitudes que llegan sin un contexto de navegación establecido. La solución no es un encabezado diferente o una IP diferente — es llegar de la manera en que lo haría una persona, que es el siguiente paso.
Paso 2 — Calentar la sesión en la página de inicio, luego buscar
El desbloqueo es una sesión mantenida. Abre una conexión de navegador en la nube, carga primero la página de inicio de eBay para que las cookies y el estado de navegación se establezcan, luego navega a la URL de búsqueda dentro de esa misma sesión. Playwright mantiene la conexión CDP única al navegador en la nube de Scrapeless abierta y conduce cada página a través de ella, por lo que el calentamiento y la búsqueda comparten una identidad.
python
with sync_playwright() as p:
browser = p.chromium.connect_over_cdp(scraping_browser_url("US"))
page = browser.new_page()
# 1. Calentar la sesión: aterriza en la página de inicio para que las cookies / estado de navegación se asienten.
page.goto("https://www.ebay.com/", wait_until="domcontentloaded")
page.wait_for_timeout(2500)
# 2. Ahora navegar a la búsqueda en la MISMA sesión.
page.goto("https://www.ebay.com/sch/i.html?_nkw=laptop",
esperar_hasta="domcontentloaded")
página.esperar_por_timeout(3000) # dejar que la cuadrícula se hidrate
print(página.título()) # -> "Portátil en venta | eBay"
tarjetas = página.seleccionar_todos(".su-card-container") # las tarjetas de resultados renderizadas
print(len(tarjetas), "tarjetas") # la cuadrícula ahora está poblada
Con la página de inicio visitada primero, la misma URL de búsqueda que fue bloqueada en el Paso 1 ahora devuelve el título Portátil en venta | eBay y una cuadrícula de resultados poblada. El breve esperar_por_timeout después de la navegación permite que las tarjetas se hidraten antes de la extracción. La única diferencia es el orden de llegada dentro de una sesión mantenida: la página de inicio establece el contexto de navegación, y la solicitud de búsqueda lo hereda.
Paso 3 — Extraer las tarjetas de resultados
eBay rotó su marca de tarjetas de resultados, así que ancla en la clase actual. Las tarjetas de resultados orgánicos llevan .su-card-container; el selector antiguo li.s-item ahora no coincide con nada. Selecciona las tarjetas y luego lee los campos secundarios de cada una.
python
def texto_de(el, selector):
nodo = el.seleccionar(selector)
return nodo.texto_interior().strip() if nodo else None
registros = []
for tarjeta in página.seleccionar_todos(".su-card-container"):
# Los selectores secundarios son ilustrativos; confirma los nodos de título/precio/enlace
# contra el DOM actual de eBay, ya que la marca rota.
título = texto_de(tarjeta, ".su-styled-text") # título del listado (ruta ilustrativa)
precio = texto_de(tarjeta, ".su-styled-text.s-price") # texto del precio (ruta ilustrativa)
el_enlace = tarjeta.seleccionar("a") # URL del listado
enlace = el_enlace.obtener_atributo("href") if el_enlace else None
registros.append({
"título": título,
"precio": precio,
"enlace": enlace,
})
print(len(registros), "listados")
Ancla cada extracción en .su-card-container; trata los selectores secundarios (título, precio, enlace) como puntos de partida para confirmar contra el DOM en vivo, porque eBay reorganiza la marca interna independientemente de la envoltura de la tarjeta. Por defecto, cada campo que falta se establece en None para que una tarjeta escasa no falle la ejecución: eBay omite un precio en algunos formatos de listado (subastas a medio plazo, colocaciones "ver detalles"), y algunas tarjetas son espacios patrocinados con una forma diferente.
Obtén tu clave API en el plan gratuito: app.scrapeless.com
Paso 4 — Pasar por resultados y seguir listados a páginas de detalles
La mayoría de los trabajos reales abarcan más de una URL. Dado que la sesión ya está cálida y mantenida abierta, navegar a través de resultados y seguir cada listado a sus páginas de artículos no cuesta nada extra: las mismas cookies, identidad residencial y huella digital se mantienen a lo largo de toda la sesión. eBay pagina el punto final de búsqueda con el parámetro de consulta _pgn.
python
filas = []
con sync_playwright() como p:
navegador = p.chromium.conectar_a_traves_de_cdp(url_del_navegador_de_raspado("EE. UU.", ttl_de_sesión=300))
página = navegador.nueva_página()
página.ir_a("https://www.ebay.com/", esperar_hasta="domcontentloaded") # calentar una vez
página.esperar_por_timeout(2500)
para n en rango(1, 4): # páginas 1..3
url = f"https://www.ebay.com/sch/i.html?_nkw=laptop&_pgn={n}"
página.ir_a(url, esperar_hasta="domcontentloaded")
página.esperar_por_timeout(3000)
para tarjeta en página.seleccionar_todos(".su-card-container"):
el_enlace = tarjeta.seleccionar("a")
si el_enlace y el_enlace.obtener_atributo("href"):
filas.append({"enlace": el_enlace.obtener_atributo("href")})
# Seguimos un listado a su página de artículo en la misma sesión cálida.
si filas:
página.ir_a(filas[0]["enlace"], esperar_hasta="domcontentloaded")
h1 = página.seleccionar("h1") # encabezado de la página del artículo (confirmar contra el DOM)
título_del_artículo = h1.texto_interior() if h1 else None
navegador.cerrar()
print(len(filas), "listados recopilados")
La calentamiento de la página de inicio ocurre una vez, al principio de la sesión; cada página de búsqueda y página de artículo después reutiliza el contexto establecido. Las páginas de artículos y navegar o páginas de ofertas se renderizan directamente una vez que la sesión está cálida: la mayor parte del control se encuentra en el punto final de búsqueda específicamente. Para un rastreo de lista a detalle, recolecta las URL de listados de la cuadrícula de búsqueda primero, luego recoge cada uno a través del mismo navegador para que la sesión residencial y la huella digital se mantengan constantes a lo largo de toda la sesión.
Paso 5 — Endurecimiento en producción
Moverse de un script en funcionamiento a un trabajo confiable se trata principalmente de mantenerse dentro de las tolerancias de la plataforma. Algunas reglas son las más relevantes:
- Límite de concurrencia. Mantente en ≤3 sesiones de navegador en la nube por host. Superar eso invita a límites de velocidad y restablecimientos de conexión, y el rendimiento marginal rara vez justifica la fricción extra.
- Caliente una vez y reutilice la sesión. Establezca
sessionTTL(por ejemplo, 240 segundos) en la URL de conexión, visite la página de inicio una vez al inicio de la sesión, luego realice cada búsqueda y navegación de elementos a través de la misma conexión de Playwright. Volver a calentar por página desperdicia el contexto mantenido y el apretón de manos de conexión. - Fije
proxyCountry=US. Las listas, la moneda y la disponibilidad de eBay varían según la región; fijar la salida residencial en EE. UU. mantiene los resultados coherentes con la localidad que tiene como objetivo. - Trate los campos ausentes como nulos. Las tarjetas reales omiten precios, calificaciones o líneas de envío en algunos formatos de listado. Configure los selectores que faltan por defecto a
Noneen lugar de afirmar que existen, para que un registro escaso no rompa el lote.
Lo que obtienes de vuelta
json
[
{
"title": "Dell Latitude 7420 14\" Laptop i7 16GB 512GB SSD Windows 11 Pro",
"price": "$329.99",
"link": "https://www.ebay.com/itm/1234567890"
},
{
"title": "Apple MacBook Air 13.3\" M1 8GB 256GB - Space Gray",
"price": "$489.00",
"link": "https://www.ebay.com/itm/9876543210"
},
{
"title": "Lenovo ThinkPad X1 Carbon Gen 9 i5 16GB 256GB",
"price": "$415.50",
"link": "https://www.ebay.com/itm/5556667778"
}
]
// La forma refleja la extracción del Paso 3; los valores del campo son muestras ilustrativas.
Algunas observaciones honestas de la ejecución de esta tubería:
- La búsqueda fría es denegada; la cálida no lo es. Una navegación directa a
/sch/i.htmltermina en una página de error de eBay; visitar primero la página de inicio dentro de la misma sesión mantenida la limpia y la búsqueda devuelve el títuloLaptop for sale | eBaycon una cuadrícula poblada. - Una corta espera post-navegación cubre la hidratación. Las tarjetas de resultado se cargan después de la primera pintura, por lo que una breve
wait_for_timeoutdespués degotoes lo que las hace disponibles para el selector. .su-card-containeres el ancla estable. eBay rotó su marcado de tarjeta: el antiguoli.s-itemno devuelve nada. Ancle en.su-card-containery confirme nuevamente los selectores de campo hijos después de cualquier rediseño.- Fije
proxyCountrypara resultados consistentes. Las listas, la moneda y la disponibilidad varían según la región; fijar la salida residencial en EE. UU. mantiene la salida consistente con la localidad que tiene como objetivo. - Las páginas de elementos y navegación se renderizan directamente. La mayor parte de la restricción se encuentra en el punto final de búsqueda; una vez que la sesión está caliente, las páginas de elementos, búsqueda y ofertas se cargan sin desviarse a la página de inicio.
Conclusión: Escale su tubería de listados de eBay
La tubería se reduce a cuatro movimientos. Conéctese a una sesión de Scrapeless Scraping Browser y caliéntela en la página de inicio. Navegue al punto final de búsqueda dentro de esa misma sesión mantenida para que la solicitud herede un contexto de navegación establecido. Extraiga la cuadrícula de resultados anclándose en .su-card-container. Luego navegue a través de los resultados y siga las listas a las páginas de detalles durante la única sesión caliente. Solo paga por el navegador en la nube cuando realmente lo necesita; consulte precios de Scrapeless para saber qué cubre el nivel gratuito, y el resto se mantiene en Python puro.
Desde aquí, el mismo patrón de sesión caliente se conecta a construcciones de mercado más grandes. Consulte el resumen de los mejores raspadores de Amazon para una comparación de grandes mercados, y Mejores raspadores de Zillow en 2026 para una comparación de herramientas de precios localizados. Antes de enviar: exporte SCRAPELESS_API_KEY, fije proxyCountry=US, caliente la sesión en la página de inicio antes de tocar /sch/, mantenga la concurrencia en ≤3 sesiones por host, ancle en .su-card-container y trate los campos ausentes como nulos. Guías de conexión y bibliotecas en docs.scrapeless.com.
¿Listo para construir su pipeline de datos impulsado por IA?
Únase a nuestra comunidad para reclamar un plan gratuito y conectarse con desarrolladores que están construyendo tuberías de datos de eBay y mercados: Discord · Telegram.
Regístrese en app.scrapeless.com para un tiempo de ejecución gratuito de Scraping Browser y adapte los patrones anteriores a las consultas y regiones de eBay que necesita la tubería.
FAQ
¿Necesita un proxy?
Sí, la salida residencial lleva el funcionamiento de eBay. Fije proxies residenciales de EE. UU. con proxyCountry=US en la URL de conexión. El Scrapeless Scraping Browser suministra proxies residenciales en más de 195 países, por lo que no tiene que obtener y rotar IPs usted mismo, y la dirección de salida parece una conexión hogareña ordinaria en lugar de una IP de centro de datos marcada.
¿Por qué el punto final de búsqueda retorna "Acceso Denegado"?
Una navegación automatizada fría a https://www.ebay.com/sch/i.html aterriza en una página de error de eBay porque la solicitud llega sin un contexto de navegación establecido; eBay restringe más estrictamente la ruta de búsqueda que sus páginas de elementos y navegación. La solución es calentar primero la sesión: abre una sesión de navegador en la nube, carga la página principal de eBay para que se establezcan las cookies y el estado de navegación, y luego navega a la URL de búsqueda en esa misma sesión. La búsqueda se carga luego con el título Laptop for sale | eBay y una cuadrícula poblada.
Mis selectores dejaron de coincidir después de un rediseño en eBay. ¿Cómo lo soluciono?
eBay rota su DOM. Ancla tu extracción en el contenedor de tarjetas de resultado .su-card-container en lugar de en una ruta profunda de hijos, y vuelve a confirmar los selectores de título, precio y enlace contra el marcado actual después de un rediseño. El antiguo selector li.s-item no coincide con nada en el diseño actual, por lo que el contenedor de tarjetas es el ancla estable.
¿Existen límites de concurrencia que debas respetar?
Mantén el número en ≤3 sesiones de navegador en la nube por host. Más allá de eso, intercambias un poco de rendimiento por mucho limitación de tasa y reinicios de conexión. Usa concurrencia limitada y una cola en lugar de disparar cada solicitud a la vez.
¿Puede esto ejecutarse sin un agente de IA?
Sí. El patrón de Python anterior es de extremo a extremo por sí solo: Playwright se conecta al Scrapeless Scraping Browser a través de CDP, y tu código calienta la sesión, navega y extrae. Un agente de IA es una capa opcional encima, no un requisito.
En Scrapeless, solo accedemos a datos disponibles públicamente y cumplimos estrictamente con las leyes, regulaciones y políticas de privacidad del sitio web aplicables. El contenido de este blog es sólo para fines de demostración y no implica ninguna actividad ilegal o infractora. No ofrecemos garantías y renunciamos a toda responsabilidad por el uso de la información de este blog o enlaces de terceros. Antes de realizar cualquier actividad de scraping, consulte a su asesor legal y revise los términos de servicio del sitio web de destino u obtenga los permisos necesarios.



