Nachdem wir nun einige theoretische Konzepte behandelt haben, können wir uns getrost dem praktischen Teil zuwenden. In diesem Abschnitt zeige ich Ihnen, wie Sie mit Selenium einen Web-Scraper erstellen. Stellen Sie für dieses Projekt sicher, dass auf Ihrem Rechner Python und Chrome installiert sind.
#1: Die Umgebung einrichten
Wie üblich sollten wir in Python alles in einer virtuellen Umgebung kapseln. Wenn Sie mit virtuellen Umgebungen nicht vertraut sind, lesen Sie bitte zuerst diesen Artikel. Öffnen wir nun ein neues Terminalfenster und gehen wir wie folgt vor:
- Einen neuen Ordner erstellen
- Navigieren Sie zu dem Ordner
- Eine neue virtuelle Umgebung erstellen
- Die virtuelle Umgebung aktivieren
~ mkdir headless_scraper
~ cd headless_scraper
~ python3 -m venv env
~ source env/bin/activate
#2: Abhängigkeiten installieren
Es ist ziemlich klar, dass wir für unser Projekt Selenium und einen Web-Driver benötigen. Glücklicherweise können wir beides mit Pythons Paketmanager `pip` installieren. Geben Sie im selben Terminalfenster den folgenden Befehl ein:
~ pip install selenium webdriver-manager
Jetzt sind Sie bestens für den Erfolg gerüstet! Wir können mit dem eigentlichen Programmieren fortfahren. Kurzer Hinweis: Dieser Artikel konzentriert sich auf die Interaktion mit einem Headless-Browser. Eine vollständige Web-Scraping-Lösung erfordert viel mehr Aufwand. Aber ich bin sicher, wenn Sie unseren Blog-Beiträgen folgen, können Sie das in kürzester Zeit hinbekommen.
#3: Einen automatisierten Browser öffnen
Bisher haben wir das Projekt, aber es gibt keine Datei, die wir ausführen können. Erstellen wir eine neue `.py`-Datei und öffnen wir sie in unserer IDE:
~ touch headles_scraper.py
~ code .
Sie sollten sich nun in Visual Studio Code oder Ihrer IDE befinden. Beginnen Sie damit, die erforderlichen Pakete in `handle_scraper.py` zu importieren:
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
Letzteres ist ein Paket, das Ihnen hilft, Web-Treiber für die verschiedenen von Selenium unterstützten Browser einfach zu verwalten. Mehr darüber erfahren Sie hier. Als Nächstes möchten wir mit Selenium einen neuen Browser erstellen und eine Website öffnen:
driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get('https://webscrapingapi.com')
Führen Sie diese Datei jetzt aus, und Sie werden sehen, dass es funktioniert. Anstatt jedoch einen Python-Headless-Browser zu verwenden, öffnet sich ein Chrome-Fenster mit Benutzeroberfläche:
#4: Headless-Modus
Wir haben uns vorgenommen, einen ressourcenschonenden Web-Scraper zu erstellen. Idealerweise möchten wir also mit Selenium einen Headless-Browser öffnen. Glücklicherweise gibt es eine einfache Methode, mit der wir Selenium von Headful auf Headless umstellen können. Wir müssen lediglich die Optionen des Chrome-Web-Drivers nutzen. Importieren wir also `Options` und fügen zwei weitere Codezeilen hinzu:
...
from selenium.webdriver.chrome.options import Options
...
options = Options()
options.headless = True
driver = webdriver.Chrome(ChromeDriverManager().install(), options=options)
driver.get('https://webscrapingapi.com')
Führe dein Skript erneut aus. Wie du sehen kannst, erscheint diesmal kein Fenster. Aber läuft es wirklich im Hintergrund? Eine schnelle Möglichkeit, dies zu visualisieren und zu überprüfen, ist ein Screenshot mit Selenium. Füge einfach diese Zeile am Ende deines Skripts ein:
driver.get_screenshot_as_file('headless.png')
Wenn alles geklappt hat, solltest du dasselbe Bild wie ich sehen:
#5: Scraping-Funktionen hinzufügen
Was ist ein Web-Scraper? Im Kern ist ein Web-Scraper ein Programm, das einen Endpunkt auf einem Server aufruft und Daten von diesem sammelt. Bei Websites bestehen diese Daten in der Regel aus HTML-Dateien. Aber bestimmte Server liefern heutzutage auch JSON-Objekte. Bleiben wir also bei diesem Begriff: Daten. Für den folgenden Abschnitt setzen wir uns höhere Ziele. Nutzen wir etwas objektorientierte Programmierung! Unsere Ziele sind:
- Erstellen einer Scraper-Klasse
- Eine Methode zum Extrahieren von Rohdaten hinzufügen
- Eine Methode zum Extrahieren von Daten aus einem einzelnen Element hinzufügen
- Eine Methode zum Extrahieren von Daten aus Elementen derselben Klasse hinzufügen
Wir haben also drei grundlegende Methoden, die wir erstellen wollen. Doch zu Lernzwecken eröffnen diese drei Methoden nicht nur einen Weg zum Web-Scraping, sondern auch zur OOP mit Python. Und ich finde das ziemlich cool! Löschen wir nun alles, was wir bisher programmiert haben, und fangen ganz von vorne an:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.remote.webelement import WebElement
class Scraper:
def __init__(self, headless: bool = True) -> None:
self.headless = headless
pass
def setup_scraper(self) -> None:
self.options = Options()
self.options.headless = self.headless
self.driver = webdriver.Chrome(options=self.options)
def navigate(self, target) -> None:
self.driver.get(target) if target else print('[!] No target given. Please specify a URL.')
def extract_raw_data(self) -> str:
return self.driver.page_source
def extract_single_element(self, selector: str, selector_type: By = By.CSS_SELECTOR) -> WebElement:
return self.driver.find_element(selector_type, selector)
def extract_all_elements(self, selector: str, selector_type: By = By.CSS_SELECTOR) -> list[WebElement]:
return self.driver.find_elements(selector_type, selector)
Ich habe Typangaben hinzugefügt, um das Verständnis zu erleichtern, nicht um die Leistung zu verbessern. Auf diese Weise kannst du dir die App aus einer I/O-Perspektive vorstellen. Nun sind die Methoden ziemlich selbsterklärend. Wir führen keinerlei Aktionen an den Daten durch, wir geben sie lediglich zurück. Wenn du möchtest, kann das ein Ausgangspunkt für dich sein, um einen komplexen Scraper mit einem Python-Headless-Browser zu erstellen.
Bisher bewirkt die Ausführung der Datei noch nichts. Das liegt daran, dass wir unseren Scraper und seine Methoden lediglich deklariert haben. Wir müssen sie nun verwenden. Fügen wir also die folgenden Codezeilen hinzu:
# Initialize a new Scraper and navigate to a target
scraper = Scraper()
scraper.setup_scraper()
scraper.navigate('https://httpbin.org')
# Extract and print the entire HTML document
raw_data = scraper.extract_raw_data()
print(raw_data)
# Extract and print an element by its class name
single_element = scraper.extract_single_element('title', By.CLASS_NAME)
print(single_element.text)
# Extract and print all elements belonging to a tag type
all_elements = scraper.extract_all_elements('a', By.TAG_NAME)
print([el.get_attribute('href') for el in all_elements])
Und das war’s schon. Wenn du dein Skript jetzt ausführst, wirst du sehen, dass etwas passiert. Auch dies ist lediglich ein Prototyp, der dir den Einstieg erleichtern soll. Wenn du mehr darüber erfahren möchtest, wie ein Python-Headless-Browser beim Web-Scraping eingesetzt werden kann, fordere ich dich auf:
Auf diese Weise erwerben Sie nicht nur Wissen, sondern können auch ein Projekt zu Ihrem Portfolio hinzufügen.