Wie man einen Web Scraper mit Python und Selenium erstellt

Robert Sfichi am 06. Juli 2021

Viele Entwickler ziehen es vor, ihre eigenen Web Scraper zu entwickeln, anstatt verfügbare Produkte zu verwenden. Wenn Sie die meisten von ihnen fragen, welche Programmiersprache sie bevorzugen, werden Sie höchstwahrscheinlich eine ganze Reihe von Python hören.

Python hat sich aufgrund seiner freizügigen Syntax und der zahlreichen Bibliotheken, die das Web Scraping vereinfachen, zum Publikumsliebling entwickelt. Heute werden wir über eine dieser Bibliotheken sprechen.

In diesem Leitfaden wird beschrieben, wie man mit Selenium und Python Daten extrahieren kann. Wir werden ein Python-Skript erstellen, das sich bei einer Website anmeldet, einige Daten ausliest, sie ansprechend formatiert und in einer CSV-Datei speichert.

Wenn Sie einen allgemeineren Überblick darüber haben möchten, wie Python für Web Scraping verwendet werden kann, sollten Sie sich unseren ultimativen Leitfaden zum Erstellen eines Scrapers mit Python ansehen. Kommen Sie dann hierher zurück, damit wir noch mehr ins Detail gehen können!

Ein Überblick über Selen

Wie auf der offiziellen Selenium-Website zu lesen ist, handelt es sich bei Selenium um eine Reihe von Tools zur Automatisierung von Webbrowsern, die zunächst als Tool für Cross-Browser-Tests eingeführt wurde.

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

  • Ausfüllen von Formularen
  • Bildlauf
  • Bildschirmfotos aufnehmen
  • Anklicken von Schaltflächen

Jetzt fragen Sie sich vielleicht, wie das alles mit Web Scraping zusammenhängt. Das ist eigentlich ganz einfach.

Die Datenextraktion kann manchmal ein echtes Ärgernis sein. Websites werden heutzutage als einseitige Anwendungen erstellt, auch wenn es dafür keinen Grund gibt. Sie zeigen CAPTCHAs häufiger als nötig und blockieren sogar die IPs von normalen Nutzern.

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 Scraping automatisiert, wie z. B. das Scrollen durch die Seite, das Erfassen von HTML-Elementen oder das Exportieren der abgerufenen Daten.

Einrichtung

Um die wahre Stärke von Selenium und Python zu zeigen, werden wir einige Informationen aus dem /r/learnprogramming subreddit abrufen. Neben dem Scrapen von Daten werde ich Ihnen auch zeigen, wie die Anmeldung implementiert werden kann. Nun, da wir das primäre Tool und die Website, die wir verwenden werden, kennen, sehen wir uns an, welche anderen Voraussetzungen wir installieren müssen:

1. Python. Wir werden Python 3.0 verwenden. Sie können jedoch auch Python 2.0 verwenden, indem Sie leichte Anpassungen vornehmen. Sie können es von hier herunterladen und installieren.

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

pip3 installieren selenium

3. Pandas-Paket. Es wird zum Extrahieren und Speichern der gesammelten Daten in einer .csv-Datei verwendet. Bitte führen Sie 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 Installieren des Programms.

6. Chrome-Treiber. Er wird uns helfen, den Web-Treiber für Selenium zu konfigurieren. Bitte folgen Sie diesem Link, um die neueste Version des Chromedriver herunterzuladen und zu installieren. Vergessen Sie nicht, den Pfad zu speichern, in den Sie ihn installiert haben.

Starten des Browsers

Beginnen wir mit den Dingen. Erstellen Sie eine neue Datei scraper.py und importieren Sie das Selenium-Paket, indem Sie die folgende Zeile kopieren:

von selenium import webdriver

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

driver = webdriver.Chrome(LOCATION)

Ersetzen Sie LOCATION durch den Pfad, unter dem der Chrome-Treiber auf Ihrem Computer zu finden ist. Bitte schauen Sie in den Selenium-Dokumenten nach, um den genauesten PATH für den Web-Treiber zu finden, basierend auf dem Betriebssystem, das Sie verwenden.

Der letzte Schritt ist der Zugriff auf die Website, von der wir die Daten abrufen wollen. 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

Es sollte nun eine neue Instanz von Google Chrome geöffnet sein, die oben auf der Seite den Hinweis "Chrome wird von automatisierter Testsoftware gesteuert" enthält.

Auffinden bestimmter Daten

Wie Sie wahrscheinlich schon herausgefunden haben, werden wir in diesem Tutorial den Subreddit /r/learnprogramming scrapen. Wir werden den Titel des Beitrags, den Autor und die Anzahl der Bewertungen speichern und in einer neuen .csv-Datei ablegen. Schauen wir uns an, wo sie sich auf der HTML-Seite befinden und wie wir sie extrahieren können.

Nachdem Google Chrome die Seite geladen hat, klicken wir mit der rechten Maustaste auf einen beliebigen Beitrag und wählen "Inspizieren". Wir können den HTML-Container des Beitrags unter dem Klassennamen _1oQyIsiPHYt6nx7VOmd1sz finden.

blog-image

Sie können Google Chrome auch ohne grafische Benutzeroberfläche ausführen und den HTML-Inhalt der Seite protokollieren, indem Sie ein paar Codezeilen hinzufügen. Wir setzen die Headless-Option 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 direkt nach Abschluss der HTML-Protokollierung der Seite.

Die neue Datei scraper.py wird wie folgt aussehen:

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 von ihnen sind:

  • Anklicken mit Hilfe der Methode .click()
  • Bereitstellung von Text für ein bestimmtes Eingabeelement durch Aufruf der Methode .send_keys()
  • Lesen des Textes eines Elements mit element.text
  • Prüfen, ob ein Element auf der Seite angezeigt wird, indem .is_displayed() aufgerufen wird

Ein Beispiel für Selenium in Aktion

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

Einloggen

Wir werden die Leistungsfähigkeit von Selenium demonstrieren, indem wir uns bei unserem Reddit-Konto anmelden und die zuvor vorgestellten Daten abrufen. Beginnen wir damit, dass Selenium auf die Anmeldeschaltfläche oben auf der Seite klickt. Nachdem wir den HTML-Code der Seite untersucht haben, können wir sehen, dass der Klassenname der Anmeldeschaltfläche _2tU8R9NTqhvBrhoNAXWWcP lautet.

login_button = driver.find_element_by_class_name('_2tU8R9NTqhvBrhoNAXWWcP')
login_button.click()
blog-image

Dadurch öffnet sich das Anmeldemodal, in dem die auszufüllenden Benutzer- und Passworteingaben zu sehen sind. Lassen Sie uns mit den folgenden Zeilen fortfahren:

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 modale Element untersuchen, können wir sehen, dass sein Container ein iframe ist. Aus diesem Grund müssen wir im ersten Teil des Codes zu frame wechseln, da die Auswahl der Eingaben ohne frame zu einem Fehler führt.

Als Nächstes rufen wir die Eingabeelemente auf und versehen sie mit den richtigen Anmeldedaten, bevor wir auf die Schaltfläche "Senden" klicken. Dies bringt uns zurück auf die /r/learnprogramming Seite, aber jetzt sind wir eingeloggt und bereit zum Upvoten!

Einen Screenshot machen

Einen Screenshot mit Selenium und Python zu machen, ist ziemlich einfach. Alles, was Sie tun müssen, ist, den folgenden Befehl in die Datei scraper.py zu schreiben, nachdem Sie den Web-Treiber deklariert haben.

driver.save_screenshot('screenshot.png')

Es ist nützlich zu wissen, dass Sie die Größe des Google Chrome-Fensters einstellen können, indem Sie die folgenden Codezeilen hinzufügen:

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

So wird der Screenshot in unserem Fall aussehen:

blog-image

Extrahieren von Daten

Wie wir bereits erwähnt haben, müssen wir den Titel des Beitrags, den Autor und die Anzahl der Bewertungen ermitteln. Beginnen wir mit dem Import der Pakete BeautifulSoup und Pandas und erstellen drei leere Arrays für jede Art von Informationen, die wir benötigen.

from bs4 import BeautifulSoup
import pandas as pd

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

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

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

Nachdem wir das HTML-Dokument erfolgreich inspiziert und die richtigen Selektoren ausgewählt haben, werden wir nun die Titel, Upvotes und Autoren abrufen und sie dem richtigen Array zuweisen:

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 in einer CSV-Datei mit dem Pandas-Paket, das wir zuvor importiert haben.

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:

blog-image

Sie scheint alle Informationen zu enthalten, die wir brauchen.

Bonustipp: Manchmal benötigen wir mehr Daten, als die Website beim ersten Laden bereitstellt. In den meisten Fällen wird die Aktion zum Abrufen von Daten ausgelöst, wenn der Benutzer nach unten scrollt. Wenn Sie nach unten scrollen müssen, um mehr 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, Sie hatten bei der Erstellung des Web Scrapers genauso viel Spaß wie ich. Programmieren macht nicht immer Spaß, aber das Erstellen kleiner Skripte wie dieses erinnert mich an die Zeit, als ich gerade erst angefangen habe, und macht den Prozess viel unterhaltsamer.

Dennoch kann das Skript, das wir in diesem Tutorial erstellt haben, nicht viel ausrichten. Ihm fehlen einige wichtige Funktionen, die das Web-Scraping fehlerfrei machen. Die Verbindung über mobile oder private Proxys und das Lösen von CAPTCHAs sind nur ein paar davon.

Wenn Sie auf der Suche nach einer professionelleren Methode zur Datenextraktion sind, sehen Sie sich an, was WebScrapingAPI leisten kann, und prüfen Sie selbst, ob es eine Übereinstimmung gibt. Es gibt ein kostenloses Paket, die einzige Investition sind also 30 Minuten Ihrer Aufmerksamkeit.

Danke, dass Sie sich die Zeit genommen haben, dies zu lesen. Viel Spaß beim Schaben!

Nachrichten und Aktualisierungen

Bleiben Sie auf dem Laufenden mit den neuesten Web Scraping-Anleitungen und Nachrichten, indem Sie unseren Newsletter abonnieren.

We care about the protection of your data. Read our <l>Privacy Policy</l>.Privacy Policy.

Ähnliche Artikel

Vorschaubild
LeitfädenWie man Amazon-Produktdaten scrappt: Ein umfassender Leitfaden zu Best Practices & Tools

Entdecken Sie die Komplexität des Scrapens von Amazon-Produktdaten mit unserem ausführlichen Leitfaden. Von Best Practices und Tools wie der Amazon Scraper API bis hin zu rechtlichen Aspekten erfahren Sie, wie Sie Herausforderungen meistern, CAPTCHAs umgehen und effizient wertvolle Erkenntnisse gewinnen.

Suciu Dan
Autorenavatar
Suciu Dan
15 Minuten lesen
Vorschaubild
LeitfädenScrapy Splash Tutorial: Die Kunst des Scrapings von JavaScript-gerenderten Websites mit Scrapy und Splash beherrschen

Lernen Sie, wie Sie mit Scrapy und Splash dynamische JavaScript-gerenderte Websites scrapen können. Von der Installation über das Schreiben eines Spiders bis hin zum Umgang mit Seitenumbrüchen und der Verwaltung von Splash-Antworten bietet dieser umfassende Leitfaden Schritt-für-Schritt-Anleitungen für Anfänger und Experten gleichermaßen.

Ștefan Răcila
Autorenavatar
Ștefan Răcila
6 Minuten lesen
Vorschaubild
LeitfädenErfahren Sie, wie Sie die Cloudflare-Erkennung mit dem besten Selenium-Browser umgehen

Erfahren Sie, welcher Browser am besten geeignet ist, um Cloudflare-Erkennungssysteme beim Web-Scraping mit Selenium zu umgehen.

Mihnea-Octavian Manolache
Autorenavatar
Mihnea-Octavian Manolache
9 Minuten lesen