Zurück zum Blog
Leitfäden
Raluca Penciuc19. Oktober 20229 Minuten Lesezeit

Wie Web Scraping in R die Datenwissenschaft zum Vergnügen macht

Wie Web Scraping in R die Datenwissenschaft zum Vergnügen macht

Einführung in R

R ist eine Open-Source-Variante der Programmiersprache S, kombiniert mit der Semantik von Scheme. Es erschien erstmals Mitte 1993, wurde 1995 als Open-Source-Software veröffentlicht und erlebte im Jahr 2000 seine erste stabile Beta-Version.

Ein Cartoon-Meme, das R und S-Scheme vergleicht, mit einer Bildunterschrift, die Verwirrung zum Ausdruck bringt

Ross Ihaka und Robert Gentleman entwickelten R mit dem Ziel, „Ideen schnell und originalgetreu in Software umzusetzen“.

R ist eine funktionale Programmiersprache und unter Datenwissenschaftlern sehr bekannt. Die gängigsten Anwendungsfälle sind:

  • Bankwesen;
  • Finanzen;
  • E-Commerce;
  • maschinelles Lernen;
  • jede andere Branche, die große Datenmengen verarbeitet.

Im Vergleich zu SAS und SPSS ist R das weltweit am häufigsten genutzte Analysetool. Seine aktive und hilfsbereite Community umfasst fast 2 Millionen Nutzer.

Wenn wir uns einige der Unternehmen ansehen würden, die R in ihre Geschäftstätigkeit integrieren, und wie sie das tun, würden wir feststellen: :

  • Facebook: um den Status und das soziale Netzwerk zu aktualisieren;
  • Google: Vorhersage der Konjunkturentwicklung und Steigerung der Effizienz von Online-Werbung;
  • Foursquare: wegen seiner Empfehlungsmaschine;
  • Trulia: zur Vorhersage von Immobilienpreisen und lokalen Kriminalitätsraten.

Im Vergleich zu anderen Sprachen steht R jedoch in ständiger Konkurrenz zu Python. Beide bieten Tools für das Web-Scraping und verfügen über aktive Communities.

Die Unterschiede werden deutlich, wenn wir uns die Zielgruppe ansehen. Python verfügt über eine sehr leicht zu erlernende Syntax und viele hochentwickelte Funktionen. Das macht es für Anfänger und nicht-technisch versierte Nutzer attraktiver.

R mag auf den ersten Blick etwas einschüchternd wirken, konzentriert sich jedoch vor allem auf statistische Analysen. Es bietet eine größere Auswahl an integrierten Tools für die Datenanalyse und -visualisierung. Daher kann es eine bessere Wahl für Projekte sein, bei denen große Datenmengen verarbeitet werden, wie beispielsweise beim Web-Scraping.

Über rvest

Rvest gehört zu den beliebtesten Paketen für das Web-Scraping in R. Es bietet leistungsstarke und dennoch einfache Parsing-Funktionen. Pythons BeautifulSoup diente als Inspiration und ist Teil der tidyverse -Sammlung.

Cool, aber warum sollte man rvest verwenden, wenn R über native Bibliotheken verfügt, die dasselbe leisten? Der erste gute Grund ist, dass rvest eine Hülle für die Pakete httr und xml2 darstellt. Das bedeutet, dass es sowohl die GET-Anfrage als auch das Parsen des HTML-Codes übernimmt.

So verwenden Sie nur eine Bibliothek statt zwei, und Ihr Code wird wesentlich übersichtlicher und kürzer. Darüber hinaus kann rvest auch eine Zeichenkette als Eingabe entgegennehmen und sowohl das Parsen von XML als auch das Herunterladen von Dateien übernehmen.

Wir sollten jedoch bedenken, dass die Websites zunehmend dynamisch generierte Inhalte enthalten. Die Gründe dafür sind vielfältig: Leistung, Benutzererfahrung und viele andere. Da Rvest die Ausführung von JavaScript nicht verarbeiten kann, sollten Sie hier nach einer Alternative suchen.

Webscraping mit R

Okay, genug Theorie. Schauen wir uns einmal an, wie sich R in einem praktischen Anwendungsfall verhält. Für dieses Tutorial habe ich die Goodreads-Seite eines sehr berühmten Buches ausgewählt: George Orwells „1984“. Die Website findest du hier: https://www.goodreads.com/book/show/61439040-1984.

Ich möchte herausfinden, wie sich die Beliebtheit dieses Buches im Laufe der Jahre entwickelt hat. Um dies zu ermitteln, werde ich die Liste der Rezensionen auslesen und für jede Rezension das Datum sowie die Bewertung extrahieren. Als letzten Schritt werde ich die Daten in einer externen Datei speichern, die später von anderen Programmen verarbeitet werden kann.

Die Umgebung einrichten

Aber zuerst musst du sicherstellen, dass du alles hast, was du zum Schreiben des Codes brauchst.

CRAN-Seite mit Download-Links zur Installation von R für Linux, macOS und Windows

Was die IDE betrifft, hast du zwei Möglichkeiten:

  • ein R-Plugin für Visual Studio Code installieren;
  • Laden Sie RStudio herunter, das entwickelt wurde, um das Programmieren in R zu vereinfachen.

In diesem Tutorial werde ich Letzteres verwenden. Du kannst es hier herunterladen: https://www.rstudio.com/products/rstudio/download/.

Preisvergleichstabelle für RStudio, aus der hervorgeht, dass RStudio Desktop kostenlos heruntergeladen werden kann

Die kostenlose Version von RStudio Desktop reicht aus, um sich mit den Grundlagen vertraut zu machen. Befolgen Sie wie zuvor die Installationsanweisungen.

Öffnen Sie RStudio und erstellen Sie einen neuen leeren Ordner. Ich werde den Code in einer neuen Datei namens „goodreads-rvest.r“ schreiben.

Vorstellung des Browsers

Bevor du die Daten extrahierst, musst du dir darüber im Klaren sein, welche Daten du benötigst. Rvest unterstützt sowohl CSS- als auch XPath-Selektoren – du hast also die Wahl. 

Wenn du vorhast, komplexere Scraping-Projekte in Angriff zu nehmen, empfehle ich dir, dir grundlegende Kenntnisse in HTML und CSS anzueignen. Hier findest du eine gute Übungsplattform für den Einstieg.

Falls Sie sich mit HTML nicht auskennen, gibt es auch einige technisch weniger anspruchsvolle Möglichkeiten. Chrome bietet beispielsweise die Browser-Erweiterung „SelectorGadget“ an. Damit können Sie an einer beliebigen Stelle auf der Seite klicken, woraufhin Ihnen der CSS-Selektor angezeigt wird, mit dem Sie die Daten abrufen können.

Allerdings ist nicht jede Website so einfach wie Goodreads. Ich werde die Daten mithilfe von CSS-Selektoren abrufen, die ich durch manuelles Durchsehen des HTML-Codes ermittelt habe.

Rufen Sie die Ziel-URL in Ihrem Browser auf und scrollen Sie nach unten zum Abschnitt „Community-Bewertungen“. Klicken Sie dann mit der rechten Maustaste darauf und wählen Sie „Element untersuchen“, um die Entwicklertools zu öffnen.

Goodreads-Buchseite mit den Entwicklertools des Browsers, die den Bereich „Rezensionen der Community“ anzeigen

Ich werde mich auf den Container mit der ID„other_reviews“konzentrieren. Klicken Sie nun auf die Schaltfläche „Inspect“, um den CSS-Selektor für das Datum und die Bewertung einer Rezension zu finden.

Goodreads-Rezensionsseite mit Entwicklertools, die das Datum der Rezension und die Sternebewertung hervorheben

Sie können also Folgendes feststellen:

  • Jede einzelne Bewertung ist ein `div`-Container mit der Klasse„review“;
  • Das Datum der Bewertung ist ein einzelnes Anker-Element mit der Klasse„reviewDate“;
  • Die Bewertung der Rezension ist ein `span`-Element mit der Klasse„staticStars“. Es enthält fünf untergeordnete `span`-Elemente, die der Anzahl der Sterne entsprechen, die ein Nutzer vergeben kann. Wir betrachten die farbigen Elemente, die die Klasse„p10“tragen.

Die Bewertungen extrahieren

Nachdem Sie alle Voraussetzungen überprüft haben, können Sie endlich mit dem Schreiben des Codes beginnen.

install.packages('rvest')

Setzen Sie den Cursor an das Ende der Zeile und klicken Sie auf die Schaltfläche „Ausführen“ oberhalb des Code-Editors. In Ihrer Konsole wird der Fortschritt der Paketinstallation angezeigt.

Die Installation erfolgt nur einmal, daher können Sie die vorherige Zeile nun auskommentieren oder löschen:

#install.packages('rvest')

Nun musst du die Bibliothek laden (oder importieren):

library(rvest)

Ich werde die Funktion `read_html` verwenden, um eine GET-Anfrage an die Zielwebsite zu senden, wodurch das benötigte HTML-Dokument heruntergeladen wird. Auf diese Weise werde ich das benötigte HTML-Dokument herunterladen:

book_html <- read_html("https://www.goodreads.com/book/show/61439040-1984")

Das Ergebnis ist nun in der Variablen „book_html“ gespeichert, was du auch sehen kannst, indem du einfach Folgendes in die Konsole eingibst:

Ausgabe der RStudio-Konsole, die ein HTML-Dokumentobjekt anzeigt, das nach dem Abrufen einer Seite ausgegeben wurde

Wenn Sie zu irgendeinem Zeitpunkt die offizielle Dokumentation zu einer Funktion einsehen möchten, die Sie verwenden möchten, geben Sie in der Konsole Folgendes ein:

help(Funktionsname) 

RStudio öffnet einen HTTP-Server mit einem direkten Link zur Dokumentation. Bei „read_html“ lautet die Ausgabe:

RStudio-Hilfebereich mit der Dokumentation zu den Funktionen „read_html“ und „read_xml“

Um die Liste der Bewertungen abzurufen, werde ich die Funktion `html_elements` verwenden. Diese erhält als Eingabe den CSS-Selektor, den ich zuvor gefunden habe:

reviews <- book_html %>% html_elements('div.review')

Das Ergebnis ist eine Liste von XML-Knoten, die ich durchlaufe, um das Datum und die Bewertung jedes einzelnen Elements zu ermitteln:

Ausgabe der RStudio-Konsole mit einer Liste der aus einem HTML-Dokument extrahierten Bewertungsknoten

R-Programmierer nutzen den Pipe-Operator „%>%“, um das Programmieren flexibler zu gestalten. Seine Aufgabe besteht darin, den Wert des linken Operanden als Argument an den rechten Operanden zu übergeben.

Sie können die Operanden verketten (wie Sie später in dieser Anleitung sehen werden), wodurch Sie die Anzahl der lokalen Variablen erheblich reduzieren können. Die vorangehende Codezeile würde ohne den Pipe-Operator wie folgt aussehen:

reviews <- html_elements(book_html, 'div.review')

Um die Daten zu erfassen, werde ich außerhalb der Schleife zwei Vektoren initialisieren. Nach einem kurzen Blick auf die Website kann ich garantieren, dass beide Vektoren dieselbe Länge haben werden.

dates <- vector()
ratings <- vector()

Während ich nun die Liste der Bewertungen durchlaufe, suche ich nach zwei Werten: Datum und Bewertung. Wie du zuvor gesehen hast, handelt es sich bei dem Datum um ein Anker-Element, das die Klasse „reviewDate“ trägt.

Die Bewertung besteht aus einem `span`-Element mit der Klasse `staticStars` und enthält für jeden Stern fünf `span`-Elemente. Wenn der Benutzer einen Stern vergeben hat, erhält das entsprechende `span`-Element die Klasse `p10` , während die übrigen Elemente die Klasse `p0` erhalten.

Der Code sieht dann so aus:

for (review in reviews) {
  review_date = review %>% html_element('a.reviewDate') %>% html_text()
  dates <- c(dates, review_date)
 
  review_rating_element = review %>% html_element('span.staticStars')
  valid_stars = review_rating_element %>% html_elements('span.p10')
  review_rating = length(valid_stars)
  ratings <- c(ratings, review_rating)
}

Beachten Sie die Funktion `html_element`; es handelt sich nicht um einen Tippfehler. Sie können `html_elements` verwenden, wenn Sie eine Liste von XML-Knoten extrahieren möchten, und `html_element` für einen einzelnen Knoten.

In diesem Fall habe ich Letzteres auf einen kleineren Abschnitt des HTML-Dokuments (eine Rezension) angewendet. Außerdem habe ich die Funktion `html_text` verwendet, um den Textinhalt des gefundenen Elements abzurufen. 

Abschließend werde ich die beiden Vektoren in einem einzigen Datenrahmen zusammenführen, um die Daten zu bündeln:

result = data.frame(date = dates, rating = ratings)

Und das Endergebnis wird so aussehen:

R-Konsolenausgabe mit einer Tabelle der Bewertungsdaten und numerischen Bewertungen

Ergebnisse speichern

Wir alle wissen, dass das Scraping sinnlos ist, wenn man die Ergebnisse nicht irgendwo speichert. In R lässt sich eine CSV-Datei ganz einfach wie folgt erstellen:

write.csv(result, "reviews.csv")

Das Ergebnis muss eine Matrix oder ein Datenrahmen sein (was bereits der Fall ist); andernfalls wird versucht, eine Konvertierung durchzuführen. Führen Sie den Code aus und überprüfen Sie das Projektverzeichnis. Sie werden feststellen, dass Sie die zuvor erstellte Tabelle in einem Texteditor, als Excel-Datei usw. öffnen können.

Das Ergebnis muss eine Matrix oder ein Datenrahmen sein (was bereits der Fall ist); andernfalls wird versucht, eine Konvertierung durchzuführen. Führen Sie den Code aus und überprüfen Sie das Projektverzeichnis. Sie werden feststellen, dass Sie die zuvor erstellte Tabelle in einem Texteditor, als Excel-Datei usw. öffnen können.

Natürlich umfasst unsere Datenliste nur 30 Einträge. Die Website zeigt über 90.000 Bewertungen und über 3 Millionen Bewertungen an. Was ist also passiert? Nun, die Paginierung.

Gehen Sie außerdem zurück zu Ihrem Browser und klicken Sie auf die zweite Seite. Sie werden feststellen, dass sich die Liste ändert, die URL jedoch gleich bleibt. Das bedeutet, dass ein Status verwendet wird, um einen anderen Abschnitt der Liste dynamisch zu laden.

In solchen Situationen ist rvest möglicherweise nicht hilfreich. Stattdessen kann ein automatisierter Browser dabei helfen, das Klickverhalten nachzuahmen, um den Rest der Liste zu laden. Ein Beispiel für eine solche Bibliothek ist Rselenium, aber ich werde dieses Thema als Folgeaufgabe für Sie belassen.

Schlussfolgerung

Ich hoffe, dieses Tutorial hat dir eine solide Grundlage für das Web-Scraping mit R vermittelt. Jetzt fällt dir die Entscheidung für den Tech-Stack deines nächsten Projekts leichter.

Bitte beachten Sie jedoch, dass dieser Artikel nicht auf alle Herausforderungen des Web-Scrapings eingegangen ist. Eine ausführlichere Darstellung dieser Konzepte finden Sie in diesem leicht verständlichen Leitfaden.

Über den Autor
Raluca Penciuc, Full-Stack-Entwicklerin bei WebScrapingAPI
Raluca PenciucFull-Stack-Entwickler

Raluca Penciuc ist Full-Stack-Entwicklerin bei WebScrapingAPI. Sie entwickelt Scraper, optimiert Umgehungsstrategien und findet zuverlässige Wege, um die Erkennung auf Zielwebsites zu verringern.

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.