Comment faire du scrape sur eBay en 2024 : Guide du débutant

Python, Comment faire, 21 novembre 20245 minutes de lecture

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 :

  • Comparaison des prix
  • Analyse du marché
  • Suivre les tendances des produits

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 .

Sauter l'explication ? Voici le code complet

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.

Comment nous allons récupérer les données d'eBay

Notre méthode simplifie le processus en se concentrant sur quatre fonctions clés :

  • Recherche par mot-clé : Découvrez des produits en saisissant un terme de recherche (par exemple, "sacs pour ordinateurs portables") pour obtenir des articles pertinents.
  • Extraction des URL des produits : Collecter les URL des produits listés sur la première page des résultats de recherche afin de rationaliser la collecte des données.
  • Extraction des informations sur les produits : Pour chaque URL de produit, nous naviguerons vers la page du produit afin d'extraire des informations essentielles.
  • Sauvegarde des données : Enregistrez les données extraites dans un fichier CSV pour un accès et une analyse efficaces.

Conditions préalables

Il est essentiel de commencer avec les bons outils. Vous aurez besoin de :

Installer Python :

Mise en place de l'environnement de développement :

  • Sélectionnez le répertoire dans lequel vous souhaitez placer ce projet. Mettez en place un environnement virtuel pour maintenir des dépendances propres et isolées.
mkdir ebay_scraping
cd ebay_scraping
python -m venv venv
source env/bin/activate # Sous Windows utilisez : venv\Scripts\activate
pip install requests bs4

proxys Mise en place :

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.

Explication du scénario

Étape 1 : Importer des bibliothèques et des proxys

Nous commençons par importer les bibliothèques nécessaires à ce projet de web scraping :

  • CSV : ce module fournit des classes permettant de lire et d'écrire des données tabulaires au format CSV. Il permet aux programmeurs d'écrire facilement des données dans le format préféré d'Excel ou de lire des données à partir de fichiers générés par Excel sans connaître les détails précis du format CSV.
  • Requêtes : ce module vous permet d'envoyer des requêtes HTTP à l'aide de Python.
  • BeautifulSoup4 est un puissant analyseur html conçu pour extraire l'information dont vous avez besoin d'une structure html.

Importations obligatoires :

import csv
importer l 'heure
import requests
from bs4 import BeautifulSoup

Configuration du proxy :

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",
}

Étape 2 : Obtenir des résultats de recherche

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)

Étape 3 : Extraction des informations sur les produits

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.

Étape 4 : Sauvegarde des résultats

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}")

Conclusion

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 !