Come raschiare eBay nel 2024: Una guida per principianti

Pitone, Come fare, 21-nov-20245 minuti di lettura

eBay è uno dei più grandi mercati online del mondo e ospita milioni di prodotti di varie categorie. Lo scraping di eBay può essere prezioso per attività come:

  • Confronto dei prezzi
  • Analisi di mercato
  • Monitoraggio delle tendenze dei prodotti

In questa guida vi mostreremo come creare un semplice script Python per cercare una parola chiave, estrarre i dettagli del prodotto come titolo, prezzo, valuta, disponibilità, recensioni e valutazioni e salvare i dati in un file CSV. Questo tutorial è ideale per i principianti che vogliono imparare il web scraping nel modo giusto, con suggerimenti sul rispetto dei termini di servizio e sull'uso responsabile dei proxy.

Saltare la spiegazione? Ecco il codice completo

Se state cercando l'implementazione completa, ecco lo script Python completo per lo scraping dei dettagli dei prodotti da eBay utilizzando i proxy. Copiatelo e incollatelo nel vostro ambiente per iniziare:

import re
import csv
import time

import requests
from bs4 import BeautifulSoup

proxies = {
    "http": "http://username:[email protected]:6060",
    "https": "http://username:[email protected]:6060",
}

def get_product_information(product_url) -> dict:
    r = requests.get(product_url, proxies=proxies)
    soup = BeautifulSoup(r.text, features="html.parser")

    product_title = soup.find("h1", {"class": "x-item-title__mainTitle"}).text
    product_price = soup.find("div", {"class": "x-price-primary"}).text.split(" ")[-1]
    currency = soup.find("div", {"class": "x-price-primary"}).text.split(" ")[0]

    # locate the element that holds quanity number of product
    quantity_available = soup.find("div", {"class":"x-quantity__availability"})
    if quantity_available is not None:
        # Using regex check if we can locate the strings that holds this number
        regex_pattern = r"\d+\savailable"
        if re.search(regex_pattern, quantity_available.text) is not None:
            quantity_available = re.search(regex_pattern, quantity_available.text).group()
            # After string is located we extract the number by splitting it by space and selecting the first element.
            quantity_available = quantity_available.split(" ")[0]
        else:
            quantity_available = "NA"

    total_reviews = soup.find("span", {"class":"ux-summary__count"})
    if total_reviews is not None:
        total_reviews = total_reviews.text.split(" ")[0]
    else:
        total_reviews = "NA"

    rating = soup.find("span", {"class":"ux-summary__start--rating"})
    if rating is not None:
        rating = rating.text
    else:
        rating = "NA"

    product_info = {
        "product_url": product_url,
        "title": product_title,
        "product_price": product_price,
        "currency": currency,
        "availability": quantity_available,
        "nr_reviews": total_reviews,
        "rating": rating
    }

    return product_info

def save_to_csv(products, csv_file_name="products.csv"):

    # Write the list of dictionaries to a CSV file
    with open(csv_file_name, mode='w', newline='') as csv_file:
        # Create a csv.DictWriter object
        writer = csv.DictWriter(csv_file, fieldnames=products[0].keys())

        # Write the header (keys of the dictionary)
        writer.writeheader()

        # Write the rows (values of the dictionaries)
        writer.writerows(products)

    print(f"Data successfully written to {csv_file_name}")

def main(keyword_to_search: str):
    products = []

    r = requests.get(f"https://www.ebay.com/sch/i.html?_nkw={keyword_to_search}", proxies=proxies)

    soup = BeautifulSoup(r.text, features="html.parser")
    for item in soup.find_all("div", {"class": "s-item__info clearfix"})[2::]:
        item_url = item.find("a").get("href")

        product_info: dict = get_product_information(item_url)
        print(product_info)
        # Adding a 1-second delay between requests to avoid overloading the server and reduce the risk of being blocked
        time.sleep(2)

        products.append(product_info)
    # save data to csv
    save_to_csv(products)


if __name__ == '__main__':
    keywords = "laptop bag"
    main(keywords)

Ricordarsi di aggiornare la variabile dei proxy con un nuovo nome utente e una nuova password prima di utilizzarli.

Come rottamiamo eBay

Il nostro metodo semplifica il processo, concentrandosi su quattro funzioni chiave:

  • Ricerca per parola chiave: Scoprite i prodotti inserendo un termine di ricerca (ad esempio, "borse per computer portatili") per trovare gli articoli pertinenti.
  • Estrazione degli URL dei prodotti: Raccogliere gli URL dei prodotti elencati nella prima pagina dei risultati di ricerca per ottimizzare la raccolta dei dati.
  • Estrazione delle informazioni sul prodotto: Per ogni URL di prodotto, navigheremo alla pagina del prodotto per recuperare le informazioni vitali.
  • Salvataggio dei dati: Salvare i dati estratti in un file CSV per un accesso e un'analisi efficienti.

Prerequisiti

Iniziare con gli strumenti giusti è fondamentale. Avrete bisogno di:

Installare Python:

Impostare l'ambiente di sviluppo:

  • Selezionate la directory in cui volete collocare il progetto. Impostare un ambiente virtuale per mantenere le dipendenze pulite e isolate.
mkdir ebay_scraping
cd ebay_scraping
python -m venv venv
source env/bin/activate # Su Windows usare: venv\Scripts\activate
pip installa le richieste bs4

Impostazione dei proxy:

In questo esempio utilizzeremo i proxy residenziali a rotazione Proxyscrape per mantenere l'anonimato e proteggere l'ip privato dall'inserimento nella blacklist.

Spiegazione del copione

Passo 1: Importazione di librerie e proxy

Si inizia importando le librerie necessarie per questo progetto di web scraping, che includono:

  • CSV: questo modulo fornisce classi per leggere e scrivere dati tabellari in formato CSV. Consente ai programmatori di scrivere facilmente dati nel formato preferito da Excel o di leggere dati da file generati da Excel senza conoscere i dettagli del formato CSV.
  • Requests: questo modulo consente di inviare richieste HTTP utilizzando Python.
  • BeautifulSoup4 è un potente parser html progettato per estrarre le informazioni necessarie da una struttura html.

Importazioni richieste:

importare csv
importare il tempo
importare richieste
da bs4 importa BeautifulSoup

Impostazione del proxy:

Per mantenere il vostro ip privato, riducendo così al minimo le possibilità di essere inseriti nella lista nera di siti web specifici, si raccomanda di eseguire le attività di scraping sotto lo scudo dei proxy; come già detto, in questo tutorial utilizzeremo i proxy residenziali a rotazione Proxyscrape , ma potete utilizzare altri proxy o nessun proxy.

proxies = {
   "http": "http://username:[email protected]:6060",
   "https": "http://username:[email protected]:6060",
}

Fase 2: ottenere i risultati della ricerca

Iniziamo spiegando il processo di ricerca che utilizzeremo in questa esercitazione. Interroghiamo l'URL di eBay con la parola chiave "borsa per laptop", come mostrato in questa immagine:

Utilizzeremo l'URL interrogato per inviare una richiesta con request.get(). Una volta ricevuta la risposta, analizzeremo il contenuto HTML utilizzando BeautifulSoup (bs4) per estrarre l'URL di ciascun prodotto. L'immagine sottostante mostra dove si trova l'URL di ciascun prodotto all'interno dell'HTML.

Il link al prodotto si trova all'interno di un file <div> con l'elemento classe s-item__info clearfix. Per estrarre questi collegamenti, utilizziamo BeautifulSoup (bs4) per cercare tutti i <div> con questa classe specifica. Una volta individuati questi elementi, si itera attraverso ciascuno di essi per trovare <a> ed estrarre gli elementi href che contiene l'URL del prodotto.

def main(keyword_to_search: str):
   products = []

   r = requests.get(f"https://www.ebay.com/sch/i.html?_nkw={keyword_to_search}", proxies=proxies)

   soup = BeautifulSoup(r.text, features="html.parser")
   for item in soup.find_all("div", {"class": "s-item__info clearfix"})[2::]:
       item_url = item.find("a").get("href")

       product_info: dict = get_product_information(item_url)
		# Adding a 1-second delay between requests to avoid overloading the server and reduce the risk of being blocked
       time.sleep(1)

       products.append(product_info)
   # save data to csv
   save_to_csv(products)

Fase 3: Estrazione delle informazioni sul prodotto

Introduzione al get_product_information funzione. Questa funzione prende in input l'URL di un prodotto, invia una richiesta a quell'URL e utilizza BeautifulSoup (bs4) per analizzare le informazioni sul prodotto utilizzando regole specifiche e modelli regex.

def get_product_information(product_url) -> dict:
   r = requests.get(product_url, proxies=proxies)
   soup = BeautifulSoup(r.text, features="html.parser")

   product_title = soup.find("h1", {"class": "x-item-title__mainTitle"}).text
   product_price = soup.find("div", {"class": "x-price-primary"}).text.split(" ")[-1]
   currency = soup.find("div", {"class": "x-price-primary"}).text.split(" ")[0]

   # locate the element that holds quanity number of product
   quantity_available = soup.find("div", {"class":"x-quantity__availability"})
   if quantity_available is not None:
       # Using regex check if we can locate the strings that holds this number
       regex_pattern = r"\d+\savailable"
       if re.search(regex_pattern, quantity_available.text) is not None:
           quantity_available = re.search(regex_pattern, quantity_available.text).group()
           # After string is located we extract the number by splitting it by space and selecting the first element.
           quantity_available = quantity_available.split(" ")[0]
       else:
           quantity_available = "NA"

   total_reviews = soup.find("span", {"class":"ux-summary__count"})
   if total_reviews is not None:
       total_reviews = total_reviews.text.split(" ")[0]
   else:
       total_reviews = "NA"

   rating = soup.find("span", {"class":"ux-summary__start--rating"})
   if rating is not None:
       rating = rating.text
   else:
       rating = "NA"

   product_info = {
       "product_url": product_url,
       "title": product_title,
       "product_price": product_price,
       "currency": currency,
       "availability": quantity_available,
       "nr_reviews": total_reviews,
       "rating": rating
   }

   return product_info

Infine, organizziamo le entità prodotto analizzate in un dizionario, che viene restituito dalla funzione.

Fase 4: Salvataggio dei risultati

È il momento di memorizzare questi risultati in un file CSV, utilizzando la funzione nativa di Python csv biblioteca. Il save_to_csv(prodotti) la funzione accetta prodotti come input, ovvero un elenco di dizionari contenenti i dettagli dei prodotti come descritto in precedenza. Questi dati vengono poi salvati in un file CSV che prende il nome di nome_file_csv che ha come valore predefinito "products.csv".

def save_to_csv(products, csv_file_name="products.csv"):

   # Write the list of dictionaries to a CSV file
   with open(csv_file_name, mode='w', newline='') as csv_file:
       # Create a csv.DictWriter object
       writer = csv.DictWriter(csv_file, fieldnames=products[0].keys())

       # Write the header (keys of the dictionary)
       writer.writeheader()

       # Write the rows (values of the dictionaries)
       writer.writerows(products)

   print(f"Data successfully written to {csv_file_name}")

Conclusione

In questa esercitazione abbiamo dimostrato come effettuare lo scraping di eBay costruendo uno script Python che cerca una parola chiave, estrae i dettagli del prodotto e salva i dati in un file CSV. Questo processo mette in evidenza le tecniche essenziali di scraping, come la gestione degli elementi HTML, l'uso di proxy per l'anonimato e il rispetto di pratiche etiche di scraping. Questo script può essere ulteriormente migliorato incorporando la funzionalità di paginazione e la capacità di elaborare più parole chiave.

Ricordate sempre di effettuare lo scraping in modo responsabile, di rispettare i termini di servizio dei siti web e di utilizzare strumenti come la limitazione della velocità per evitare interruzioni. Per rendere le vostre attività di scraping più affidabili ed efficienti, prendete in considerazione i nostri servizi proxy di alta qualità su ProxyScrape. Che abbiate bisogno di proxy residenziali, per datacenter o per dispositivi mobili, siamo a vostra disposizione. Date un'occhiata alle nostre offerte per portare i vostri progetti di scraping web a un livello superiore!

Buona raschiatura!