Como extrair dados do AliExpress utilizando Python

Comentários: 0

Descobrir informações de retalhistas electrónicos, como o AliExpress, pode ser altamente benéfico para a recolha de informações sobre produtos, monitorização de flutuações de preços, recolha de avaliações e assim por diante. Neste artigo, exploraremos o processo de aquisição de informações sobre produtos (como nome, preço, classificação, etc.) e também analisaremos as análises de produtos de raspagem. Também demonstraremos como tornar o raspador dinâmico, passando o URL do produto, recuperando automaticamente o ID do produto e salvando os dados em um arquivo CSV.

Este tutorial usará o Playwright para renderizar conteúdo dinâmico e solicitações para buscar dados de revisão. Também garantiremos que o scraper seja ético e esteja em conformidade com as práticas recomendadas.

Requisitos

Antes de começarmos, verifique se você tem as seguintes bibliotecas Python instaladas:

  • Playwright: usada para interagir com o navegador e renderizar conteúdo dinâmico.
  • Requests: usada para buscar reviews através da API do AliExpress.
  • lxml: para analisar o conteúdo HTML.
  • Pandas: é usado para salvar os dados em um arquivo CSV.

Você pode instalar esses pacotes executando os seguintes comandos:


# Instalar Playwright
pip install playwright


# Instalar Requests
pip install requests


# Instalar o lxml para analisar HTML
pip install lxml


# Instalar o Pandas para manipular e guardar dados
pip install pandas

Depois de instalar o Playwright, também terá de instalar os binários do browser necessários:


playwright install

Isso fará o download e configurará o navegador necessário para que o Playwright funcione corretamente.

Passo 1. Enviando solicitações com o Playwright

As páginas de produtos do AliExpress são dinâmicas, o que significa que elas carregam conteúdo via JavaScript. Para lidar com isso, usaremos o Playwright, uma biblioteca Python que permite controlar um navegador sem cabeça e interagir com conteúdo dinâmico.

Veja como você pode enviar uma solicitação e navegar até a página do produto:


from playwright.async_api import async_playwright

async def get_page_content(url):
    async with async_playwright() as p:
        # Iniciar o browser com um proxy, se necessário (pode ser removido se não estiver a utilizar o proxy)
        browser = await p.firefox.launch(
            headless=False,
            proxy={"server": '', 'username': '', 'password': ''}
        )
        page = await browser.new_page()
        await page.goto(url, timeout=60000)

        # Extrair o conteúdo da página
        content = await page.content()
        await browser.close()
        
        return content

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

Passo 2. Extração de dados do produto

Assim que tivermos o conteúdo da página, podemos extrair os dados do produto usando consultas lxml e XPath. Reuniremos detalhes como o título do produto, o preço, a classificação, o número de comentários e o número de itens vendidos.


from lxml.html import fromstring

def extract_product_data(content):
    parser = fromstring(content)
    
    # Extrair detalhes do produto utilizando 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 usa XPath para extrair detalhes relevantes do produto do conteúdo HTML da página.

Passo 3. Raspagem de revisões de produtos

O AliExpress tem um endpoint de API separado para buscar avaliações de produtos. Você pode extrair o ID do produto do URL dinamicamente e usá-lo para buscar avaliações por meio de solicitações. Nesta função:

  1. O ID do produto é extraído do URL do produto dinamicamente.
  2. Nós buscamos as avaliações usando a API de avaliação do AliExpress.
  3. Os textos das avaliações são extraídos e retornados como uma lista.

import requests

def extract_product_id(url):
    # Extrair o ID do produto do 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']

    # Extrair apenas texto de revisão
    review_texts = [review['buyerFeedback'] for review in reviews]
    
    return review_texts

Passo 4. Salvando dados em um arquivo CSV

Depois de raspar os detalhes e as avaliações do produto, salvamos esses dados em um arquivo CSV usando a biblioteca pandas.


import pandas as pd

def save_to_csv(product_data, reviews, product_id):
    # Guardar detalhes do produto em CSV
    df_product = pd.DataFrame([product_data])
    df_product.to_csv(f'product_{product_id}_data.csv', index=False)

    # Guardar comentários em 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}.")

Os detalhes do produto e as avaliações são guardados em ficheiros CSV separados com o ID do produto incluído no nome do ficheiro para facilitar a identificação.

Passo 5. Recuperação dinâmica do ID do produto

Veja como o fluxo de trabalho dinâmico completo funciona:

  1. Passe qualquer URL de produto do AliExpress.
  2. O ID do produto é extraído do URL.
  3. O scraper busca dados e avaliações do produto.
  4. Os dados são salvos em arquivos CSV com o ID do produto incluído.

# Extrair o ID do produto do URL
def extract_product_id(url):
    return url.split('/')[-1].split('.')[0]

Código completo final


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

# Obter o conteúdo da página utilizando o 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

# Extrair dados do produto
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
    }

# Extrair o ID do produto do URL
def extract_product_id(url):
    return url.split('/')[-1].split('.')[0]

# Análises de raspagem
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 dados e análises de produtos em 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')

# Função 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)

# Utilizar o raspador
import asyncio
url = 'https://www.aliexpress.com/item/3256805354456256.html'
asyncio.run(main(url))

Considerações éticas

Ao extrair dados, é importante seguir as diretrizes éticas:

  1. Respeite os termos de serviço do AliExpress: Sempre verifique os termos de serviço antes de raspar um site. Evite violar suas regras para evitar ser banido.
  2. Flexibilize suas solicitações: Enviar muitas solicitações em um curto espaço de tempo pode sobrecarregar seus servidores. Considere adicionar atrasos entre as solicitações.
  3. Evite dados pessoais: Não colete ou raspe informações pessoais sem o devido consentimento.

Seguir essas diretrizes ajudará você a raspar de forma ética e responsável, minimizando os riscos para os usuários e para o sistema AliExpress.

Comentários:

0 Comentários