Cómo extraer datos de eBay con Python

Comentarios: 0

eBay es una conocida plataforma online que ofrece oportunidades de comercio en una amplia gama de productos entre sus usuarios registrados. En esta guía, explicaremos cómo scrapear datos de un listado de eBay utilizando Python. Como tal, nos interesarán los detalles que estén disponibles desde el propio listado, así como yendo a cada uno de los productos a su vez para obtener detalles más finos.

Requisitos

Para empezar, asegúrate de tener instaladas las siguientes librerías de Python:

  • Requests: Para hacer peticiones HTTP.
  • lxml: Para analizar contenido HTML.
  • Pandas: Para guardar datos en un archivo CSV.

Instala estas librerías usando:


pip install requests lxml pandas

Entender la estructura de URL de eBay para la paginación

Al buscar productos en eBay, la URL de cada página se puede modificar para navegar por los resultados paginados. Por ejemplo:

  • Página 1: https://www.ebay.com/sch/i.html?_nkw=laptop
  • Página 2: https://www.ebay.com/sch/i.html?_nkw=laptop&_pgn=2

El parámetro _pgn se utiliza para navegar a través de múltiples páginas de listados, permitiendo la recuperación de datos extensos. Comencemos el proceso de scraping.

Paso 1: Envío de solicitudes a eBay

Para empezar, configuraremos las cabeceras para imitar una petición real del navegador, lo que ayuda a evitar la detección y el posible bloqueo por parte de las medidas anti-bot de eBay. A continuación, enviaremos una petición a la página del anuncio para recopilar los enlaces de cada producto.


import requests
from lxml.html import fromstring

# Definir cabeceras para simular un navegador real
headers = {
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'accept-language': 'en-IN,en;q=0.9',
    'cache-control': 'no-cache',
    'dnt': '1',
    'pragma': 'no-cache',
    'priority': 'u=0, i',
    'sec-ch-ua': '"Google Chrome";v="129", "Not=A?Brand";v="8", "Chromium";v="129"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Linux"',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'none',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
    'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36',
}

# Parámetros de solicitud para la consulta de búsqueda
params = {
    '_nkw': 'laptop',
}

# Enviar una solicitud a la página de anuncios de eBay
listing_page_response = requests.get('https link', params=params, headers=headers)
listing_parser = fromstring(listing_page_response.text)

Paso 2: Análisis de la página del listado

En la página del listado, extraeremos las URL de los productos individuales. Esto nos permite visitar la página de cada producto para recopilar detalles específicos, como el título del producto, el precio y más.


# Analizar la página del listado para extraer los enlaces a los productos
links = listing_parser.xpath('//div[@class="s-item__info clearfix"]/a[@_sp="p2351460.m1686.l7400"]/@href')

# Salida de una muestra de los enlaces encontrados
print("Product Links:", links[:5])  # Display the first five product links

Paso 3: raspado de datos de productos

Con las URLs de los productos en la mano, visitaremos cada página de producto y extraeremos los siguientes detalles:

  • Título del producto;
  • Precio;
  • Gastos de envío;
  • Condición del producto;
  • Cantidad disponible;
  • Cantidad vendida;
  • Opciones de pago;
  • Política de devoluciones.

A continuación, haremos un bucle con cada enlace y utilizaremos expresiones XPath para localizar la información necesaria en la página del producto.


product_data = []

for url in links:
    # Enviar una solicitud a la página del producto
    product_page_response = requests.get(url, headers=headers)
    product_parser = fromstring(product_page_response.text)
    
    # Extraer datos mediante XPath
    try:
        product_title = product_parser.xpath('//h1[@class="x-item-title__mainTitle"]/span/text()')[0]
        price = product_parser.xpath('//div[@data-testid="x-price-primary"]/span/text()')[0]
        shipping_cost = product_parser.xpath('//div[@class="ux-labels-values col-12 ux-labels-values--shipping"]//div[@class="ux-labels-values__values-content"]/div/span/text()')[0]
        product_condition = product_parser.xpath('//div[@class="x-item-condition-text"]/div/span/span[2]/text()')[0]
        available_quantity = product_parser.xpath('//div[@class="x-quantity__availability"]/span/text()')[0]
        sold_quantity = product_parser.xpath('//div[@class="x-quantity__availability"]/span/text()')[1]
        payment_options = ', '.join(product_parser.xpath('//div[@class="ux-labels-values col-12 ux-labels-values__column-last-row ux-labels-values--payments"]/div[2]/div/div//span/@aria-label'))
        return_policy = product_parser.xpath('//div[@class="ux-layout-section ux-layout-section--returns"]//div[@class="ux-labels-values__values-content"]/div/span/text()')[0]
        
        # Almacenar datos en un diccionario
        product_info = {
            'Title': product_title,
            'Price': price,
            'Shipping Cost': shipping_cost,
            'Condition': product_condition,
            'Available Quantity': available_quantity,
            'Sold Quantity': sold_quantity,
            'Payment Options': payment_options,
            'Return Policy': return_policy,
        }
        product_data.append(product_info)
    
    except IndexError as e:
        print(f"An error occurred: {e}")

Paso 4: guardar los datos en un archivo CSV

Después de recopilar los datos, podemos guardarlos en un archivo CSV usando Pandas.


import pandas as pd

# Convertir datos en DataFrame
df = pd.DataFrame(product_data)

# Guardar en CSV
df.to_csv('ebay_product_data.csv', index=False)
print("Data saved to ebay_product_data.csv")

Manejar la limitación de tarifas y eludir la detección en eBay

eBay emplea la limitación de velocidad para evitar solicitudes excesivas. He aquí algunos métodos para evitar la detección:

  • Utilice proxies: Rota entre diferentes direcciones IP.
  • Ajuste los intervalos entre peticiones: Implemente retardos entre peticiones.
  • Agentes de usuario aleatorios: Varíe la cadena de agente de usuario para evitar la detección.

Siguiendo estas mejores prácticas, puedes minimizar el riesgo de ser bloqueado y continuar raspando datos de manera eficiente.

Código completo

Aquí tienes el código completo para scrapear datos de eBay y guardarlos en un archivo CSV:


import requests
import random
from lxml.html import fromstring
import pandas as pd

useragents = ['Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36',
             'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36',
             'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36']

# Definir cabeceras para la solicitud
headers = {
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'accept-language': 'en-IN,en;q=0.9',
    'cache-control': 'no-cache',
    'dnt': '1',
    'pragma': 'no-cache',
    'priority': 'u=0, i',
    'sec-ch-ua': '"Google Chrome";v="129", "Not=A?Brand";v="8", "Chromium";v="129"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Linux"',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'none',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
    'user-agent': random.choice(useragents),
}

# Parámetros de búsqueda
params = {'_nkw': 'laptop'}
proxies = {
    'http': 'IP:PORT',
    'https': 'IP:PORT'
}

# Obtener la página de anuncios
listing_page_response = requests.get('https://www.ebay.com/sch/i.html', params=params, headers=headers, proxies=proxies)
listing_parser = fromstring(listing_page_response.text)
links = listing_parser.xpath('//div[@class="s-item__info clearfix"]/a[@_sp="p2351460.m1686.l7400"]/@href')

# Extraer datos de productos
product_data = []
for url in links:
    product_page_response = requests.get(url, headers=headers, proxies=proxies)
    product_parser = fromstring(product_page_response.text)
    try:
        product_info = {
            'Title': product_parser.xpath('//h1[@class="x-item-title__mainTitle"]/span/text()')[0],
            'Price': product_parser.xpath('//div[@data-testid="x-price-primary"]/span/text()')[0],
            'Shipping Cost': product_parser.xpath('//div[@class="ux-labels-values col-12 ux-labels-values--shipping"]//div[@class="ux-labels-values__values-content"]/div/span/text()')[0],
            'Condition': product_parser.xpath('//div[@class="x-item-condition-text"]/div/span/span[2]/text()')[0],
            'Available Quantity': product_parser.xpath('//div[@class="x-quantity__availability"]/span/text()')[0],
            'Sold Quantity': product_parser.xpath('//div[@class="x-quantity__availability"]/span/text()')[1],
            'Payment Options': ', '.join(product_parser.xpath('//div[@class="ux-labels-values col-12 ux-labels-values__column-last-row ux-labels-values--payments"]/div[2]/div/div//span/@aria-label')),
            'Return Policy': product_parser.xpath('//div[@class="ux-layout-section ux-layout-section--returns"]//div[@class="ux-labels-values__values-content"]/div/span/text()')[0]
        }
        product_data.append(product_info)
    except IndexError:
        continue

# Guardar en CSV
df = pd.DataFrame(product_data)
df.to_csv('ebay_product_data.csv', index=False)
print("Data saved to ebay_product_data.csv")

El scraping de eBay con Python permite recopilar datos eficientes sobre productos, precios y tendencias. En esta guía, cubrimos el raspado de listados, el manejo de la paginación, la configuración de encabezados y el uso de proxies para evitar la detección. Recuerde respetar los términos de servicio de eBay utilizando intervalos de solicitud responsables y rotación de proxy. Con estas herramientas, ahora puede recopilar y analizar fácilmente datos de eBay para obtener información sobre el mercado. ¡Feliz scraping!

Comentarios:

0 Comentarios