Zurück zum Blog
Anleitungen
Robert SfichiLast updated on Mar 31, 20267 min read

So erstellen Sie einen Web-Scraper mit Python und Selenium

So erstellen Sie einen Web-Scraper mit Python und Selenium

Viele Entwickler entscheiden sich dafür, ihren eigenen Web-Scraper zu entwickeln, anstatt auf vorhandene Produkte zurückzugreifen. Wenn man die meisten von ihnen fragt, welche Programmiersprache sie bevorzugen, wird man höchstwahrscheinlich immer wieder Python als Antwort hören.

Python ist aufgrund seiner flexiblen Syntax und der Fülle an Bibliotheken, die das Web-Scraping vereinfachen, zum Publikumsliebling geworden. Heute werden wir über eine dieser Bibliotheken sprechen.

In diesem Leitfaden erfahren Sie, wie Sie mit Selenium und Python Daten extrahieren können. Wir erstellen ein Python-Skript, das sich bei einer Website anmeldet, Daten scrapt, diese ansprechend formatiert und in einer CSV-Datei speichert.

Wenn du einen allgemeineren Überblick darüber haben möchtest, wie Python beim Web-Scraping eingesetzt werden kann, solltest du dir unseren ultimativen Leitfaden zum Erstellen eines Scrapers mit Python ansehen. Komm dann hierher zurück, damit wir noch tiefer in die Details einsteigen können!

Ein Überblick über Selenium

Wie auf der offiziellen Selenium-Website angegeben, ist Selenium eine Suite von Tools zur Automatisierung von Webbrowsern, die ursprünglich als Tool für browserübergreifende Tests eingeführt wurde.

Die vom Selenium-Team entwickelte API nutzt das WebDriver-Protokoll, um die Kontrolle über einen Webbrowser wie Chrome oder Firefox zu übernehmen und verschiedene Aufgaben auszuführen, wie zum Beispiel:

  • Formulare ausfüllen
  • Scrollen
  • Screenshots erstellen
  • Klicken auf Schaltflächen

Nun fragen Sie sich vielleicht, wie sich das alles auf das Web-Scraping übertragen lässt. Es ist eigentlich ganz einfach.

Die Datenextraktion kann manchmal echt nervig sein. Websites werden heutzutage als Single-Page-Anwendungen erstellt, auch wenn das gar nicht nötig ist. Sie zeigen CAPTCHAs häufiger an als nötig und blockieren sogar die IPs normaler Nutzer.

Kurz gesagt: Die Bot-Erkennung ist eine sehr frustrierende Funktion, die sich wie ein Fehler anfühlt.

Selenium kann in diesen Fällen helfen, indem es JavaScript-Code versteht und ausführt und viele mühsame Prozesse des Web-Scrapings automatisiert, wie das Scrollen durch die Seite, das Abrufen von HTML-Elementen oder das Exportieren der abgerufenen Daten.

Installation

Um die wahre Leistungsfähigkeit von Selenium und Python zu demonstrieren, werden wir einige Informationen aus dem Subreddit /r/learnprogramming scrapen. Neben dem Scrapen von Daten zeige ich euch auch, wie eine Anmeldung implementiert werden kann. Nachdem wir nun ein Verständnis für das Hauptwerkzeug und die Website haben, die wir verwenden werden, schauen wir uns an, welche weiteren Voraussetzungen wir installieren müssen:

1. Python. Wir werden Python 3.0 verwenden. Sie können jedoch auch Python 2.0 nutzen, indem Sie geringfügige Anpassungen vornehmen. Sie können es hier herunterladen und installieren.

2. Selenium-Paket. Sie können das Selenium-Paket mit dem folgenden Befehl installieren:

pip3 install selenium

3. Pandas-Paket. Es wird zum Extrahieren und Speichern der gescrapten Daten in einer CSV-Datei verwendet. Führen Sie bitte den folgenden Befehl aus, um es auf Ihrem Gerät zu installieren.

pip3 install pandas

4. BeautifulSoup-Paket. Wird zum Parsen von HTML- und XML-Dokumenten verwendet. Führen Sie einfach diese Zeile aus:

pip3 install beautifulsoup

5. Google Chrome. Unter diesem Link finden Sie weitere Informationen zum Herunterladen und zur Installation.

6. Chrome-Treiber. Er hilft uns bei der Konfiguration des Web-Treibers für Selenium. Bitte folgen Sie diesem Link, um die neueste Version von Chrome-Treiber herunterzuladen und zu installieren. Vergessen Sie nicht, den Pfad zu speichern, in dem Sie es installiert haben.

Den Browser starten

Lassen Sie uns loslegen. Erstellen Sie eine neue Datei „scraper.py“ und importieren Sie das Selenium-Paket, indem Sie die folgende Zeile kopieren:

from selenium import webdriver

Wir erstellen nun eine neue Instanz von Google Chrome, indem wir Folgendes schreiben:

driver = webdriver.Chrome(LOCATION)

Ersetzen Sie LOCATION durch den Pfad, unter dem sich der Chrome-Treiber auf Ihrem Computer befindet. Bitte überprüfen Sie die Selenium-Dokumentation, um den korrekten Pfad für den Web-Treiber entsprechend Ihrem Betriebssystem zu finden.

Der letzte Schritt ist der Aufruf der Website, von der wir Daten scrapen möchten. In unserem Fall ist dies https://www.reddit.com/r/learnprogramming/top/?t=month. Kopieren Sie die folgende Zeile in die neu erstellte Python-Datei:

driver.get("https://www.reddit.com/r/learnprogramming/top/?t=month")

Führen Sie dazu den folgenden Befehl in einem Terminalfenster aus:

python3 scraper.py

sollte nun eine neue Instanz von Google Chrome geöffnet sein, die oben auf der Seite anzeigt: „Chrome wird von automatisierter Testsoftware gesteuert“.

Spezifische Daten finden

Wie du wahrscheinlich bereits erraten hast, werden wir in diesem Tutorial den Subreddit /r/learnprogramming scrapen. Wir werden den Titel, den Autor und die Anzahl der Upvotes der Beiträge speichern und in einer neuen CSV-Datei ablegen. Schauen wir uns an, wo sich diese Angaben auf der HTML-Seite befinden und wie wir sie extrahieren können.

Nachdem Google Chrome die Seite endlich geladen hat, klicken wir mit der rechten Maustaste auf einen beliebigen Beitrag und wählen „Untersuchen“. Wir finden den HTML-Container des Beitrags unter dem Klassennamen _1oQyIsiPHYt6nx7VOmd1sz.

Sie können Google Chrome auch ohne grafische Benutzeroberfläche ausführen und den HTML-Inhalt der Seite protokollieren, indem Sie ein paar Zeilen Code hinzufügen. Wir setzen die Option „headless“ für den Chrome-Treiber auf „true“ (um die grafische Oberfläche zu entfernen) und eine Fenstergröße von 1080 Pixeln (um den richtigen HTML-Code für unseren Anwendungsfall zu erhalten).

Die letzten beiden Codezeilen beenden Chrome unmittelbar nach Abschluss der Protokollierung des HTML-Codes der Seite.

Die neue Datei „scraper.py“ sieht wie folgt aus:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.headless = True
options.add_argument("--window-size=1920,1080")

driver = webdriver.Chrome("./chromedriver")
driver.get("https://www.reddit.com/r/learnprogramming/top/?t=month")

print(driver.page_source)
driver.quit()

WebElement

Ein WebElement ist ein Selenium-Objekt, das ein HTML-Element darstellt. Wie Sie im folgenden Tutorial sehen werden, können wir viele Aktionen mit diesen Elementen durchführen. Einige davon sind:

  • Darauf klicken mithilfe der Methode .click()
  • Eingabe von Text in ein bestimmtes Eingabeelement durch Aufruf der Methode .send_keys()
  • Lesen des Textes eines Elements mithilfe von element.text
  • Überprüfen, ob ein Element auf der Seite angezeigt wird, durch Aufruf von .is_displayed()

Ein Beispiel für Selenium in Aktion

Nachdem wir unser Projekt nun eingerichtet haben, können wir endlich mit dem Scraping beginnen.

Anmelden

Wir werden die Leistungsfähigkeit von Selenium demonstrieren, indem wir uns bei unserem Reddit-Konto anmelden und die zuvor vorgestellten Daten scrapen. Beginnen wir damit, Selenium dazu zu bringen, auf den Anmeldebutton oben auf der Seite zu klicken. Nach der Überprüfung des HTML-Codes der Seite sehen wir, dass der Klassenname des Anmeldebuttons _2tU8R9NTqhvBrhoNAXWWcP lautet.

login_button = driver.find_element_by_class_name('_2tU8R9NTqhvBrhoNAXWWcP')
login_button.click()

Dadurch öffnet sich das Anmeldefenster, in dem wir die Eingabefelder für Benutzername und Passwort sehen, die wir ausfüllen müssen. Fahren wir mit den folgenden Zeilen fort:

driver.switch_to_frame(driver.find_element_by_class_name('_25r3t_lrPF3M6zD2YkWvZU'))

driver.find_element_by_id("loginUsername").send_keys('USERNAME')
driver.find_element_by_id("loginPassword").send_keys('PASSWORD')

driver.find_element_by_xpath("//button[@type='submit']").click()

Wenn wir das Modal-Element untersuchen, sehen wir, dass sein Container ein Iframe ist. Deshalb müssen wir im ersten Teil des Codes auf „frame“ umschalten, da die Auswahl der Eingabefelder ohne diese Angabe zu einem Fehler führt.

Als Nächstes rufen wir die Eingabefelder ab und geben die richtigen Anmeldedaten ein, bevor wir auf die Schaltfläche „Absenden“ klicken. Dadurch gelangen wir zurück zur Seite /r/learnprogramming, sind nun aber angemeldet und bereit, Upvotes zu vergeben!

Einen Screenshot erstellen

Das Erstellen eines Screenshots mit Selenium und Python ist ziemlich einfach. Sie müssen lediglich den folgenden Befehl in die Datei „scraper.py“ schreiben, nachdem Sie den Web-Treiber deklariert haben.

driver.save_screenshot('screenshot.png')

Es ist nützlich zu wissen, dass du die Fenstergröße von Google Chrome festlegen kannst, indem du die folgenden Codezeilen hinzufügst:

from selenium.webdriver.chrome.options import Options
options = Options()
options.add_argument("--window-size=1920,1080")

So sieht der Screenshot in unserem Fall aus:

Daten extrahieren

Wie bereits erwähnt, müssen wir den Titel, den Autor und die Anzahl der Upvotes der Beiträge abrufen. Beginnen wir damit, die Pakete BeautifulSoup und Pandas zu importieren und drei leere Arrays für jede Art von Information zu erstellen, die wir benötigen.

from bs4 import BeautifulSoup
import pandas as pd

titles = []
upvotes=[]
authors = []

Wir werden BeautifulSoup verwenden, um das HTML-Dokument zu parsen, indem wir die folgenden Zeilen schreiben:

content = driver.page_source
soup = BeautifulSoup(content, features="html.parser")

Nachdem wir das HTML-Dokument erfolgreich analysiert und die richtigen Selektoren ausgewählt haben, holen wir nun die Titel, Upvotes und Autoren ab und weisen sie dem richtigen Array zu:

for element in soup.findAll('div', attrs={'class': '_1oQyIsiPHYt6nx7VOmd1sz'}):
   title = element.find('h3', attrs={'class': '_eYtD2XCVieq6emjKBH3m'})
   upvote = element.find('div', attrs={'class': '_3a2ZHWaih05DgAOtvu6cIo'})
   author = element.find('a', attrs={'class': '_23wugcdiaj44hdfugIAlnX'})
   titles.append(title.text)
   upvotes.append(upvote.text)
   authors.append(author.text)

Schließlich speichern wir die Informationen mithilfe des zuvor importierten Pandas-Pakets in einer CSV-Datei.

df = pd.DataFrame({'Post title': titles, 'Author': authors, 'Number of upvotes': upvotes})
df.to_csv('posts.csv', index=False, encoding='utf-8')

Das war’s! Werfen wir einen Blick auf die exportierte Datei:

Sie scheint alle Informationen zu enthalten, die wir benötigen.

Bonus-Tipp: Manchmal benötigen wir mehr Daten, als die Website beim ersten Laden bereitstellt. Meistens wird das Abrufen der Daten ausgelöst, wenn der Benutzer nach unten scrollt. Wenn Sie nach unten scrollen müssen, um weitere Daten zu erhalten, können Sie die Methode .execute_script() wie folgt verwenden:

scrollDown = "window.scrollBy(0,2000);"
driver.execute_script(scrollDown)

Abschließende Gedanken

Ich hoffe, euch hat das Erstellen des Web-Scrapers genauso viel Spaß gemacht wie mir. Programmieren macht nicht immer Spaß, aber das Erstellen kleiner Skripte wie dieses erinnert mich an meine Anfänge und macht den Prozess viel unterhaltsamer.

Dennoch kann das Skript, das wir in diesem Tutorial erstellt haben, keine besonders anspruchsvollen Aufgaben bewältigen. Es fehlen einige wesentliche Funktionen, die das Web-Scraping erst wirklich reibungslos machen. Die Verbindung über mobile oder private Proxys und das Lösen von CAPTCHAs sind nur zwei davon.

Wenn du nach einer professionelleren Methode zur Datenextraktion suchst, schau dir an, was WebScrapingAPI leisten kann, und überzeuge dich selbst, ob es das Richtige für dich ist. Es gibt ein kostenloses Paket, sodass die einzige Investition 30 Minuten deiner Zeit sind.

Vielen Dank, dass Sie sich die Zeit genommen haben, dies zu lesen. Viel Spaß beim Scraping!

Über den Autor
Robert Sfichi, Full-Stack-Entwickler @ WebScrapingAPI
Robert SfichiFull-Stack-Entwickler

Robert Sfichi ist Teammitglied bei WebScrapingAPI, wo er an der Produktentwicklung mitwirkt und dabei hilft, zuverlässige Lösungen zu entwickeln, die die Plattform und ihre Nutzer unterstützen.

Los geht’s

Sind Sie bereit, Ihre Datenerfassung zu erweitern?

Schließen Sie sich den über 2.000 Unternehmen an, die WebScrapingAPI nutzen, um Webdaten im Unternehmensmaßstab ohne zusätzlichen Infrastrukturaufwand zu extrahieren.