Back to Blog

¿Listo para una prueba gratuita de 2 GB?

Reserva una llamada con uno de nuestros Expertos en Datos para desbloquear una prueba gratuita de gran tamaño.

INICIAR PRUEBA
Cómo extraer datos de eBay a gran escala

Cómo extraer datos de eBay a gran escala: solución de proxy completa de Massive

Jason Grad
Cofundador
February 18, 2025

eBay es uno de los más grandes Comercio electrónico mercados de todo el mundo, con miles de millones de anuncios de ebay y atrae a millones de visitantes diarios. Para empresas, datos de productos de eBay ofrece una gran cantidad de datos valiosos que pueden ser invaluables para la inteligencia empresarial, la investigación de mercado y el análisis competitivo. Sin embargo, el raspado web El proceso de extracción de datos de eBay a gran escala plantea importantes desafíos técnicos debido a los avanzados mecanismos antiraspado de la plataforma.

Esto guía paso a paso explica cómo construir un raspador web de eBay uso de la red proxy de Massive para extraer de manera eficiente datos de anuncios de eBay minimizando al mismo tiempo el riesgo de bloqueo.

Sin más preámbulos, ¡comencemos!

¿Por qué eliminar los datos de eBay?

El datos sin procesar de la sitio web de ebay brinda a las empresas información invaluable que impulsa la toma de decisiones informadas y una ventaja competitiva. He aquí cómo datos disponibles públicamente de eBay está transformando las estrategias empresariales:

  1. Investigación de mercado: Al realizar un seguimiento de los precios, las promociones y las preferencias de los clientes de la competencia en tiempo real, puede identificar las brechas en el mercado y ajustar su estrategia para superar a la competencia.
  2. Precios inteligentes: El seguimiento de las fluctuaciones de precios en eBay te permite ajustar tus precios para seguir siendo competitivo y, al mismo tiempo, mantener unos márgenes saludables. Esto es especialmente útil en los mercados que cambian rápidamente, donde los precios cambian con frecuencia o durante los picos estacionales.
  3. Decisiones de producto: Aprovecha los datos de ventas y comentarios de eBay para validar tus opciones de productos antes de invertir en nuevo inventario. Si analizas los productos que se venden bien y entiendes los comentarios de los clientes, puedes refinar tu oferta de productos y programar los lanzamientos para que tengan el máximo impacto.
  4. Administración de inventario: Los datos de eBay muestran patrones de demanda claros, lo que te permite mantener niveles de inventario óptimos. Esto te ayuda a optimizar los niveles de existencias, evitar el exceso de existencias y evitar que se agoten.

Evite que lo bloqueen mientras busca en eBay

Construir un raspador de eBay no es tan fácil como parece. Diseñar eBay a gran escala presenta importantes desafíos debido a la limitación de tarifas basada en la propiedad intelectual, CAPTCHA, y medidas estrictas contra el raspado. Cuando superas los límites de solicitudes de eBay, tu IP se bloquea o se enfrenta a los CAPTCHA.

¿Por qué necesitas proxies para el scraping de eBay?

Al crear un raspador de eBay para extraer datos de eBay a gran escala, los proxies no solo son útiles, sino que son esenciales. El uso de proxies te permite distribuir tus solicitudes en varias direcciones IP, lo que te ayuda a:

  • Evite que se bloquee o estrangule
  • Mantenga velocidades de raspado constantes
  • Evite las listas negras de IP (lo que puede ser un gran dolor de cabeza solucionarlo)
  • Amplíe su recopilación de datos de manera confiable

¿Por qué elegir proxies masivos para eliminar eBay?

Como ya hemos comentado anteriormente, extraer datos de eBay no es sencillo. Debe considerar el uso de algún tipo de proxies, y proxies residenciales son los más preferidos. Nuestro uso de proxies residenciales Las IP provienen de dispositivos móviles y de escritorio reales, lo que las hace muy eficaces para eludir las medidas antiscraping de eBay. Esto es lo que ofrecemos:

  1. Alta tasa de éxito: Nuestras IP residenciales reducen significativamente los riesgos de bloqueo, lo que permite una recopilación confiable de datos a gran escala.
  2. Acceso global: Recopila datos sin problemas de cualquier mercado de eBay del mundo mediante proxies específicos de cada región.
  3. Datos locales precisos: Diríjase a ciudades o países específicos para obtener información precisa sobre el mercado y precios.
  4. Rendimiento garantizado: Disfrute de tasas de éxito del 99% con tiempos de respuesta rápidos y monitoreo del tiempo de actividad las 24 horas, los 7 días de la semana.
  5. Uso flexible: Elija entre varias opciones de ancho de banda para satisfacer sus necesidades de extracción, ya sea a pequeña escala o a nivel empresarial.

💡 Consejo profesional: Usa siempre proxies de tu país de destino cuando busques en diferentes sitios web de eBay, ya que así obtendrás datos reales de precios y disponibilidad locales. Massive Proxies proporciona direcciones IP específicas para cada ubicación en los principales mercados de eBay para obtener resultados consistentes.

Cómo empezar con los proxies masivos

Para empezar a eliminar eBay con Massive Proxies, primero regístrate para crear una cuenta y seleccionar uno de nuestros planes de precios flexibles. Puedes empezar con nuestra prueba gratuita de 3 días, que incluye 100 MB de ancho de banda para probar nuestro servicio.

Si necesitas ancho de banda adicional para la versión de prueba, contacta con nuestro equipo, y trabajaremos para cumplir con sus requisitos.

Tras la activación de la cuenta, acceda a su Perfil sección para encontrar tu clave de API y nombre de usuario de proxy.

Pasos de configuración:

Visite el Inicio rápido sección para personalizar la configuración de su proxy:

  • Elige tu protocolo preferido (HTTP, HTTPS o SOCKS5)
  • Selecciona entre proxies giratorios o fijos
  • Defina las preferencias de segmentación geográfica (país, estado, ciudad o código postal)

Una vez configurado, obtendrá un comando cURL listo para usar para su caso de uso específico.

Para ver funciones avanzadas, como la segmentación basada en la ubicación y las sesiones fijas, consulta la Documentación masiva. Los documentos proporcionan instrucciones paso a paso para aprovechar al máximo los proxies residenciales masivos.

Con esta configuración, puedes usar Massive Proxies para extraer datos de eBay de los principales mercados, incluidos EE. UU., Reino Unido, Alemania y Australia.

¿Qué datos de productos puedes extraer de eBay?

Scraping eBay puede proporcionarte una gran cantidad de información sobre los productos. Este es un desglose completo de los datos disponibles:

  • URL del producto: El enlace a la página del producto de eBay
  • Título: El nombre del artículo
  • Subtítulo: Texto descriptivo adicional
  • Precio actual: El precio de venta actual
  • Era Price: El precio anterior (si está disponible)
  • Descuento: El porcentaje o importe descontado
  • Disponibilidad: Cantidad disponible y estado de existencias
  • Recuento de unidades vendidas: Número de artículos vendidos
  • Detalles de envío: Costo y tiempo estimado de entrega
  • Ubicación: El origen del envío
  • Devoluciones: Detalles de la política de devoluciones
  • Condición: Si el artículo es nuevo, usado o restaurado
  • Marca: Nombre del fabricante o de la marca
  • Tipo: La categoría o el tipo de producto
  • Información del vendedor:
    • Nombre del vendedor/tienda
    • Porcentaje de comentarios de clientes
    • Ventas totales del vendedor

Entradas de usuario requeridas

Para empezar a buscar en eBay, tendrás que especificar dos parámetros clave:

  1. País objetivo: Puedes extraer datos de 10 dominios regionales de eBay:
"US": "https://www.ebay.com",
"GB": "https://www.ebay.co.uk",
"DE": "https://www.ebay.de",
"ES": "https://www.ebay.es",
"FR": "https://www.ebay.fr",
"IT": "https://www.ebay.it",
"CA": "https://www.ebay.ca",
"MX": "https://www.mx.ebay.com",
"NL": "https://www.ebay.nl",
"AU": "https://www.ebay.com.au"
  1. Términos de búsqueda: Ingresa lo que quieres raspar (por ejemplo, «silla reclinable», «cámara de dron»). Puedes introducir varios términos con comas.
  2. Límite de artículos: (Opcional) Especifique cuántos artículos desea raspar. Omita esta opción para recopilar todos los datos disponibles en todas las páginas.

Los datos extraídos se guardarán en un archivo JSON estructurado.

Construyendo un raspador de datos de eBay con proxies masivos

Esta guía explica paso a paso cómo crear eBay a gran escala. Mientras nos centramos en raspar eBay.com (sitio de EE. UU.), los mismos principios se aplican a los sitios de eBay de otros países, con pequeños ajustes en los selectores.

Paso 1: Configuración del proyecto

En primer lugar, asegúrese de tener Python 3 instalado en su sistema. Si no es así, descargarlo e instalarlo.

Ahora, crea un directorio para tu proyecto:

mkdir ebay_scraper

Abre la carpeta del proyecto en tu IDE preferido (como VS Code) y crea un archivo llamado usa_ebay.py. Este archivo contendrá nuestra lógica de raspado para extraer datos de eBay.

También tendrás que crear un archivo.env para almacenar tus credenciales de Massive Proxy:

PROXY_USERNAME=your_username
PROXY_API_KEY=your_api_key

Ahora, la estructura de tu proyecto debería tener este aspecto:

ebay_scraper/
├── .env
└── usa_ebay.py

Paso 2: Instalación de dependencias

Para extraer los datos de eBay de manera eficiente, necesitarás usar varias bibliotecas de claves:

  • curl_cffi: un cliente HTTP de alto rendimiento que admite la toma de huellas digitales JA3/TLS y HTTP/2
  • hermosa sopa 4: Para analizar HTML
  • python-dotenv: Para la administración de variables de entorno
  • archivos aio: Para operaciones de archivos asincrónicas

Ahora, puedes instalar estas dependencias usando pip como se muestra a continuación:

pip install curl-cffi beautifulsoup4 python-dotenv aiofiles

Paso 3: Configurar proxies masivos

En este paso, se configura un proxy para habilitar la segmentación geográfica y garantizar que las solicitudes se dirijan a países específicos para extraer los datos de eBay con precisión:

def setup_proxy(self):
    """Configure proxy settings for geotargeted requests"""
    self.proxy_host = "network.joinmassive.com:65534"
    self.username = os.getenv("PROXY_USERNAME")
    self.api_key = os.getenv("PROXY_API_KEY")
    self.proxy_auth = f"{self.username}-country-{self.domain}:{self.api_key}"

Paso 4: Solicitar configuración

Configure las solicitudes HTTP mediante la biblioteca curl_cffi. La configuración implica dos métodos:

  1. conseguirproxy_config (): formatea las credenciales de autenticación del proxy y los detalles del host
  2. hacerrequest (): gestiona la ejecución de solicitudes HTTP con funciones como la limitación de velocidad y la emulación del navegador

def _get_proxy_config(self) -> Dict[str, str]:
    """Generate proxy configuration dictionary"""
    return {"https": f"http://{self.proxy_auth}@{self.proxy_host}"}


async def _make_request(self, session: AsyncSession, url: str, page_type: str):
    """Make HTTP request with proxy and browser emulation"""
    async with self.semaphore:
        response = await session.get(
            url,
            proxies=self._get_proxy_config(),
            impersonate="chrome124",
            timeout=self.page_timeout,
        )

Paso 5: Procesar páginas de búsqueda

Este método procesosearch_page gestiona el procesamiento de las páginas de resultados de búsqueda individuales. Toma como entradas una sesión asíncrona, un número de página y un término de búsqueda. Así es como funciona:

La función construye la URL de búsqueda mediante la creación de parámetros de consulta que incluyen:

  • La palabra clave de búsqueda (_nkw)
  • Número de página (_pgn)
  • Configuración de elementos por página (_ipg) optimizada para 240 elementos

A continuación, realiza una solicitud asíncrona utilizando el método de solicitud previamente configurado. Si el contenido se recupera correctamente, lo analiza con BeautifulSoup con el analizador lxml. A continuación, extrae las URL de los productos del HTML analizado y procesa las URL de los productos extraídos en lotes.

async def _process_search_page(
    self, session: AsyncSession, page_num: int, search_term: str
):
    """Process a single search results page"""
    try:
        params = {
            "_nkw": search_term,
            "_pgn": page_num,
            "_ipg": 240,  # Maximum items per page
        }
        url = self.base_url + urlencode(params)

        status_code, html_content = await self._make_request(session, url, "search")
        if html_content:
            soup = BeautifulSoup(html_content, "lxml")
            urls = self._extract_product_urls(soup)

            logger.info(f"Found {len(urls)} products on page {page_num}")
            return await self._process_product_batch(session, urls)
    except Exception as e:
        logger.error(f"Error processing page {page_num}: {str(e)}")
        return False, False

Paso 6: Extraer las URL de los productos

Este método se encarga de la crucial tarea de extraer las URL de los productos de las páginas de resultados de búsqueda. Así es como funciona la extracción de la URL del producto:

El extractoEl método product_urls acepta un objeto BeautifulSoup que contiene el contenido HTML analizado y devuelve una lista de URL de productos válidas. Implementa un enfoque centrado para la extracción de URL:

  • Utiliza el selector CSS a.s-item__link para buscar todos los elementos del enlace del producto
  • Recorre en iteración cada elemento del enlace para extraer el atributo href
  • Valida las URL comprobando la presencia de «itm/» en la ruta URL
  • Crea una lista filtrada que contiene solo las URL de productos válidas
def _extract_product_urls(self, soup: BeautifulSoup) -> List[str]:
    """Extract product URLs from search results page"""
    urls = []
    for link in soup.select("a.s-item__link"):
        url = link.get("href", "")
        if url and "itm/" in url:
            urls.append(url)
    return urls

Paso 7: raspar los detalles del producto

El extractoEl método product_details extrae sistemáticamente la información del producto de las páginas de productos de eBay. Procesa un objeto BeautifulSoup y devuelve un objeto ProductDetails que contiene datos estructurados.

def _extract_product_details(self, soup: BeautifulSoup, url: str) -> ProductDetails:
    """Extract all product details from page"""
    details = ProductDetails(url=url)

    try:
        details.store_info = DataExtractor.extract_store_info(soup)

        # Title section

        if title_div := soup.select_one("div.x-item-title"):
            if title := title_div.select_one("h1.x-item-title__mainTitle span"):
                details.title = title.text.strip()
            if subtitle := title_div.select_one("div.x-item-title__subTitle span"):
                details.subtitle = subtitle.text.strip()
        # Price section

        if price_section := soup.select_one("div.x-price-section"):
            if current_price := price_section.select_one("div.x-price-primary span"):
                details.current_price = current_price.text.strip()
            if was_price := price_section.select_one(
                "span.ux-textspans--STRIKETHROUGH"
            ):
                details.was_price = was_price.text.strip()
            # Discount calculation

            discount = None
            if emphasis_discount := price_section.select_one(
                "span.ux-textspans--EMPHASIS"
            ):
                discount = emphasis_discount.text.strip()
            elif secondary_discount := price_section.select_one(
                "span.ux-textspans--SECONDARY"
            ):
                discount = secondary_discount.text.strip()
            if discount and (percentage_match := re.search(r"(\d+)%", discount)):
                details.discount = percentage_match.group(1) + "%"
        # Quantity section

        if quantity_div := soup.select_one("div.x-quantity__availability"):
            spans = quantity_div.select("span.ux-textspans")
            if spans:
                details.availability = spans[0].text.strip()
                if len(spans) > 1:
                    details.sold_count = spans[1].text.strip()
        # Shipping section

        if shipping_div := soup.select_one("div.d-shipping-minview"):
            if shipping_section := shipping_div.select_one(
                "div.ux-labels-values__values-content"
            ):
                details.shipping, details.location = (
                    DataExtractor.extract_shipping_info(shipping_section)
                )
        # Returns section

        if returns_div := soup.select_one("div.x-returns-minview"):
            if returns_section := returns_div.select_one(
                "div.ux-labels-values__values-content"
            ):
                details.returns = DataExtractor.extract_returns_info(returns_section)
        # Additional details

        if condition_span := soup.select_one(
            "div.x-item-condition-max-view .ux-section__item > span.ux-textspans"
        ):
            details.condition = condition_span.text.strip().split(".")[0] + "."
        if (brand_dl := soup.select_one("dl.ux-labels-values--brand")) and (
            brand_value := brand_dl.select_one("dd .ux-textspans")
        ):
            details.brand = brand_value.text.strip()
        if (type_dl := soup.select_one("dl.ux-labels-values--type")) and (
            type_value := type_dl.select_one("dd .ux-textspans")
        ):
            details.type = type_value.text.strip()
    except Exception as e:
        logger.error(f"Error extracting details from {url}: {str(e)}")
    return details

Paso 8: Manejo de la paginación

El haEl método next_page utiliza dos enfoques diferentes para comprobar la paginación:

  • En primer lugar, busca el enlace de la página siguiente buscando una etiqueta de anclaje con el atributo type="next». Si este enlace existe y tiene un atributo href válido, confirma la presencia de una página siguiente.
  • Como mecanismo alternativo, también comprueba si hay un elemento de botón siguiente. Busca un botón con type="next» y comprueba si no está desactivado marcando el atributo aria-disabled. Si el botón existe pero no está desactivado, indica que hay más páginas disponibles.
def _has_next_page(self, soup: BeautifulSoup) -> bool:
    """Determine if there is a next page of results"""
    next_link = soup.select_one('a[type="next"]')
    if next_link and next_link.get("href"):
        return True
    next_button = soup.select_one('button[type="next"]')
    return not (next_button and next_button.get("aria-disabled") == "true")

Paso 9: Almacenamiento de datos

Por último, guarda los datos extraídos en un archivo JSON:

class FileHandler:
    """Handle file operations with error handling and backups"""

    @staticmethod
    async def save_to_file(filename: str, data: Dict):
        """Save data with automatic backup creation"""
        temp_file = f"{filename}.temp"
        backup_file = f"{filename}.backup"

        try:
            # Create directory structure

            os.makedirs(os.path.dirname(filename), exist_ok=True)

            # Save to temporary file

            async with aiofiles.open(temp_file, "w", encoding="utf-8") as f:
                await f.write(json.dumps(data, indent=2, ensure_ascii=False))
            # Create backup of existing file

            if os.path.exists(filename):
                os.replace(filename, backup_file)
            # Replace with new file

            os.replace(temp_file, filename)

            logger.info(f"Data successfully saved to {filename}")
        except Exception as e:
            logger.error(f"Error saving data: {str(e)}")
            raise

Paso 10: ejecuta el raspador

La implementación completa que separa eBay de 10 dominios de mercado está disponible en nuestro Cuaderno Google Colab. El raspador genera un archivo JSON estructurado que contiene los datos extraídos de los productos. Cada entrada de producto incluye:

{
    "url": "https://www.ebay.com/itm/294701001393",
    "title": "Manual Recliner Armchair PU Sofa Chair w/ Adjustable Leg Rest & 135° Reclining",
    "subtitle": "Comfortable & Easy to Clean & 360° Swivel & Steel Frame",
    "current_price": "US $228.99",
    "was_price": "US $651.99",
    "discount": "65%",
    "availability": "More than 10 available",
    "sold_count": "93 sold",
    "shipping": "Free shipping - Arrives by Christmas",
    "location": "Wilsonville, Oregon, United States",
    "returns": "30 days returns Buyer pays for return shipping",
    "condition": "A brand-new, unused, unopened, undamaged item in its original packaging (where packaging is applicable).",
    "brand": "Homcom",
    "type": "Recliner Armchair",
    "store_info": {
        "name": "Aosom-Direct",
        "feedback": "97.5% positive feedback",
        "sales": "482K items sold",
    },
}

Conclusión

En esta guía se muestra cómo crear un rascador de eBay que funcione en diferentes mercados de eBay. Al usar proxies residenciales, podemos recopilar datos precisos sobre los productos y, al mismo tiempo, minimizar los riesgos de bloqueo. El enfoque que hemos descrito permite recopilar datos de forma fiable de los distintos sitios regionales de eBay.

Si necesita más información sobre la configuración del proxy o las prácticas recomendadas, encontrará todo en el documentación.

Read More