Zurück zum Blog
Anleitungen
Raluca PenciucLast updated on Mar 31, 20268 min read

Wie Web-Scraping in R Data Science spannend macht

Wie Web-Scraping in R Data Science spannend macht

Mit der Weiterentwicklung des Internets werden immer mehr Daten dynamisch generiert. Dadurch lassen sich diese Daten immer seltener über eine API extrahieren. Web-Scraping in R kommt Datenwissenschaftlern zu Hilfe, deren Projekte riesige Datenmengen erfordern.

Glücklicherweise haben sich auch Programmiersprachen weiterentwickelt, um diese Situationen zu bewältigen. Ein beliebtes Beispiel für eine solche Sprache ist R, das speziell für die Bewältigung von Aufgaben mit hohem Datenaufkommen entwickelt wurde.

In diesem Tutorial werde ich die Grundprinzipien erläutern, indem ich auf die praktische Anwendbarkeit von R eingehe. Außerdem werde ich eines der beliebtesten Pakete für das Web-Scraping mit R vorstellen: rvest. Anschließend werde ich veranschaulichen, wie R bei der Extraktion von Daten aus einer Website funktioniert.

Einführung in R

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

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 beliebtesten Anwendungsbereiche sind:

  • Bankwesen;
  • Finanzen;
  • E-Commerce;
  • maschinelles Lernen;
  • alle anderen Branchen, die große Datenmengen verarbeiten.

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

Wenn wir uns einige der Unternehmen ansehen, die R in ihre Geschäftsabläufe integrieren, und wie sie dies tun, sehen wir:

  • Facebook: zur Aktualisierung des Status und seines sozialen Netzwerkgraphen;
  • Google: zur Vorhersage wirtschaftlicher Aktivitäten und zur Verbesserung der Effizienz von Online-Werbung;
  • Foursquare: für seine 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 Web-Scraping-Tools und verfügen über aktive Communities.

Die Unterschiede zeigen sich, wenn wir uns die Zielgruppe ansehen. Python hat eine sehr leicht zu erlernende Syntax und viele hochentwickelte Funktionen. Das macht es für Anfänger und nicht-technische Nutzer attraktiver.

R mag auf den ersten Blick etwas einschüchternd wirken, ist jedoch stärker auf statistische Analysen ausgerichtet. Es bietet eine größere Auswahl an integrierten Tools zur Datenanalyse und -visualisierung. Daher kann es eine bessere Option 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 Web-Scraping in R. Es bietet leistungsstarke und dennoch einfache Parsing-Funktionen. Pythons BeautifulSoup dient als Inspirationsquelle und ist Teil der tidyverse-Sammlung.

Cool, aber warum sollte man rvest verwenden, wenn R über native Bibliotheken verfügt, die dieselbe Aufgabe erfüllen? Der erste gute Grund ist die Tatsache, dass rvest ein Wrapper über die Pakete httr und xml2 ist. Das bedeutet, dass es sowohl die GET-Anfrage als auch das HTML-Parsing übernimmt.

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

Allerdings sollten wir bedenken, dass Websites zunehmend dynamisch generierte Inhalte enthalten. Die Gründe dafür sind vielfältig: Performance, Benutzererfahrung und viele andere. Da rvest die Ausführung von JavaScript nicht bewältigen kann, sollten Sie hier nach einer Alternative suchen.

Scraping mit R

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

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

Einrichten der Umgebung

Zunächst müssen Sie jedoch sicherstellen, dass Sie über alles verfügen, was Sie zum Schreiben des Codes benötigen.

Was die IDE betrifft, haben Sie zwei Möglichkeiten:

  • ein R-Plugin für Visual Studio Code installieren;
  • RStudio herunterladen, das entwickelt wurde, um das Programmieren in R mühelos zu gestalten.

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

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 ein neues leeres Verzeichnis. Ich werde den Code in einer neuen Datei namens „goodreads-rvest.r“ schreiben.

Vorstellung des Browsers

Bevor du nun die Daten extrahierst, musst du festlegen, welche Daten du benötigst. Rvest unterstützt sowohl CSS- als auch XPath-Selektoren, also wähle deine bevorzugte Methode. 

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

Wenn du dich mit HTML nicht auskennst, gibt es auch einige nicht-technische Optionen. Chrome bietet beispielsweise die Browser-Erweiterung SelectorGadget an. Damit kannst du an eine beliebige Stelle auf der Seite klicken und dir wird der CSS-Selektor angezeigt, mit dem du die Daten abrufen kannst.

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

Rufe die Ziel-URL in deinem Browser auf und scrolle nach unten zum Abschnitt „Community Reviews“. Klicke dann mit der rechten Maustaste darauf und wähle „Inspect“, um die Entwicklertools zu öffnen.

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

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 hat fünf Span-Elemente als Kinder, die Anzahl der Sterne, die ein Benutzer vergeben kann. Wir betrachten die farbigen Elemente, die die Klasse „p10“ haben.

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 sehen Sie den Fortschritt der Paketinstallation.

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

#install.packages('rvest')

Nun müssen Sie die Bibliothek laden (oder importieren):

library(rvest)

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

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

Das Ergebnis ist nun in der Variablen „book_html“ gespeichert, was Sie auch sehen können, indem Sie einfach in die Konsole eingeben:

Wenn Sie zu irgendeinem Zeitpunkt die offizielle Dokumentation für eine Funktion einsehen möchten, die Sie verwenden möchten, geben Sie in die Konsole ein:

help(function_name) 

RStudio öffnet einen HTTP-Server mit einem direkten Link zu den Dokumenten. Für `read_html` lautet die Ausgabe:

Um die Liste der Bewertungen zu erhalten, verwende ich die Funktion `html_elements`. Sie 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 durchlaufen werde, um das Datum und die Bewertung jedes einzelnen Elements zu erhalten:

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

Man kann die Operanden verketten (wie Sie später in diesem Leitfaden sehen werden), wodurch sich viele lokale Variablen einsparen lassen. Die vorherige Codezeile, geschrieben ohne den Pipe-Operator, würde wie folgt aussehen:

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

Um die Daten zu sammeln, initialisiere ich zwei Vektoren außerhalb der Schleife. Nach einem kurzen Blick auf die Website kann ich garantieren, dass beide Vektoren die gleiche 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, ist das Datum ein Anker-Element mit der Klasse „reviewDate“.

Die Bewertung ist ein Span-Element mit der Klasse „staticStars“ und enthält fünf Span-Elemente für jeden Stern. Wenn der Nutzer einen Stern vergeben hat, erhält das Span-Element den Klassennamen „p10“, während die übrigen den Klassennamen „p0“ erhalten.

Der Code sieht wie folgt 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 Bewertung) angewendet. Außerdem habe ich die Funktion `html_text` verwendet, um den Textinhalt des gefundenen Elements zu extrahieren. 

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

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

Und das Endergebnis sieht wie folgt aus:

Speichern der Ergebnisse

Wir alle wissen, dass Scraping sinnlos ist, wenn die Ergebnisse nicht irgendwo gespeichert werden. In R ist das Schreiben in eine CSV-Datei ganz einfach:

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

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

Das Ergebnis muss eine Matrix oder ein DataFrame sein (was bereits der Fall ist), andernfalls wird eine Konvertierung versucht. Führen Sie den Code aus und überprüfen Sie das Projektverzeichnis. Sie werden sehen, dass Sie die vorherige Tabelle in einem Texteditor, einem Excel-Dokument usw. öffnen können.

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

Mehr noch: Gehen Sie zurück zu Ihrem Browser und klicken Sie auf die zweite Seite. Sie werden feststellen, dass sich die Liste ändert, die URL jedoch nicht. Das bedeutet, dass ein Status verwendet wird, um einen weiteren Abschnitt der Liste dynamisch zu laden.

In solchen Situationen ist rvest möglicherweise nicht hilfreich. Stattdessen kann ein automatisierter Browser 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 Folgeübung offenlassen.

Fazit

Ich hoffe, dieses Tutorial hat Ihnen eine solide Grundlage für das Web-Scraping mit R vermittelt. Nun können Sie leichter eine Entscheidung über den Tech-Stack Ihres nächsten Projekts treffen.

Beachten Sie jedoch bitte, dass dieser Artikel nicht alle Herausforderungen des Web-Scrapings abgedeckt hat. Sie finden diese als Konzepte ausführlicher in diesem selbsterklärenden Leitfaden.

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

Raluca Penciuc ist Full-Stack-Entwicklerin bei WebScrapingAPI. Sie entwickelt Scraper, verbessert 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.