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:
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.
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.
Il nostro metodo semplifica il processo, concentrandosi su quattro funzioni chiave:
Iniziare con gli strumenti giusti è fondamentale. Avrete bisogno di:
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
In questo esempio utilizzeremo i proxy residenziali a rotazione Proxyscrape per mantenere l'anonimato e proteggere l'ip privato dall'inserimento nella blacklist.
Si inizia importando le librerie necessarie per questo progetto di web scraping, che includono:
importare csv
importare il tempo
importare richieste
da bs4 importa BeautifulSoup
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",
}
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)
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.
È 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}")
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!