Come analizzare i dati di eBay con Python

Commenti: 0

eBay è una nota piattaforma online che offre opportunità di compravendita di un'ampia gamma di prodotti ai suoi utenti registrati. In questa guida spiegheremo come effettuare lo scraping di dati dalle inserzioni di eBay utilizzando Python. In questo caso, ci interesseranno i dettagli disponibili nell'inserzione stessa, ma anche quelli che si ottengono andando a vedere i singoli prodotti per avere maggiori dettagli.

Requisiti

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

  • Richieste: Per effettuare richieste HTTP.
  • lxml: Per analizzare il contenuto HTML.
  • Pandas: Per salvare i dati in un file CSV.

Installare queste librerie utilizzando:


pip install requests lxml pandas

Comprendere la struttura degli URL di eBay per la paginazione

Quando si cercano prodotti su eBay, ogni URL di pagina può essere modificato per navigare tra i risultati paginati. Ad esempio:

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

Il parametro _pgn viene utilizzato per navigare tra più pagine di annunci, consentendo il recupero di numerosi dati. Iniziamo il processo di scraping.

Fase 1: invio di richieste a eBay

Per iniziare, imposteremo le intestazioni in modo da imitare una vera richiesta del browser, per evitare il rilevamento e il potenziale blocco da parte delle misure anti-bot di eBay. Quindi invieremo una richiesta alla pagina dell'inserzione per raccogliere i link di ciascun prodotto.


import requests
from lxml.html import fromstring

# Definire le intestazioni per simulare un browser reale
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',
}

# Parametri della richiesta per la query di ricerca
params = {
    '_nkw': 'laptop',
}

# Invia una richiesta alla pagina dell'inserzione eBay
listing_page_response = requests.get('https link', params=params, headers=headers)
listing_parser = fromstring(listing_page_response.text)

Fase 2: analizzare la pagina dell'annuncio

Nella pagina dell'elenco, estrarremo gli URL dei singoli prodotti. Questo ci permette di visitare ogni pagina di prodotto per raccogliere dettagli specifici, come il titolo del prodotto, il prezzo e altro ancora.


# Analizzare la pagina dell'inserzione per estrarre i link ai prodotti
links = listing_parser.xpath('//div[@class="s-item__info clearfix"]/a[@_sp="p2351460.m1686.l7400"]/@href')

# Un esempio dei collegamenti trovati
print("Product Links:", links[:5])  # Display the first five product links

Fase 3: Scraping dei dati dei prodotti

Con gli URL dei prodotti in mano, visitiamo ogni pagina di prodotto ed estraiamo i seguenti dettagli:

  • Titolo del prodotto;
  • Prezzo;
  • Costo di spedizione;
  • Condizione del prodotto;
  • Quantità disponibile;
  • Quantità vendute;
  • Opzioni di pagamento;
  • Politica di restituzione.

Successivamente, si eseguirà il loop di ogni link e si utilizzeranno le espressioni XPath per individuare le informazioni richieste nella pagina del prodotto.


product_data = []

for url in links:
    # Invia una richiesta alla pagina del prodotto
    product_page_response = requests.get(url, headers=headers)
    product_parser = fromstring(product_page_response.text)
    
    # Estrarre i dati con 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]
        
        # Memorizzare i dati in un dizionario
        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}")

Fase 4: Salvataggio dei dati in un file CSV

Dopo aver raccolto i dati, possiamo salvarli in un file CSV utilizzando Pandas.


import pandas as pd

# Convertire i dati in DataFrame
df = pd.DataFrame(product_data)

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

Gestione del rate-limiting e aggiramento del rilevamento su eBay

eBay impiega il rate-limiting per evitare richieste eccessive. Ecco alcuni metodi per evitare il rilevamento:

  • Utilizzare i proxy: Ruotare tra diversi indirizzi IP.
  • Regola gli intervalli di richiesta: Implementare ritardi tra le richieste.
  • Randomizzare gli agenti utente: Variare la stringa dell'agente utente per evitare il rilevamento.

Seguendo queste best practice, è possibile ridurre al minimo il rischio di essere bloccati e continuare a eseguire lo scraping dei dati in modo efficiente.

Codice completo

Ecco il codice completo per lo scraping dei dati di eBay e il loro salvataggio in un file 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']

# Definire le intestazioni per la richiesta
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),
}

# Parametri di ricerca
params = {'_nkw': 'laptop'}
proxies = {
    'http': 'IP:PORT',
    'https': 'IP:PORT'
}

# Recuperare la pagina dell'annuncio
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')

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

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

Lo scraping di eBay con Python consente di raccogliere dati efficienti su prodotti, prezzi e tendenze. In questa guida abbiamo trattato lo scraping delle inserzioni, la gestione della paginazione, l'impostazione delle intestazioni e l'uso dei proxy per evitare il rilevamento. Ricordate di rispettare i termini di servizio di eBay utilizzando intervalli di richiesta responsabili e la rotazione dei proxy. Grazie a questi strumenti, ora è possibile raccogliere e analizzare facilmente i dati di eBay per ottenere informazioni sul mercato. Buon scraping!

Commenti:

0 Commenti