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: