Come raschiare i dati di AliExpress usando Python

Commenti: 0

Scoprire informazioni da rivenditori elettronici come AliExpress può essere molto utile per raccogliere informazioni sui prodotti, monitorare le fluttuazioni dei prezzi, raccogliere recensioni e così via. In questo articolo esploreremo il processo di acquisizione di informazioni sui prodotti (come nome, prezzo, valutazione, ecc.) e di scraping delle recensioni dei prodotti. Dimostreremo anche come rendere dinamico lo scraper passando l'URL del prodotto, recuperando automaticamente l'ID del prodotto e salvando i dati in un file CSV.

Questo tutorial utilizzerà Playwright per rendere dinamici i contenuti e le richieste per recuperare i dati delle recensioni. Ci assicureremo anche che lo scraper sia etico e conforme alle best practice.

Requisiti

Prima di iniziare, assicuratevi di avere installato le seguenti librerie Python:

  • Playwright: usata per interagire con il browser e rendere il contenuto dinamico.
  • Richieste: utilizzate per recuperare le recensioni tramite l'API di AliExpress.
  • lxml: per analizzare il contenuto HTML.
  • Pandas: serve a salvare i dati in un file CSV.

È possibile installare questi pacchetti eseguendo i seguenti comandi:


# Installare Playwright
pip install playwright


# Installare Requests
pip install requests


# Installare lxml per l'analisi dell'HTML
pip install lxml


# Installare Pandas per la manipolazione e il salvataggio dei dati
pip install pandas

Dopo aver installato Playwright, è necessario installare anche i binari del browser necessari:


playwright install

Questa operazione scaricherà e imposterà il browser necessario per il corretto funzionamento di Playwright.

Fase 1. Invio di richieste con Playwright

Le pagine dei prodotti AliExpress sono dinamiche, cioè caricano il contenuto tramite JavaScript. Per gestire questo aspetto, utilizzeremo Playwright, una libreria Python che consente di controllare un browser headless e di interagire con contenuti dinamici.

Ecco come inviare una richiesta e navigare nella pagina del prodotto:


from playwright.async_api import async_playwright

async def get_page_content(url):
    async with async_playwright() as p:
        # Avvia il browser con un proxy, se necessario (può essere rimosso se non si usa il proxy)
        browser = await p.firefox.launch(
            headless=False,
            proxy={"server": '', 'username': '', 'password': ''}
        )
        page = await browser.new_page()
        await page.goto(url, timeout=60000)

        # Estrarre il contenuto della pagina
        content = await page.content()
        await browser.close()
        
        return content

# Esempio di URL
url = 'https://www.aliexpress.com/item/3256805354456256.html'

Fase 2. Estrazione dei dati del prodotto

Una volta ottenuto il contenuto della pagina, possiamo estrarre i dati del prodotto utilizzando query lxml e XPath. Raccoglieremo dettagli come il titolo del prodotto, il prezzo, la valutazione, il numero di recensioni e il numero di articoli venduti.


from lxml.html import fromstring

def extract_product_data(content):
    parser = fromstring(content)
    
    # Estrarre i dettagli del prodotto con 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


Questo codice utilizza XPath per estrarre i dettagli rilevanti del prodotto dal contenuto HTML della pagina.

Fase 3. Scraping delle recensioni dei prodotti

AliExpress ha un endpoint API separato per recuperare le recensioni dei prodotti. È possibile estrarre dinamicamente l'ID del prodotto dall'URL e utilizzarlo per recuperare le recensioni tramite richieste. In questa funzione:

  1. L'ID del prodotto viene estratto dinamicamente dall'URL del prodotto.
  2. Recuperiamo le recensioni utilizzando l'API delle recensioni di AliExpress.
  3. I testi delle recensioni vengono estratti e restituiti come elenco.

import requests

def extract_product_id(url):
    # Estrarre l'ID del prodotto dall'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']

    # Estrarre solo il testo della recensione
    review_texts = [review['buyerFeedback'] for review in reviews]
    
    return review_texts

Fase 4. Salvataggio dei dati in un file CSV

Dopo aver raccolto i dettagli dei prodotti e le recensioni, salviamo i dati in un file CSV utilizzando la libreria pandas.


import pandas as pd

def save_to_csv(product_data, reviews, product_id):
    # Salvare i dettagli del prodotto in CSV
    df_product = pd.DataFrame([product_data])
    df_product.to_csv(f'product_{product_id}_data.csv', index=False)

    # Salvare le recensioni in 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}.")

I dettagli del prodotto e le recensioni vengono salvati in file CSV separati con l'ID del prodotto incluso nel nome del file per una facile identificazione.

Fase 5. Recupero dinamico dell'ID prodotto

Ecco come funziona il flusso di lavoro dinamico completo:

  1. Passa un qualsiasi URL di prodotto AliExpress.
  2. L'ID del prodotto viene estratto dall'URL.
  3. Lo scraper recupera i dati del prodotto e le recensioni.
  4. I dati vengono salvati in file CSV con l'ID del prodotto incluso.

# Estrarre l'ID del prodotto dall'URL
def extract_product_id(url):
    return url.split('/')[-1].split('.')[0]

Codice completo finale


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

# Ottenere il contenuto della pagina 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

# Estrarre i dati del prodotto
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
    }

# Estrarre l'ID del prodotto dall'URL
def extract_product_id(url):
    return url.split('/')[-1].split('.')[0]

# Scrape recensioni
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]

# Salvare i dati dei prodotti e le recensioni in 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')

# Funzione principale
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)

# Eseguire il raschietto
import asyncio
url = 'https://www.aliexpress.com/item/3256805354456256.html'
asyncio.run(main(url))

Considerazioni etiche

Quando si effettua lo scraping di dati, è importante seguire le linee guida etiche:

  1. Rispettare i termini di servizio di AliExpress: Controllare sempre i termini di servizio prima di effettuare lo scraping di un sito web. Evitate di violare le loro regole per non essere bannati.
  2. Limitare le richieste: L'invio di troppe richieste in poco tempo può sovraccaricare i loro server. Considerate la possibilità di aggiungere dei ritardi tra le richieste.
  3. Evita i dati personali: Non raccogliete o scrappate informazioni personali senza un adeguato consenso.

Seguire queste linee guida vi aiuterà a fare scraping in modo etico e responsabile, riducendo al minimo i rischi sia per gli utenti che per il sistema AliExpress.

Commenti:

0 Commenti