Heim BlogWeb-Scraping Eine umfassende Anleitung zum Web Scraping mit Selenium WebDriver in Python

Eine umfassende Anleitung zum Web Scraping mit Selenium WebDriver in Python

von Kadek

Python ist eine der am häufigsten verwendeten Sprachen zum Schreiben von Web-Scrapern. Es gibt viele Bibliotheken, Frameworks und Dienstprogramme dafür, von einfachen wie der Requests-Bibliothek oder PycURL bis hin zu funktionsreicheren und fortgeschritteneren wie Selenium oder Puppeteer.

Allerdings ist Selenium nach Requests die zweitbeliebteste Bibliothek, mit der Sie statische Webseiten und dynamische Webseiteninhalte durchsuchen können. Sie können die empfangenen Daten bequem speichern, inklusive einer CSV-Datei.

Erste Schritte mit Selenium WebDriver

Um Website-Daten mit Selenium zu extrahieren, benötigen Sie drei Dinge: Python, Selenium, einen Webtreiber und einen Browser. In diesem Tutorial verwenden wir Python 3.11. Wenn Sie es nicht haben oder Python 2 verwenden, müssen Sie die neueste Version des Python-Interpreters herunterladen. Um Selenium zu installieren, verwenden Sie einfach pip in der Eingabeaufforderung:

pip install selenium

Selenium unterstützt fast alle gängigen Browser. Um sie nutzen zu können, benötigen Sie den entsprechenden Webtreiber, der zur Version des installierten Browsers passen muss. Die am häufigsten verwendeten Webbrowser sind Chrome, Firefox und Edge.

Alternativ können Sie den WebDriver mit dem Web-Treiber-Manager installieren. Der erforderliche WebDriver wird automatisch heruntergeladen und installiert. Sie können den Webdriver Manager als reguläre Python-Bibliothek installieren und darauf zugreifen:

pip install webdriver-manager

Dies ist die einfachste Option zur Automatisierung von Webbrowsern, sodass Sie sich keine Gedanken über den Versionsabgleich und die Suche nach dem richtigen Webtreiber machen müssen.

Interaktion mit Webseiten

Wir werden in diesem Beispiel den Chromium WebDriver verwenden, da er am beliebtesten ist. Für dieses Beispiel laden wir die erforderliche Version manuell herunter und legen sie auf Laufwerk C ab. Wie bereits erwähnt, können Sie stattdessen auch die Webdriver-Manager-Bibliothek verwenden, um mit Selenium zu arbeiten.

Bevor wir alle Funktionen von Selenium erkunden, starten wir einfach ein Browserfenster. Dazu müssen wir lediglich die Bibliothek in das Skript importieren, den Pfad zur Webtreiberdatei angeben und den Startbefehl ausführen:

from selenium import webdriver
DRIVER_PATH = 'C:\chromedriver.exe' #or any other path of webdriver
driver = webdriver.Chrome(executable_path=DRIVER_PATH)

Wenn alles korrekt ist, sehen Sie das Chrome-Fenster:


Chrome WebDriver
Chrome WebDriver

Anschließend können Sie zur gewünschten Seite navigieren oder die erforderlichen Aktionen durchführen.

driver.get('https://example.com/')

Als Ergebnis sehen Sie etwa Folgendes:


Seite abrufen
Seite mit WebDriver abrufen

Selbstverständlich können Sie sich auch den HTML-Code der gesamten Seite zur weiteren Bearbeitung holen oder am Bildschirm ausdrucken:

print(driver.page_source)

Um die Browsersitzung mit allen Registerkarten zu schließen und die Skriptausführung abzuschließen, verwenden Sie diese Methode:

driver.quit()

Selenium ist ein leistungsstarkes Tool, das für eine Vielzahl von Zwecken verwendet werden kann, einschließlich Web Scraping. Es ist einfach zu erlernen und zu verwenden und unterstützt sowohl XPath- als auch CSS-Selektoren, was es sehr flexibel macht.

Passen Sie die Windows-Größe an

Selenium bietet eine Reihe von Eigenschaften und Methoden zur Steuerung eines Browserfensters. Mit diesen können Sie die Größe, Position und den Vollbildstatus des Fensters ändern. Sie können beispielsweise die Methode set_window_size() verwenden, um die Größe des Fensters zu ändern. Diese Methode benötigt zwei Argumente: die Breite und Höhe des Fensters.

driver.set_window_size(800, 600)

Um das Fenster zu maximieren, können Sie die Methode maxim_window() verwenden.

driver.maximize_window()

Um das Fenster zu minimieren, können Sie die Methode minim_window() verwenden.

driver.minimize_window()

Sie können die Methode set_window_position() verwenden, um das Fenster zu positionieren. Diese Methode benötigt zwei Argumente: die x- und y-Koordinaten des Fensters.

driver.set_window_position(100, 100)

Mit der Methode fullscreen_window() können Sie das Fenster in den Vollbildmodus versetzen.

driver.fullscreen_window()

Wenn Sie die Größe des aktuellen Fensters ermitteln und nicht ändern möchten, können Sie die folgende Methode verwenden:

driver.get_window_size()

Die spezifischen Einstellungen, die Sie verwenden, hängen von Ihren Anforderungen ab. Mit diesen Methoden können Sie das Verhalten des Browserfensters nach Bedarf steuern.

Chrome Headless-Modus

Ein Headless Browser ist ein Webbrowser ohne grafische Benutzeroberfläche (GUI), der über eine Befehlszeilenschnittstelle gesteuert wird.

In der Regel wird dieser Ansatz verwendet, damit das geöffnete Browserfenster den Scraping-Vorgang nicht stört und keine PC-Ressourcen verschwendet. Im Headless-Modus entfernt der Browser alle GUI-Elemente und lässt ihn unbeaufsichtigt im Hintergrund laufen, was den Ressourcenverbrauch um mehr als das Zehnfache reduziert.

Um den Headless-Modus zu verwenden, fügen Sie einfach Folgendes hinzu:

options = driver.ChromeOptions() 
options.headless = True 

Danach wird das Browserfenster nicht geöffnet und die Daten werden im Hintergrund gescrapt.

So finden Sie Webseitenelemente

Um den Inhalt eines Elements oder mehrerer Elemente zu erhalten, müssen Sie es zunächst identifizieren. Selenium bietet eine Vielzahl von Locators, die Ihnen dabei helfen. Die gebräuchlichste Methode ist die Verwendung von CSS-Selektoren:

element = driver.find_element_by_css_selector("#price")

Sie können auch XPath verwenden:

element = driver.find_element_by_xpath("/html/body/div/p")

Darüber hinaus unterstützt Selenium andere beliebte Locators wie Tags, IDs und Elementnamen:

element = driver.find_element_by_name("element_name")
element = driver.find_element_by_id("element_id")
elements = driver.find_elements_by_tag_name("a")

Wenn Sie mit Links arbeiten müssen, verfügen diese über separate Locators. Mit dieser Methode können Sie Ankerelemente anhand ihres Linktextes finden:

element = driver.find_element_by_link_text("Link Text")

Oder per teilweisem Linktext:

element = driver.find_element_by_partial_link_text("Partial Link")

Um alle Links von einer Seite zu entfernen, können Sie eine Kombination aus den Elementortungsmethoden von Selenium und einer Schleife verwenden, um alle Links auf der Seite zu durchlaufen:

all_links = driver.find_elements_by_tag_name("a")

for link in all_links:
    print(link.get_attribute("href")) 

Wie Sie sehen, unterstützt Selenium genügend Locators, um jedes Element an einer beliebigen Stelle auf einer Seite zu finden. Sie können auch mehrere Locators verwenden, um ein Element zu finden, indem Sie beispielsweise die übergeordneten und untergeordneten Elemente innerhalb dieses übergeordneten Elements suchen.

Warten darauf, dass ein Element vorhanden ist

Das Warten darauf, dass ein Element vorhanden ist, ist ein entscheidendes Konzept bei der Webautomatisierung mit Selenium. Webseiten sind oft dynamisch und Elemente erscheinen möglicherweise erst nach einiger Zeit. Sie müssen Wartestrategien implementieren, um sicherzustellen, dass Ihre Automatisierungsskripte zuverlässig funktionieren.

Wenn Sie mit Selenium arbeiten, haben Sie zwei Möglichkeiten: Warten Sie, bis die Seite eine bestimmte Zeit lang geladen ist, oder bis ein bestimmtes Element geladen ist. Welche Option für Sie die richtige ist, hängt von den Zielen Ihres Projekts und der spezifischen Website ab, die Sie durchsuchen. Um eine bestimmte Zeitspanne abzuwarten, können Sie die folgende Funktion verwenden:

driver.implicitly_wait(10)

Sie können einen anderen Ansatz verwenden, um darauf zu warten, dass ein bestimmtes Element auf einer Seite geladen wird. Importieren Sie zunächst zusätzliche Module:

from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By

Fügen Sie dann alle 10 Sekunden eine Überprüfung hinzu, um zu sehen, ob das benötigte Element geladen ist:

wait = WebDriverWait(driver, 10)
element = wait.until(EC.presence_of_element_located((By.ID, "element_id")))

Wenn das Element innerhalb dieser Zeit gefunden wird, wird es der Elementvariablen zugewiesen und Ihr Python-Projekt kann fortgesetzt werden. Explizite Wartevorgänge sind spezifischer und können für bestimmte Bedingungen verwendet werden, beispielsweise dafür, dass ein Element sichtbar oder anklickbar ist.

Scraping-Herausforderungen meistern

Schaben kann eine Herausforderung sein, aber Selen kann Ihnen helfen, einige Hindernisse zu überwinden. Mithilfe eines Headless-Browsers kann Selenium das Verhalten eines echten Benutzers nachahmen. Schauen wir uns also einige der häufigsten Herausforderungen beim Web Scraping an und wie die Selenium-Bibliothek Ihnen bei der Bewältigung dieser Herausforderungen helfen kann.

Umgehen Sie den Anti-Scraping-Schutz in Python mit Selenium Web Scraping

Das Umgehen des Anti-Scraping-Schutzes mit Selenium in Python kann eine komplexe Aufgabe sein. Websites nutzen verschiedene Mechanismen, um Scraper automatisch zu verfolgen und zu fangen. Um dies zu vermeiden, müssen Sie daher einen umfassenden Ansatz verfolgen und das Verhalten des Scrapers so weit wie möglich verbergen, sodass es wie das Verhalten einer natürlichen Person aussieht.

Erstens überprüfen Websites häufig die Zeichenfolge des Benutzeragenten in den HTTP-Anforderungsheadern, um automatisierte Bots zu identifizieren. Sie können einen benutzerdefinierten Benutzeragenten so einrichten, dass er einen echten Browser nachahmt und die Wahrscheinlichkeit einer Erkennung verringert. Zum Beispiel:

options = webdriver.ChromeOptions()
options.add_argument("user-agent=Mozilla/5.0 (X11; CrOS x86_64 8172.45.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.64 Safari/537.36")
driver = webdriver.Chrome(options=options)

Außerdem können Sie Verzögerungen zwischen Anfragen implementieren, um menschliches Verhalten nachzuahmen. Mit time.sleep() können Sie die Ausführung für eine bestimmte Dauer anhalten. Dies kann dazu beitragen, die Auslösung von Mechanismen zur Ratenbegrenzung auf der Zielwebsite zu vermeiden.

import time

time.sleep(2)

Um das Verhalten des Scrapers menschlicher zu gestalten, können Sie die Sitzungskonsistenz aufrechterhalten, indem Sie Cookies und Sitzungen effektiv verwalten. Speichern und verwenden Sie Cookies wieder, um ständige Anmeldungen zu vermeiden und Sitzungsinformationen zwischen Anfragen beizubehalten.

Verwendung eines Proxys mit Selenium Wire

Aus mehreren Gründen ist es wichtig, beim Scraping von Webseiten einen Proxy zu verwenden:

  1. Es besteht die Möglichkeit, die Begrenzung der Anzahl der Anfragen an die Website zu überwinden.
  2. Aufgrund der Anzahl der Anfragen wird der Scraper als DDoS-Angriff gewertet.
  3. Das Fehlen eines Proxys verringert die Sicherheit und Privatsphäre von Online-Aktivitäten.

Leider bietet Selenium nur begrenzte Proxy-Unterstützung. Als Treiberoption können Sie einen Proxy ohne Authentifizierung hinzufügen.

proxy = "12.345.67.890:1234" 
options.add_argument("--proxy-server=%s" % proxy)

Für mehr Komfort unterstützt Selenium jedoch die Verwendung eines Proxyservers und eines Proxys mit Authentifizierung. Dazu müssen Sie ein zusätzliches Selenium-Paket installieren:

pip install selenium-wire

Danach kann man eine Funktion mit Authentifizierung verwenden:

options = {
    "proxy": {
        "http": f"http://{proxy_username}:{proxy_password}@{proxy_url}:{proxy_port}",
        "verify_ssl": False,
    },
}

In diesem Artikel wird nicht erläutert, wo kostenlose oder kostenpflichtige Proxy-Anbieter zu finden sind, was Proxys sind und wie man sie mit Python verwendet. Alle diese Informationen finden Sie jedoch in unseren anderen Artikeln.

Fortgeschrittene Techniken

Selenium ist ein Framework, das ursprünglich zum Testen entwickelt wurde. Dadurch verfügt sie über einen größeren Funktionsumfang als eine typische Scraping-Bibliothek. Hier sind einige Tipps zur Verbesserung der Funktionalität eines Schabers mit Selen.

So klicken Sie auf Elemente

Das Klicken auf Elemente ist eine grundlegende Interaktion in der Webautomatisierung mit Selenium. Mit Selenium können Sie verschiedene Webseitenelemente suchen und darauf klicken, darunter Links, Schaltflächen, Kontrollkästchen und mehr.

Wenn Sie auf einer Webseite auf einen bestimmten Link (Ankerelement) klicken möchten, können Sie Selenium verwenden, um den Link zu finden, und dann die Methode click() verwenden, um mit ihm zu interagieren:

link = driver.find_element_by_xpath("//a(@href)")
link.click()

Sie können diese Methode auch verwenden, um mit verschiedenen Arten von Webseitenelementen zu interagieren, einschließlich Schaltflächen, Optionsfeldern, Kontrollkästchen und mehr:

button = driver.find_element_by_id("button_id")
button.click()

radio_button = driver.find_element_by_name("radio_button_name")
radio_button.click()

Sie können Elementklicks verwenden, um Formulare einzureichen, Daten zu senden oder durch mehrstufige Prozesse zu navigieren. Durch die Möglichkeit, auf Elemente zu klicken, können Sie Benutzerinteraktionen simulieren, was es ideal für Web-Scraping-Aufgaben macht.

Ausfüllen von Formularen mit Selenium Web Driver

Fast jede Website verfügt über Formulare, sei es ein Filter oder ein Authentifizierungsformular. Ein Webformular enthält Eingabefelder, Kontrollkästchen, Optionsfelder, Suchformulare, Links, Dropdown-Menüs und Senden-Schaltflächen zum Sammeln von Benutzerdaten.

Um Daten aus dem Formular zu empfangen und zurück zu übertragen, muss man zunächst das Formular finden und dann Text eingeben oder den vorgeschlagenen Wert auswählen.

Eingabefeld

Die gebräuchlichste Form ist das Eingabefeld. Ein Eingabefeld ist ein Textfeld, das vom Benutzer eingegebene Daten speichert. Um damit arbeiten zu können, muss man verstehen, wie Informationen eingegeben (send_keys()-Methode), entfernt (clear()-Methode) und Eingabetext abgerufen werden (get_attribute()-Methode). Zum Beispiel:

driver.find_element_by_id('here_id_name').send_keys("Test")
driver.find_element_by_id('here_id_name').clear()
nameTest = driver.find_element_by_id('here_id_name').get_attribute("value")

Kontrollkästchen

Ein Kontrollkästchen ist ein kleines Kästchen, in dem zwei Optionen zur Verfügung stehen: entweder aktivieren oder deaktivieren. Bevor man jedoch ein Kontrollkästchen auswählt, muss man seinen aktuellen Status kennen, da eine zweite Auswahl ihn in das Gegenteil ändert.

Für eine solche Prüfung können Sie eine boolesche Variable (0 oder 1, True oder False usw.) verwenden. Dies gibt „True“ aus, wenn das Kontrollkästchen bereits aktiviert ist, oder „False“, wenn nicht:

acc_boolean = driver.find_element_by_id('acception').is_selected()
print(type(acc_boolean))

Um auf die Schaltfläche auf der Website oder das Kontrollkästchen zu klicken, verwenden Sie einfach Folgendes:

driver.find_element_by_id('acception').click()

Um ein Formular mit Selenium zu senden, rufen Sie einfach die Methode „submit()“ für das Formularelement anstelle von „click()“ auf.

Laden Sie Dateien mit Selenium herunter

Mit Selenium können Sie den Vorgang des Klickens auf Download-Links oder -Schaltflächen, die Angabe des Download-Speicherorts und die Verwaltung der heruntergeladenen Dateien automatisieren.

Um eine Datei herunterzuladen, identifizieren Sie einfach das Element, das den Download-Link enthält, und klicken Sie darauf, wie in den vorherigen Beispielen. Sie können jedoch optional das Verzeichnis angeben, in dem die Dateien gespeichert werden, bevor Sie auf Folgendes klicken:

options.add_experimental_option("prefs", {
    "download.default_directory": "/path/to/download/directory"
})

Um sicherzustellen, dass der Download abgeschlossen ist, bevor Sie fortfahren, können Sie eine Wartezeit einführen, z. B. eine implizite oder explizite Wartezeit, oder den Download-Ordner auf den Abschluss der Dateiübertragung überwachen.

Interagieren Sie mit Tabs

Sie können Selenium verwenden, um einen neuen Tab oder ein neues Fenster zu öffnen und zu einer anderen URL zu navigieren. Dies wird normalerweise dadurch erreicht, dass Tastaturkürzel wie Strg+T für eine neue Registerkarte simuliert werden und dann zur neuen Registerkarte gewechselt wird:

driver.find_element_by_tag_name('body').send_keys(Keys.CONTROL + 't')
driver.switch_to.window(driver.window_handles(1))

Um die aktive Registerkarte zu schließen, ohne den Browser zu schließen, verwenden Sie diese Methode:

driver.close()

Dadurch wird die aktuelle Registerkarte nur geschlossen, wenn andere Registerkarten geöffnet sind. Wenn der aktuelle Tab der einzige ist, wird der Browser ebenfalls geschlossen.

So führen Sie JavaScript mit Selenium in Python aus

Das Ausführen von JavaScript mit Selenium in Python ist eine leistungsstarke Funktion, mit der Sie benutzerdefinierten JavaScript-Code im Kontext einer Webseite ausführen können. Dies kann unglaublich nützlich sein, wenn Sie mit Webelementen interagieren, das DOM ändern oder komplexe Szenarien verarbeiten, die mit Standard-Selenium-Befehlen nicht erreicht werden können.

Sie können JavaScript-Code in Selenium mit der Methodeexecute_script() ausführen, die von der WebDriver-Instanz bereitgestellt wird (normalerweise einer Browserinstanz zugeordnet). Zum Beispiel:

result = driver.execute_script("return 2 + 2")

Sie können JavaScript verwenden, um mit Elementen zu interagieren, auf die über reguläre Selenium-Befehle nicht sofort zugegriffen werden kann. Sie können beispielsweise die CSS-Eigenschaften eines Elements ändern, um es sichtbar zu machen.

Blockieren von Bildern und JavaScript

Das Blockieren von Bildern und JavaScript kann hilfreich sein, um die Web-Scraping-Leistung von Selenium zu verbessern. Wenn Sie mit Selenium zu Scraping-Zwecken auf eine Website zugreifen, müssen Sie möglicherweise nicht alle Ressourcen wie Bilder und JavaScript laden und rendern, da diese Elemente den Prozess erheblich verlangsamen können.

Bilder gehören zu den ressourcenintensivsten Elementen auf Webseiten. Beim Scrapen von Daten, insbesondere textbasierten Daten, können Sie das Laden von Bildern deaktivieren, um den Vorgang zu beschleunigen. In Selenium können Sie den Chrome WebDriver so konfigurieren, dass Bilder deaktiviert werden:

options.add_argument("--disable-images")

Durch das Deaktivieren von Bildern kann die Ladezeit von Webseiten erheblich verkürzt werden. Um JavaScript zu deaktivieren, können Sie auch die Optionen verwenden:

options.add_argument("--disable-javascript")

Dieser Ansatz ist extremer und eignet sich möglicherweise nur für einige Websites, da viele für die Kernfunktionalität auf JavaScript angewiesen sind.

Scrollen Sie auf der Seite nach unten

Sie können Selenium verwenden, um das Herunterscrollen einer Webseite zu simulieren. Dies ist besonders nützlich, wenn Sie auf Inhalte zugreifen müssen, die nur beim Scrollen sichtbar werden. Der einfachste Weg, in Selenium nach unten zu scrollen, ist die Verwendung von JavaScrip:

driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")

Alternativ können Sie das Scrollen simulieren, indem Sie die „END“-Taste an das Body-Element senden. Wenn Sie mit unendlichem Scrollen umgehen möchten, können Sie eine Schleife verwenden, um so lange zu scrollen und Daten zu sammeln, bis kein Inhalt mehr geladen wird:

while(1):
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")
    # Save or proccess your data here

Bedenken Sie, dass die spezifische Implementierung des Scrollens je nach Struktur und Verhalten der Website variieren kann. Daher müssen Sie möglicherweise Ihren Code entsprechend anpassen.

Screenshots machen

Das programmgesteuerte Erstellen von Screenshots von Webseiten mit Selenium und der Programmiersprache Python ist eine hilfreiche Funktion zum Web-Scraping, Testen und Überwachen. Mit Selenium können Sie Screenshots der gesamten Webseite oder bestimmter Elemente innerhalb einer Seite erfassen.

Mit diesem Befehl können Sie einen Screenshot der gesamten Webseite erstellen, einschließlich der Inhalte, die möglicherweise einen Bildlauf erfordern:

driver.save_screenshot("page.png")

Sie können auch einen Screenshot eines bestimmten Elements auf einer Webseite anhand seiner Position und Größe erstellen. Um beispielsweise einen Screenshot einer Schaltfläche mit einem bestimmten CSS-Selektor aufzunehmen:

element = driver.find_element_by_css_selector("#button")
element.screenshot("element_screenshot.png")

Sie können Screenshots in verschiedenen Dateiformaten wie PNG, JPEG und BMP speichern, indem Sie beim Aufruf der Methode save_screenshot() die gewünschte Dateierweiterung angeben. Sie können Selenium also verwenden, um Screenshots für Ihre Scraping- und Überwachungsaufgaben zu erstellen.

Fazit und Erkenntnisse

Selenium ist ein beliebtes und leistungsstarkes Python-Framework für Web Scraping. Es kann verwendet werden, um Daten von Webseiten zu extrahieren und Aktionen auf ihnen auszuführen, wie zum Beispiel das Anmelden oder das Navigieren zwischen Seiten. Selenium ist im Vergleich zu anderen Scraping-Frameworks wie Puppeteer auch relativ einfach zu erlernen und zu verwenden.

Selenium eignet sich besonders gut für den Umgang mit dynamisch geladenen Inhalten auf Webseiten. Im Gegensatz zu anderen Bibliotheken, die möglicherweise Schwierigkeiten haben, Daten zu extrahieren, die erst nach Benutzerinteraktionen oder AJAX-Anfragen angezeigt werden, kann sich Selenium in diesem Terrain problemlos zurechtfinden. Diese Funktion ist für moderne, datenreiche Websites wertvoll, die zum Laden von Informationen auf JavaScript angewiesen sind.

Selenium ist ein leistungsstarkes Tool für Web Scraping und Automatisierung. Es kann dynamische Daten verarbeiten, menschliche Interaktionen emulieren und Webaktionen automatisieren, was es zur ersten Wahl für Entwickler und Datenexperten macht.

Related Posts

Hinterlasse einen Kommentar