Wie man eBay im Jahr 2024 schrottet: Ein Leitfaden für Anfänger

Python, How to's, 21. November 20245 Min. gelesen

eBay ist einer der größten Online-Marktplätze der Welt, auf dem Millionen von Produkten in verschiedenen Kategorien angeboten werden. Das Scraping von eBay kann von unschätzbarem Wert sein für Aufgaben wie:

  • Vergleich der Preise
  • Marktanalyse
  • Verfolgung von Produkttrends

In dieser Anleitung zeigen wir Ihnen, wie Sie ein einfaches Python-Skript erstellen, um nach einem Schlüsselwort zu suchen, Produktdetails wie Titel, Preis, Währung, Verfügbarkeit, Rezensionen und Bewertungen zu extrahieren und die Daten in einer CSV-Datei zu speichern. Dieses Tutorial eignet sich hervorragend für Anfänger, die Web Scraping auf die richtige Art und Weise erlernen möchten, mit Tipps zur Einhaltung von Nutzungsbedingungen und zur verantwortungsvollen Verwendung von Proxys.

Die Erklärung überspringen? Hier ist der vollständige Code

Wenn Sie nur nach der vollständigen Implementierung suchen, finden Sie hier das komplette Python-Skript für das Auslesen von Produktdaten aus eBay unter Verwendung von Proxys. Kopieren Sie es und fügen Sie es in Ihre Umgebung ein, um loszulegen:

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)

Bitte denken Sie daran, die Proxy-Variable mit einem neuen Benutzernamen und Passwort zu aktualisieren, bevor Sie sie verwenden.

Wie wir eBay verschrotten werden

Unsere Methode vereinfacht den Prozess und konzentriert sich auf vier Schlüsselfunktionen:

  • Suche nach einem Schlüsselwort: Entdecken Sie Produkte durch Eingabe eines Suchbegriffs (z. B. "Laptoptaschen"), um relevante Artikel zu finden.
  • Extrahieren von Produkt-URLs: Sammeln Sie die URLs der auf der ersten Seite der Suchergebnisse aufgeführten Produkte, um die Datenerfassung zu optimieren.
  • Extrahieren von Produktinformationen: Für jede Produkt-URL werden wir zur Produktseite navigieren, um wichtige Informationen abzurufen.
  • Speichern von Daten: Speichern Sie die extrahierten Daten in einer CSV-Datei für einen effizienten Zugriff und eine effiziente Analyse.

Voraussetzungen

Entscheidend ist, dass Sie mit den richtigen Werkzeugen beginnen. Das müssen Sie tun:

Python installieren:

Richten Sie Ihre Entwicklungsumgebung ein:

  • Wählen Sie das Verzeichnis, in dem Sie das Projekt ablegen möchten. Richten Sie eine virtuelle Umgebung ein, um saubere, isolierte Abhängigkeiten zu erhalten.
mkdir ebay_scraping
cd ebay_scraping
python -m venv venv
source env/bin/activate # Unter Windows verwenden: venv\Scripts\activate
pip install anfragen bs4

Proxies einrichten:

In diesem Beispiel werden wir rotierende Proxyscrape Residential Proxies verwenden, um die Anonymität zu wahren und die private IP vor einer schwarzen Liste zu schützen.

Skript-Erläuterung

Schritt 1: Importieren von Bibliotheken und Proxys

Wir beginnen mit dem Import der erforderlichen Bibliotheken für dieses Web-Scraping-Projekt, die Folgendes umfassen:

  • CSV: Dieses Modul bietet Klassen zum Lesen und Schreiben von Tabellendaten im CSV-Format. Damit können Programmierer auf einfache Weise Daten in das von Excel bevorzugte Format schreiben oder Daten aus von Excel erzeugten Dateien lesen, ohne die genauen Details des CSV-Formats zu kennen.
  • Requests: Mit diesem Modul können Sie HTTP-Anfragen mit Python senden.
  • BeautifulSoup4 ist ein leistungsfähiger HTML-Parser, der die benötigten Informationen aus einer HTML-Struktur extrahiert.

Erforderliche Importe:

csv importieren 
Zeitimportieren 
importiere Anfragen
von bs4 importieren BeautifulSoup

Proxy-Einrichtung:

Um Ihre IP privat zu halten und damit die Chancen zu minimieren, dass Ihre IP von bestimmten Websites auf eine schwarze Liste gesetzt wird, wird empfohlen, Web-Scraping-Aktivitäten unter dem Schutz von Proxys durchzuführen. Wie oben erwähnt, werden wir für dieses Tutorial rotierende Proxyscrape Wohn-Proxys verwenden, aber Sie können auch andere Proxys oder gar keine Proxys verwenden.

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

Schritt 2: Suchergebnisse erhalten

Beginnen wir mit der Erläuterung des Suchprozesses, den wir in diesem Lernprogramm verwenden werden. Wir werden die eBay-URL mit dem Stichwort "Laptoptasche" abfragen, wie in dieser Abbildung gezeigt:

Wir werden die abgefragte URL verwenden, um eine Anfrage mit request.get(). Sobald wir eine Antwort erhalten, werden wir den HTML-Inhalt mit BeautifulSoup (bs4) analysieren, um die URL jedes Produkts zu extrahieren. Die folgende Abbildung zeigt, wo sich die einzelnen Produkt-URLs im HTML-Inhalt befinden.

Der Produktlink befindet sich innerhalb einer <div> Element mit dem Klasse s-item__info clearfix. Um diese Links zu extrahieren, verwenden wir BeautifulSoup (bs4) für die Suche nach allen <div> Elemente mit dieser speziellen Klasse. Sobald wir diese Elemente gefunden haben, gehen wir jedes einzelne durch, um Folgendes zu finden <a> Elemente und extrahieren die href Attribut, das die Produkt-URL enthält.

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)

Schritt 3: Extrahieren von Produktinformationen

Einführung in die produkt_information_holen Funktion. Diese Funktion nimmt eine Produkt-URL als Eingabe, sendet eine Anfrage an diese URL und verwendet dann BeautifulSoup (bs4), um die Produktinformationen zu analysieren. spezifische Regeln und Regex-Muster.

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

Schließlich organisieren wir die geparsten Produkteinheiten in einem Wörterbuch, das dann von der Funktion zurückgegeben wird.

Schritt 4: Speichern der Ergebnisse

Es ist nun an der Zeit, diese Ergebnisse in einer CSV-Datei zu speichern, indem man die Python-eigenen csv Bibliothek. Die save_to_csv(produkte) Funktion akzeptiert Produkte als Eingabe, d. h. eine Liste von Wörterbüchern, die die zuvor beschriebenen Produktdaten enthalten. Diese Daten werden dann in einer CSV-Datei gespeichert, die nach dem csv_datei_name Argument, das standardmäßig "products.csv" lautet.

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

Schlussfolgerung

In diesem Tutorial haben wir gezeigt, wie man eBay scrapen kann, indem man ein Python-Skript erstellt, das nach einem Schlüsselwort sucht, Produktdetails extrahiert und die Daten in einer CSV-Datei speichert. Bei diesem Prozess werden wichtige Scraping-Techniken wie der Umgang mit HTML-Elementen, die Verwendung von Proxys zur Wahrung der Anonymität und die Einhaltung ethischer Scraping-Praktiken erläutert. Dieses Skript kann weiter verbessert werden, indem es eine Paginierungsfunktion und die Möglichkeit zur Verarbeitung mehrerer Schlüsselwörter enthält.

Denken Sie immer daran, verantwortungsvoll zu scrapen, die Nutzungsbedingungen der Website einzuhalten und Tools wie die Ratenbegrenzung zu verwenden, um Störungen zu vermeiden. Um Ihre Scraping-Aufgaben zuverlässiger und effizienter zu gestalten, sollten Sie unsere hochwertigen Proxy-Dienste unter ProxyScrape in Betracht ziehen. Ganz gleich, ob Sie Proxys für Privatanwender, Rechenzentren oder mobile Endgeräte benötigen, wir haben das Richtige für Sie. Sehen Sie sich unsere Angebote an, um Ihre Web-Scraping-Projekte auf die nächste Stufe zu heben!

Viel Spaß beim Schaben!