Cómo extraer datos de AliExpress con Python

Comentarios: 0

Descubrir información de minoristas electrónicos como AliExpress puede ser muy beneficioso para recopilar información sobre productos, controlar las fluctuaciones de precios, recopilar reseñas, etc. En este artículo, exploraremos el proceso de adquisición de información sobre productos (como nombre, precio, valoración, etc.) y también revisaremos el raspado de reseñas de productos. También demostraremos cómo hacer que el scraper sea dinámico pasando la URL del producto, recuperando automáticamente el ID del producto y guardando los datos en un archivo CSV.

Este tutorial utilizará Playwright para generar contenido dinámico y peticiones para obtener datos de reseñas. También nos aseguraremos de que el scraper es ético y cumple con las mejores prácticas.

Requisitos

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

  • Playwright: utilizado para interactuar con el navegador y renderizar contenido dinámico.
  • Requests: utilizado para obtener reseñas a través de la API de AliExpress.
  • lxml: para analizar el contenido HTML.
  • Pandas: sirve para guardar los datos en un archivo CSV.

Puede instalar estos paquetes ejecutando los siguientes comandos:


# Instalar dramaturgo
pip install playwright


# Solicitudes de instalación
pip install requests


# Instalar lxml para analizar HTML
pip install lxml


# Instalar Pandas para manipular y guardar datos
pip install pandas

Después de instalar Playwright, también tendrá que instalar los binarios necesarios del navegador:


playwright install

Esto descargará y configurará el navegador necesario para que Playwright funcione correctamente.

Paso 1. Envío de solicitudes con Playwright

Las páginas de productos de AliExpress son dinámicas, es decir, cargan contenido a través de JavaScript. Para manejar esto, usaremos Playwright, una librería de Python que permite controlar un navegador headless e interactuar con contenido dinámico.

Así es como puedes enviar una petición y navegar a la página del producto:


from playwright.async_api import async_playwright

async def get_page_content(url):
    async with async_playwright() as p:
        # Iniciar el navegador con un proxy si es necesario (puede eliminarse si no se utiliza proxy)
        browser = await p.firefox.launch(
            headless=False,
            proxy={"server": '', 'username': '', 'password': ''}
        )
        page = await browser.new_page()
        await page.goto(url, timeout=60000)

        # Extraer el contenido de la página
        content = await page.content()
        await browser.close()
        
        return content

# Ejemplo de URL
url = 'https://www.aliexpress.com/item/3256805354456256.html'

Paso 2. Extraer los datos del producto

Una vez que tenemos el contenido de la página, podemos extraer los datos del producto usando lxml y consultas XPath. Recopilaremos detalles como el título del producto, el precio, la valoración, el número de reseñas y el número de artículos vendidos.


from lxml.html import fromstring

def extract_product_data(content):
    parser = fromstring(content)
    
    # Extraer detalles de productos mediante XPath
    title = parser.xpath('//h1[@data-pl="product-title"]/text()')[0].strip()
    price = parser.xpath('//div[@class="price--current--I3Zeidd product-price-current"]/span/text()')[0].strip()
    rating = ' '.join(parser.xpath('//a[@class="reviewer--rating--xrWWFzx"]/strong/text()')).strip()
    total_reviews = parser.xpath('//a[@class="reviewer--reviews--cx7Zs_V"]/text()')[0].strip()
    sold_count = parser.xpath('//span[@class="reviewer--sold--ytPeoEy"]/text()')[0].strip()

    product_data = {
        'title': title,
        'price': price,
        'rating': rating,
        'total_reviews': total_reviews,
        'sold_count': sold_count
    }

    return product_data


Este código utiliza XPath para extraer detalles relevantes del producto del contenido HTML de la página.

Paso 3. Raspado de reseñas de productos

AliExpress tiene un punto final de API independiente para obtener reseñas de productos. Puedes extraer el ID del producto de la URL dinámicamente y usarlo para obtener revisiones a través de solicitudes. En esta función:

  1. El ID del producto se extrae de la URL del producto de forma dinámica.
  2. Obtenemos las reseñas utilizando la API de reseñas de AliExpress.
  3. Los textos de las reseñas se extraen y se devuelven como una lista.

import requests

def extract_product_id(url):
    # Extraer el ID del producto de la URL
    product_id = url.split('/')[-1].split('.')[0]
    return product_id

def scrape_reviews(product_id, page_num=1, page_size=10):
    headers = {
        'accept': 'application/json, text/plain, */*',
        'accept-language': 'en-IN,en;q=0.9',
        'referer': f'https://www.aliexpress.com/item/{product_id}.html',
        'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36',
    }

    params = {
        'productId': product_id,
        'lang': 'en_US',
        'country': 'US',
        'page': str(page_num),
        'pageSize': str(page_size),
        'filter': 'all',
        'sort': 'complex_default',
    }

    response = requests.get('https://feedback.aliexpress.com/pc/searchEvaluation.do', params=params, headers=headers)
    reviews = response.json()['data']['evaViewList']

    # Extraer sólo texto de revisión
    review_texts = [review['buyerFeedback'] for review in reviews]
    
    return review_texts

Paso 4. Guardar los datos en un archivo CSV

Después de raspar los detalles del producto y las revisiones, guardamos estos datos en un archivo CSV utilizando la biblioteca pandas.


import pandas as pd

def save_to_csv(product_data, reviews, product_id):
    # Guardar detalles del producto en CSV
    df_product = pd.DataFrame([product_data])
    df_product.to_csv(f'product_{product_id}_data.csv', index=False)

    # Guardar reseñas en CSV
    df_reviews = pd.DataFrame({'reviews': reviews})
    df_reviews.to_csv(f'product_{product_id}_reviews.csv', index=False)
    
    print(f"Data saved for product {product_id}.")

Los detalles del producto y las reseñas se guardan en archivos CSV independientes con el ID del producto incluido en el nombre del archivo para facilitar su identificación.

Paso 5. Recuperación dinámica del ID del producto

Así es como funciona el flujo de trabajo dinámico completo:

  1. Pasa la URL de cualquier producto de AliExpress.
  2. El ID del producto se extrae de la URL.
  3. El rascador obtiene datos de productos y reseñas.
  4. Los datos se guardan en archivos CSV con el ID del producto incluido.

# Extraer el ID del producto de la URL
def extract_product_id(url):
    return url.split('/')[-1].split('.')[0]

Código final completo


from playwright.async_api import async_playwright
from lxml.html import fromstring
import requests
import pandas as pd

# Obtener el contenido de la página con Playwright
async def get_page_content(url):
    async with async_playwright() as p:
        browser = await p.firefox.launch(
            headless=False,
            proxy={"server": '', 'username': '', 'password': ''}
        )
        page = await browser.new_page()
        await page.goto(url, timeout=60000)
        content = await page.content()
        await browser.close()
        return content

# Extraer datos de productos
def extract_product_data(content):
    parser = fromstring(content)
    title = parser.xpath('//h1[@data-pl="product-title"]/text()')[0].strip()
    price = parser.xpath('//div[@class="price--current--I3Zeidd product-price-current"]/span/text()')[0].strip()
    rating = ' '.join(parser.xpath('//a[@class="reviewer--rating--xrWWFzx"]/strong/text()')).strip()
    total_reviews = parser.xpath('//a[@class="reviewer--reviews--cx7Zs_V"]/text()')[0].strip()
    sold_count = parser.xpath('//span[@class="reviewer--sold--ytPeoEy"]/text()')[0].strip()

    return {
        'title': title,
        'price': price,
        'rating': rating,
        'total_reviews': total_reviews,
        'sold_count': sold_count
    }

# Extraer el ID del producto de la URL
def extract_product_id(url):
    return url.split('/')[-1].split('.')[0]

# Revisiones de raspado
def scrape_reviews(product_id, page_num=1, page_size=10):
    headers = {
        'accept': 'application/json, text/plain, */*',
        'referer': f'https://www.aliexpress.com/item/{product_id}.html',
        'user-agent': 'Mozilla/5.0'
    }
    params = {
        'productId': product_id,
        'lang': 'en_US',
        'page': str(page_num),
        'pageSize': str(page_size),
    }
    response = requests.get('https://feedback.aliexpress.com/pc/searchEvaluation.do', params=params, headers=headers)
    reviews = response.json()['data']['evaViewList']
    return [review['buyerFeedback'] for review in reviews]

# Guardar datos de productos y reseñas en CSV
def save_to_csv(product_data, reviews, product_id):
    pd.DataFrame([product_data]).to_csv(f'product_{product_id}_data.csv', index=False)
    pd.DataFrame({'reviews': reviews}).to_csv(f'product_{product_id}_reviews.csv', index=False)
    print(f'Saved into: product_{product_id}_data.csv')
    print(f'Saved into: product_{product_id}_reviews.csv')

# Función principal
async def main(url):
    content = await get_page_content(url)
    product_data = extract_product_data(content)
    product_id = extract_product_id(url)
    reviews = scrape_reviews(product_id)
    save_to_csv(product_data, reviews, product_id)

# Ejecutar el rascador
import asyncio
url = 'https://www.aliexpress.com/item/3256805354456256.html'
asyncio.run(main(url))

Consideraciones éticas

Al hacer scraping de datos, es importante seguir unas pautas éticas:

  1. Respeta los términos de servicio de AliExpress: Revisa siempre los términos de servicio antes de hacer scraping de un sitio web. Evita violar sus reglas para evitar ser baneado.
  2. Agiliza tus solicitudes: Enviar demasiadas peticiones en poco tiempo puede sobrecargar sus servidores. Considera añadir retardos entre peticiones.
  3. Evite los datos personales: No recopile ni raspe información personal sin el debido consentimiento.

Seguir estas directrices te ayudará a hacer scraping de forma ética y responsable, minimizando los riesgos tanto para los usuarios como para el sistema de AliExpress.

Comentarios:

0 Comentarios