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.
Para empezar, asegúrate de tener instaladas las siguientes librerías de Python:
Instala estas librerías usando:
pip install requests lxml pandas
Al buscar productos en eBay, la URL de cada página se puede modificar para navegar por los resultados paginados. Por ejemplo:
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.
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)
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
Con las URLs de los productos en la mano, visitaremos cada página de producto y extraeremos los siguientes detalles:
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}")
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")
eBay emplea la limitación de velocidad para evitar solicitudes excesivas. He aquí algunos métodos para evitar la detección:
Siguiendo estas mejores prácticas, puedes minimizar el riesgo de ser bloqueado y continuar raspando datos de manera eficiente.
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!
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.com!
Comentarios: 0