Zurück zum Blog
Anleitungen
Sorin-Gabriel MaricaLast updated on Mar 31, 20267 min read

Extrahieren und Auswerten von Webdaten mit Python und BeautifulSoup

Extrahieren und Auswerten von Webdaten mit Python und BeautifulSoup

Web-Scraper sind wertvolle Tools, mit denen Sie bestimmte Informationen aus einer Website extrahieren können. Theoretisch wäre dies auch manuell möglich, doch mit Web-Scraping lassen sich riesige Datenmengen effizienter und produktiver verarbeiten.

Eine der beliebtesten Programmiersprachen für das Web-Scraping ist Python. Diese Sprache verfügt über die Bibliothek BeautifulSoup, die den Prozess vereinfacht. Zusammen macht dieses Duo das Web-Scraping wesentlich einfacher als in anderen Sprachen.

Meiner persönlichen Meinung nach ist die Verwendung von BeautifulSoup der einfachste Weg, einen einfachen Web-Scraper von Grund auf neu zu erstellen. Wenn du mehr darüber erfahren möchtest, lies weiter, denn ich zeige dir, wie du mit Python und BeautifulSoup deinen eigenen Web-Scraper erstellen kannst.

Ein Überblick über BeautifulSoup

BeautifulSoup ist, wie in der Dokumentation angegeben, eine Python-Bibliothek zum Extrahieren von Daten aus HTML- und XML-Dateien. Du kannst also Python verwenden, um den HTML-Inhalt einer Website zu extrahieren, und dann BeautifulSoup nutzen, um diesen HTML-Code zu analysieren und nur die relevanten Informationen zu erhalten.

Der Hauptvorteil von BeautifulSoup ist die einfache Syntax, die es bietet. Mit dieser Bibliothek kannst du durch den DOM-Baum navigieren, nach bestimmten Elementen suchen oder HTML-Inhalte ändern. All diese Vorteile haben es zur beliebtesten Python-Bibliothek für das Parsen von HTML- und XML-Dokumenten gemacht.

Installation

Um BeautifulSoup zu installieren, solltest du die Anleitung hier lesen, da die Installation je nach verwendetem System unterschiedlich ist. In diesem Artikel verwende ich ein Linux-System und muss lediglich den folgenden Befehl ausführen:

pip install beautifulsoup4

Wenn Sie Python 3 verwenden, müssen Sie die Bibliothek möglicherweise stattdessen mit dem folgenden Befehl installieren:

pip3 install beautifulsoup4

Beachten Sie, dass auf meinem Rechner Python 3 bereits installiert ist. Wenn Sie Python-Neuling sind, finden Sie hier eine Anleitung zur Installation. Außerdem sollten Sie sich unseren ultimativen Leitfaden zum Erstellen eines Web-Scrapers mit Python ansehen, um noch mehr Informationen zu diesem Thema zu erhalten.

Erstellen eines Scrapers mit BeautifulSoup

Wenn nun alles reibungslos geklappt hat, können wir mit der Erstellung unseres eigenen Scrapers beginnen. Für diesen Artikel habe ich mich dafür entschieden, die 100 besten Filme aller Zeiten von RottenTomatoes abzurufen und alles sowohl im JSON- als auch im CSV-Format zu speichern.

Abrufen des Seitenquellcodes

Um uns aufzuwärmen und mit BeautifulSoup vertraut zu machen, rufen wir zunächst den vollständigen HTML-Code der Seite ab und speichern ihn in einer neuen Datei namens „page.txt“.

Wenn du den HTML-Quellcode einer beliebigen Seite anzeigen möchtest, kannst du dies in Google Chrome tun, indem du STRG+U drückst. Dadurch öffnet sich ein neuer Tab, und du siehst etwa Folgendes:

Um denselben Quellcode mit BeautifulSoup und Python abzurufen, können wir den folgenden Code verwenden:

import requests
from bs4 import BeautifulSoup

scraped_url = 'https://www.rottentomatoes.com/top/bestofrt/'
page = requests.get(scraped_url)

soup = BeautifulSoup(page.content, 'html.parser')

file = open('page.txt', mode='w', encoding='utf-8')
file.write(soup.prettify())

In diesem Code senden wir eine Anfrage an die RottenTomatoes-Seite und fügen dann den gesamten Inhalt der Seite in ein BeautifulSoup-Objekt ein. Die einzige Verwendung von BeautifulSoup in diesem Beispiel ist die abschließende Funktion namens „prettify()“, die den HTML-Code formatiert, um ihn lesbarer zu machen.

Um die Funktion besser zu verstehen: Für diesen HTML-Code „<div><span>Test&lt;/span></div>“ fügt „prettify“ Tabulatoren hinzu und wandelt ihn in diesen formatierten Code um:

<div>

   <span>

       Test

   </span>

</div>

Das Endergebnis des Codes ist die Erstellung einer Datei namens page.txt, die den gesamten Quellcode unserer Seite enthält:

Beachten Sie, dass es sich hierbei um den Quellcode der Seite handelt, bevor jeglicher JavaScript-Code ausgeführt wird. Manchmal ändern Websites ihren Seiteninhalt dynamisch. In diesen Fällen sieht der Quellcode der Seite anders aus als der tatsächliche Inhalt, der dem Benutzer angezeigt wird. Wenn Ihr Scraper JavaScript ausführen soll, lesen Sie unseren Leitfaden zum Erstellen eines Web-Scrapers mit Selenium, oder nutzen Sie WebScrapingAPI, unser Produkt, das dieses Problem für Sie löst.

Abrufen der Webdaten

Wenn Sie sich den Quellcode der vorherigen Seite ansehen, werden Sie feststellen, dass Sie die Namen der Filme und deren Bewertungen finden können. Zu unserem Glück lädt RottenTomatoes die Filmliste nicht dynamisch, sodass wir die benötigten Informationen direkt scrapen können.

Zunächst untersuchen wir die Seite und sehen uns an, wie der HTML-Code strukturiert ist. Dazu klicken Sie mit der rechten Maustaste auf einen Filmtitel und wählen die Option „Element untersuchen“. Das folgende Fenster sollte erscheinen:

Ich habe die nützlichen Informationen in diesem Bild mit einer roten Linie hervorgehoben. Sie sehen, dass die Seite die beliebtesten Filme in einer Tabelle anzeigt und dass jede Tabellenzeile vier Zellen enthält (Element <tr>).

Die erste Zelle enthält die Position des Films, die zweite Informationen zu den Bewertungen (Element mit der Klasse „tMeterScore“), die dritte den Titel des Films und die letzte Zelle die Anzahl der Rezensionen.

Da wir diese Struktur kennen, können wir nun damit beginnen, die benötigten Informationen zu extrahieren.

import requests
from bs4 import BeautifulSoup
 
links_base = 'https://www.rottentomatoes.com'
scraped_url = 'https://www.rottentomatoes.com/top/bestofrt/'
page = requests.get(scraped_url)
 
soup = BeautifulSoup(page.content, 'html.parser')
 
table = soup.find("table", class_="table") # We extract just the table code from the entire page
rows = table.findAll("tr") # This will extract each table row, in an array
 
movies = []
 
for index, row in enumerate(rows):
    if index > 0: # We skip the first row since this row only contains the column names
        link = row.find("a") # We get the link from the table row
        rating = row.find(class_="tMeterScore") # We get the element with the class tMeterScore from the table row
        movies.append({
            "link": links_base + link.get('href'), # The href attribute of the link
            "title": link.string.strip(), # The strip function removes blank spaces at the beginning and the end of a string
            "rating": rating.string.strip().replace("&nbsp;", ""), # We remove &nbsp; from the string and the blank spaces
        })
        
print(movies)

Wenn Sie diesen Code ausführen, sollten Sie ein Ergebnis wie dieses erhalten:

In diesem Beispiel extrahieren wir den Tabelleninhalt und durchlaufen die Tabellenzeilen in einer Schleife. Da die erste Zeile nur die Spaltennamen enthält, überspringen wir sie.

Bei den restlichen Zeilen setzen wir den Vorgang fort, indem wir das Anker-Element (<a>) und das Span-Element mit der Klasse „tMeterScore“ extrahieren. Damit können wir nun die benötigten Informationen abrufen.

Der Titel des Films befindet sich im Anker-Element, der Link ist das Attribut „href“ des Ankers und die Bewertung befindet sich im Span-Element mit der Klasse „tMeterScore“. Wir erstellen einfach für jede Zeile ein neues Wörterbuch und fügen es unserer Liste der Filme hinzu.

Speichern der Webdaten

Bisher hat der Scraper die Daten abgerufen und formatiert, aber wir haben sie nur im Terminal angezeigt. Alternativ können wir die Informationen auf unserem Computer als JSON- oder CSV-Datei speichern. Der vollständige Code des Scrapers (einschließlich der Erstellung einer lokalen Datei) lautet:

import requests
from bs4 import BeautifulSoup
import csv
import json
 
links_base = 'https://www.rottentomatoes.com'
scraped_url = 'https://www.rottentomatoes.com/top/bestofrt/'
page = requests.get(scraped_url)
 
soup = BeautifulSoup(page.content, 'html.parser')
 
table = soup.find("table", class_="table") # We extract just the table code from the entire page
rows = table.findAll("tr") # This will extract each table row from the table, in an array
 
movies = []
 
for index, row in enumerate(rows):
    if index > 0: # We skip the first row since this row only contains the column names
        link = row.find("a") # We get the link from the table row
        rating = row.find(class_="tMeterScore") # We get the element with the class tMeterScore from the table row
        movies.append({
            "link": links_base + link.get('href'), # The href attribute of the link
            "title": link.string.strip(), # The strip function removes blank spaces at the beginning and the end of a string
            "rating": rating.string.strip().replace("&nbsp;", ""), # We remove &nbsp; from the string and the blank spaces
        })
        
file = open('movies.json', mode='w', encoding='utf-8')
file.write(json.dumps(movies))
 
writer = csv.writer(open("movies.csv", 'w'))
for movie in movies:
    writer.writerow(movie.values())

Noch weiter scrapen

Da du nun alle Informationen hast, kannst du das Scraping noch weiter vertiefen. Denk daran, dass jeder Film einen Link hat. Du könntest fortfahren, indem du die Filmseiten scrapst und noch mehr Informationen darüber extrahierst.

Wenn du beispielsweise die Filmseite zu „It Happened One Night“ (1934) aufrufst, siehst du, dass du noch weitere nützliche Informationen wie die Zuschauerbewertung, die Filmlänge, das Genre und so weiter scrapen könntest.

Allerdings wirkt es sehr ungewöhnlich, all diese Anfragen in kurzer Zeit zu stellen, und könnte zu CAPTCHA-Überprüfungen oder sogar zu IP-Sperren führen. Um das zu vermeiden, solltest du rotierende Proxys verwenden, damit der gesendete Datenverkehr natürlich wirkt und von mehreren IP-Adressen stammt.

Weitere Funktionen von BeautifulSoup

Obwohl unser RottenTomatoes-Scraper fertig ist, hat BeautifulSoup noch viel zu bieten. Wenn Sie an einem Projekt arbeiten, sollten Sie den Link zur Dokumentation geöffnet lassen, damit Sie schnell nach einer Lösung suchen können, wenn Sie nicht weiterkommen.

Beispielsweise ermöglicht BeautifulSoup die Navigation durch den DOM-Baum der Seite:

from bs4 import BeautifulSoup

soup = BeautifulSoup("<head><title>Title</title></head><body><div><p>Some text <span>Span</span></p></div></body>", 'html.parser')

print(soup.head.title) # Will print "<title>Title</title>"
print(soup.body.div.p.span) # Will print "<span>Span</span>"

Diese Funktion kann dir helfen, wenn du ein Element auswählen musst, das nicht anhand seiner Attribute identifiziert werden kann. In diesem Fall ist die einzige Möglichkeit, es zu finden, die Struktur des DOM.

Eine weitere coole Sache an BeautifulSoup ist, dass du den Quellcode der Seite ändern kannst:

from bs4 import BeautifulSoup

soup = BeautifulSoup("<head><title>Title</title></head><body><div><p>Some text <span>Span</span></p></div></body>", 'html.parser')

soup.head.title.string = "New Title"
print(soup)
# The line above will print "<head><title>New Title</title></head><body><div><p>Some text <span>Span</span></p></div></body>"

Dies kann von unschätzbarem Wert sein, wenn du einen Dienst erstellen möchtest, mit dem Nutzer ihre Seiten optimieren können. Du kannst das Skript beispielsweise verwenden, um eine Website zu scrapen, das CSS abzurufen, es zu minimieren und im HTML-Quellcode zu ersetzen. Die Möglichkeiten sind endlos!

Scrape immer clever

Ich möchte, dass du dir das unbedingt merkst: Die Verwendung von Python und BeautifulSoup für das Web-Scraping ist eine hervorragende Idee. Es macht den Prozess im Vergleich zu anderen Programmiersprachen viel einfacher.

Der Scraper, den wir entwickelt haben, um die bestbewerteten Filme aller Zeiten von RottenTomatoes abzurufen, lässt sich in nur wenigen Minuten programmieren, und Sie können ihn sogar zusammen mit dem IMDB-Scraper aus unserem ultimativen Leitfaden zum Scraping mit PHP verwenden.

Allerdings sind manche Websites für Scraper leichter zugänglich als andere. Während das Projekt aus diesem Artikel einfach ist und Spaß macht, sind andere alles andere als das. Manchmal tun Websites alles in ihrer Macht Stehende, um zu verhindern, dass ihre Inhalte gescrapt werden.

In bestimmten Situationen ist die einzige Möglichkeit, Inhalte zu scrapen, Ihre Aktivitäten mit mehreren IP-Adressen und einem echten Browser zu verschleiern. Für solche Fälle haben wir WebScrapingAPI entwickelt, eine leistungsstarke Lösung, die rotierende Proxys und JavaScript-Rendering bietet und es Ihnen ermöglicht, jede gewünschte Website mit minimalem Aufwand zu scrapen!

Glauben Sie mir nicht einfach blind, probieren Sie es selbst aus! Sie können sofort Ihre kostenlose Testversion starten und 5000 API-Aufrufe erhalten, ohne sensible Daten wie Ihre Kreditkartendaten preisgeben zu müssen.

Über den Autor
Sorin-Gabriel Marica, Full-Stack-Entwickler @ WebScrapingAPI
Sorin-Gabriel MaricaFull-Stack-Entwickler

Sorin Marica ist Full-Stack- und DevOps-Entwickler bei WebScrapingAPI, wo er Produktfunktionen entwickelt und die Infrastruktur wartet, die für einen reibungslosen Betrieb der Plattform sorgt.

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.