Seite 1 von 2

Daten von Webseite mit R lesen

Verfasst: Mi Jan 15, 2020 2:41 pm
von DanielAC
Hallo zusammen,

ich versuche, eine Webseite mit R auszulesen
(https://www.adac.de/rund-ums-fahrzeug/a ... sche-daten).
Als Ergebnis hätte ich gerne die gezeigten Tabellen in einem Dataframe (linke Seite als Spaltennamen, rechte Seite als Zeile).
Das würde ich dann natürlich gern für mehrere Seiten machen um es nicht per copy paste machen zu müssen.

Mein Ansatz mit rvest oder ähnlichen Methoden ist bis jetzt komplett ins Leere gelaufen. Auch mit selector gadget war ich nicht in der Lage, das richtig auszulesen.

Hat jemand einen Tipp oder Ansatz für mich?

Danke und Gruß
Daniel

Re: Daten von Webseite mit R lesen

Verfasst: Mi Jan 15, 2020 3:04 pm
von bigben
Hallo Daniel,

eine Suche nach "R Web Scraping" fördert viele schöne Anleitungen, wie z. B. https://www.analyticsvidhya.com/blog/20 ... knowledge/ oder http://www.programmingr.com/examples/ex ... craping-r/ oder viele andere.
Bestimmt hast Du schon was durchprobiert und kannst etwas spezifischer erklären, an welcher Stelle Du hängst.
Es ist wahrscheinlicher, dass Dir jemand mit dem letzten Schritt hilft als dass jemand da jetzt eine Komplettlösung für Dich coded (obwohl man in diesem Forum nie weiß...).

LG,
Bernhard

Re: Daten von Webseite mit R lesen

Verfasst: Mi Jan 15, 2020 3:18 pm
von DanielAC
Hi Bernhard,

den ersten Link hatte ich schon gesehen, den zweiten noch nicht.
Ich habe auch versucht, den ersten Link als "Vorlage" zu verwenden, um mir dann die entsprechenden Daten herauszuziehen. Mit dem Selectorgadget kann ich die entsprechenden Stellen auch anklicken und sehe dann, wie sie heißen.
Ich verstehe aber nicht, wie ich dann in R wirklich mit diesem Namen auf den Inhalt des Feldes zugreifen kann. Zum Teil heißen die Einträge in verschiedenen Tabellen auch gleich.
Beispielsweise heißt die Marke "BMW" in der ersten Tabelle ".gjxqXx".
Denselben Namen haben in der nächsten Tabelle die Kraftstoffart und die Motorart.

Mir fehlt jetzt einfach eine Idee, wie ich ein spezifisches Feld anspreche und auslese. Ich bin es von VBA und Excel so gewohnt, dass ich sage "nimm den Wert aus Zelle xy....". Eine entsprechende Möglichkeit wird es hier auch geben, aber ich verstehe es eben nicht.

Das genannte Beispiel hat mir eine Grundidee gegeben, wie ich das anstellen kann, aber ich kann es nicht einfach so umsetzen.

Re: Daten von Webseite mit R lesen

Verfasst: Mi Jan 15, 2020 3:40 pm
von bigben
Geh mal davon aus, dass hier eine Handvoll Leute sitzen, die vielleicht noch nie mit SelectorGadget oder mit rvest gearbeitet haben, grundsätzlich aber bereit wären, ihre Erfahrung zur Verfügung zu stellen.

Du hast Dich also an der von mir verlinkten Seite orientiert, hast

Code: Alles auswählen

webpage <- read_html(url)
erfolgreich durchgeführt und hast gefunden, dass der Selektor ".gjxqXx" zu für Dich relevanten Informationen führt. Dann sollst Du laut Anleitung als nächstes

Code: Alles auswählen

rank_data_html <- html_nodes(webpage,'.gjxqXx')

#Converting the ranking data to text
rank_data <- html_text(rank_data_html)

#Let's have a look at the rankings
head(rank_data)
machen. Hast Du das gemacht, was ist passiert, wie sehen die Fehlermeldungen oder die Ergebnisse aus?

Gruß,
Bernhard

Re: Daten von Webseite mit R lesen

Verfasst: Mi Jan 15, 2020 3:45 pm
von DanielAC
Das habe ich gemacht.

Das Ergebnis von

Code: Alles auswählen

rank_data_html <- html_nodes(webpage,'.gjxqXx')
ist aber eine List of 0, d.h. ein leere Liste.
Das verstehe ich nicht. Hier liegt ja auch mein Problem, die Daten richtig anzusprechen.

Re: Daten von Webseite mit R lesen

Verfasst: Do Jan 16, 2020 10:38 am
von Hufeisen
Ich werde hier zwar nicht helfen können, aber guck doch bitte mal hier:viewtopic.php?f=20&t=11. Es nützt niemandem, wenn wir erst erfragen müssen, was du bisher gemacht hast, was dabei herausgekommen ist und welche Fehlermeldungen sich dabei zeigen.

Re: Daten von Webseite mit R lesen

Verfasst: Do Jan 16, 2020 10:45 am
von DanielAC

Code: Alles auswählen

library(rvest)
url <- "https://www.adac.de/rund-ums-fahrzeug/autokatalog/marken-modelle/bmw/1er-reihe/f20-f21-facelift-2/276907/#technische-daten"
webpage  <- read_html(url)

rank_data_html <- html_nodes(webpage,'.gjxqXx')

rank_data <- html_text(rank_data_html)
Das ist bis jetzt mein Code. Es gibt keine Fehlermeldungen, sondern nur eine leere Liste als Ergebnis (rank_data_html) bzw. einen empty character (rank_data).

Re: Daten von Webseite mit R lesen

Verfasst: Do Jan 16, 2020 1:33 pm
von bigben
Hi,

Ich habe mir mal dieses SelectorGAdget installiert und rvest installiert. Ich kann mühelos auslesen, wieviele Beiträge es bisher in diesem Thread gibt und auf wieviele Seiten er angeschwollen ist:

Code: Alles auswählen

library(rvest)
url <- "http://forum.r-statistik.de/viewtopic.php?f=7&t=2049"
webpage  <- read_html(url)
data_html <- html_nodes(webpage,'.pagination')
str(data_html)
data <- html_text(data_html)
print(data)
führt zu

Code: Alles auswählen

> print(data)
[1] "\n\t\t\t7 Beiträge\n\t\t\t\t\t\t\t• Seite 1 von 1\n\t\t\t\t\t"
[2] "\n\t\t\t7 Beiträge\n\t\t\t\t\t\t\t• Seite 1 von 1\n\t\t\t\t\t"
Versuche ich das gleiche auf der vom OP verlinkten Seite, funktioniert das nicht, auch ich bekomme da schon immer ein leere html_nodes.

Der verlinkten Seite ist zu entnehmen, die Gemischaufbereitung sei "Common Rail". Lasse ich mir aber den Seitenquelltext anzeigen, der für Menschen unlesbar ist, und suche dort nach "Common Rail", dann gibt es Null Treffer. Mit anderen Worte: Was wir da scrapen wollen steht nicht auf dieser Seite. Wahrscheinlich wird es irgendwie von irgendwo anders nachgeladen, wahrscheinlich über eines der über 20 erwähnten JavaScript Scripte.

Irgendwo im Quelltext findet man einen link as="fetch" auf "/page-data/rund-ums-fahrzeug/autokatalog/marken-modelle/bmw/1er-reihe/f20-f21-facelift-2/276907/page-data.json" In diesem JSON dürfte vermutlich alles drin stehen, was Du scrapen willst. Aber wie man da dran kommt?
But to master the art of Web scraping, I’ll highly recommend you to learn HTML & CSS in order to better understand and appreciate what’s happening under the hood.
(von der Website mit der Anleitung zum scrapen)

LG,
Bernhard

Re: Daten von Webseite mit R lesen

Verfasst: Do Jan 16, 2020 2:01 pm
von bigben
Es ist nicht alles verloren! Das hier ergibt erstmal Informationen von der ADAC-Homepage über verschiedene Autos:

Code: Alles auswählen

library(rjson)
autos <- fromJSON(file = paste("http://adac.de/page-data/rund-ums-fahrzeug/autokatalog/marken-modelle/bmw/1er-reihe/f20-f21-facelift-2/276907/page-data.json"))
head(autos)
Was davon jetzt wie anzusprechen und zu verwerten ist, musst Du selbst herausfinden.

LG,
Bernhard

Re: Daten von Webseite mit R lesen

Verfasst: Fr Jan 17, 2020 10:39 am
von DanielAC

Code: Alles auswählen

library(rjson)
autos <- fromJSON(file = paste("http://adac.de/page-data/rund-ums-fahrzeug/autokatalog/marken-modelle/bmw/1er-reihe/f20-f21-facelift-2/276907/page-data.json"))
head(autos)
Danke. Der Code hilft mir. Ich hatte gar nicht gesehen, dass die Daten in json-files abliegen.

Trotzdem bleibe ich an einer Stelle noch hängen:
Die Daten, die mich interessieren, kann ich quasi über

Code: Alles auswählen

autos2<-autos$result$pageContext$fahrzeug$technischeDaten
abgreifen (mit "autos" von dem code oben).

Das Ergebnis ist eine "list of 8". Die 8 Elemente sind die auf der Webseite angezeigten Kategorien
Allgemein, Motor und Antrieb, Maße und Gewichte, Karosserie und Fahrwerk, Messwerte Hersteller, Sicherheitsausstattung, Herstellergarantien, Preise und Ausstattung.

Wenn ich mir beispielsweise

Code: Alles auswählen

autos2[1]
ansehe, ist das Ergebnis:

Code: Alles auswählen

[[1]]
[[1]]$name
[1] "Allgemein"

[[1]]$daten
[[1]]$daten[[1]]
[[1]]$daten[[1]]$name
[1] "Marke"

[[1]]$daten[[1]]$wert
[1] "BMW"


[[1]]$daten[[2]]
[[1]]$daten[[2]]$name
[1] "Modell"

[[1]]$daten[[2]]$wert
[1] "120d"
Kann ich jetzt daraus irgendwie "einfach" einen data.frame machen, der nicht "Allgemein", sondern nur $daten enthält und den Namen aus $daten$name als Überschrift hat?
Es soll letztendlich da als Überschrift stehen "Marke", "Modell",...und in der ersten Zeile dann "BMW", daneben "120d", etc...