eBay est l'une des plus grandes places de marché en ligne au monde, hébergeant des millions de produits dans diverses catégories. L'utilisation d'eBay peut s'avérer précieuse pour des tâches telles que :
Dans ce guide, nous allons vous montrer comment créer un simple script Python pour rechercher un mot-clé, extraire les détails d'un produit comme le titre, le prix, la devise, la disponibilité, les commentaires et les évaluations, et enregistrer les données dans un fichier CSV. Ce tutoriel est idéal pour les débutants qui souhaitent apprendre le web scraping de la bonne manière, avec des conseils sur le respect des conditions de service et l'utilisation responsable de proxys .
Si vous ne recherchez que l'implémentation complète, voici le script Python complet pour récupérer les détails d'un produit sur eBay en utilisant proxys. Copiez-le et collez-le dans votre environnement pour commencer :
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)
N'oubliez pas de mettre à jour la variable proxys avec un nouveau nom d'utilisateur et un nouveau mot de passe avant de les utiliser.
Notre méthode simplifie le processus en se concentrant sur quatre fonctions clés :
Il est essentiel de commencer avec les bons outils. Vous aurez besoin de :
mkdir ebay_scraping
cd ebay_scraping
python -m venv venv
source env/bin/activate # Sous Windows utilisez : venv\Scripts\activate
pip install requests bs4
Dans cet exemple, nous utiliserons la rotation de Proxyscrape Residential proxys afin de maintenir l'anonymat et de protéger l'adresse IP privée contre l'inscription sur liste noire.
Nous commençons par importer les bibliothèques nécessaires à ce projet de web scraping :
import csv
importer l 'heure
import requests
from bs4 import BeautifulSoup
Afin de garder votre adresse IP privée et de minimiser ainsi les risques de voir votre adresse IP blacklistée sur certains sites web, il est recommandé d'effectuer des activités de web scraping sous le bouclier de proxys, comme mentionné ci-dessus, nous utiliserons une rotation de Proxyscrape Résidentiel proxys pour ce tutoriel, mais vous pouvez utiliser d'autres proxys ou pas de proxys du tout.
proxies = {
"http": "http://username:[email protected]:6060",
"https": "http://username:[email protected]:6060",
}
Commençons par expliquer le processus de recherche que nous utiliserons dans ce tutoriel. Nous interrogerons l'URL d'eBay avec le mot-clé "sacoche d'ordinateur portable", comme le montre l'image ci-dessous :
Nous utiliserons l'URL demandée pour envoyer une requête à l'aide de la fonction demande.get()
. Une fois que nous aurons reçu une réponse, nous analyserons le contenu HTML à l'aide de BeautifulSoup (bs4) pour extraire l'URL de chaque produit. L'image ci-dessous montre l'emplacement de chaque URL de produit dans le HTML.
Le lien vers le produit se trouve à l'intérieur d'un <div>
avec l'élément classe s-item__info clearfix
. Pour extraire ces liens, nous utilisons BeautifulSoup (bs4) pour rechercher tous les <div>
avec cette classe spécifique. Une fois que nous avons localisé ces éléments, nous itérons à travers chacun d'entre eux pour trouver <a>
et extraire les éléments href
qui contient l'URL du produit.
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)
Présentation de la obtenir_des_informations_sur_le_produit
Cette fonction prend en entrée l'URL d'un produit. Cette fonction prend en entrée l'URL d'un produit, envoie une requête à cette URL, puis utilise BeautifulSoup (bs4) pour analyser les informations relatives au produit à l'aide de la fonction règles spécifiques et motifs d'expressions rationnelles.
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
Enfin, nous organisons les entités de produits analysées en un dictionnaire, qui est ensuite renvoyé par la fonction.
Il est temps de stocker ces résultats dans un fichier CSV à l'aide de la fonction native Python csv bibliothèque. Les save_to_csv(produits)
La fonction accepte produits qui est une liste de dictionnaires contenant des détails sur les produits, comme décrit précédemment. Ces données sont ensuite enregistrées dans un fichier CSV nommé d'après le nom de l'utilisateur. nom_du_fichier_csv
dont la valeur par défaut est "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}")
Dans ce tutoriel, nous avons montré comment faire du scraping sur eBay en construisant un script Python qui recherche un mot-clé, extrait les détails du produit et enregistre les données dans un fichier CSV. Ce processus met en évidence des techniques de scraping essentielles telles que la manipulation d'éléments HTML, l'utilisation de proxys pour l'anonymat et le respect de pratiques de scraping éthiques. Ce script peut être encore amélioré en incorporant une fonctionnalité de pagination et la possibilité de traiter plusieurs mots-clés.
N'oubliez jamais de faire du scraping de manière responsable, de respecter les conditions d'utilisation des sites web et d'utiliser des outils tels que la limitation de débit pour éviter les perturbations. Pour rendre vos tâches de scraping plus fiables et plus efficaces, pensez à explorer nos services de proxy de haute qualité sur ProxyScrape. Que vous ayez besoin d'un proxy résidentiel, d'un proxy de centre de données ou d'un proxy mobile( proxys ), nous avons ce qu'il vous faut. Consultez nos offres pour faire passer vos projets de web scraping au niveau supérieur !
Bon scraping !