Die Mathe-Redaktion - 18.02.2020 16:55 - Registrieren/Login
Auswahl
ListenpunktHome
ListenpunktAktuell und Interessant ai
ListenpunktArtikelübersicht/-suche
ListenpunktAlle Links / Mathe-Links
ListenpunktFach- & Sachbücher
ListenpunktMitglieder / Karte / Top 15
ListenpunktRegistrieren/Login
ListenpunktArbeitsgruppen
Listenpunkt? im neuen Schwätz
ListenpunktWerde Mathe-Millionär!
ListenpunktFormeleditor fedgeo
Schwarzes Brett
Aktion im Forum
Suche
Stichwortsuche in Artikeln und Links von Matheplanet
Suchen im Forum
Suchtipps

Bücher
Englische Bücher
Software
Suchbegriffe:
Mathematik bei amazon
Naturwissenschaft & Technik
In Partnerschaft mit Amazon.de
Kontakt
Mail an Matroid
[Keine Übungsaufgaben!]
Impressum

Bitte beachten Sie unsere Nutzungsbedingungen, die Distanzierung, unsere Datenschutzerklärung und
die Forumregeln.

Sie können Mitglied werden. Mitglieder können den Matheplanet-Newsletter bestellen, der etwa alle 2 Monate erscheint.

Der Newsletter Okt. 2017

Für Mitglieder
Mathematisch für Anfänger
Wer ist Online
Aktuell sind 733 Gäste und 25 Mitglieder online.

Sie können Mitglied werden:
Klick hier.

Über Matheplanet
 
Zum letzten Themenfilter: Themenfilter:
Matroids Matheplanet Forum Index
Moderiert von matph
Informatik » Programmieren » Daten von Webseite mit R lesen
Druckversion
Druckversion
Autor
Kein bestimmter Bereich J Daten von Webseite mit R lesen
mrdjv2
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 05.07.2003
Mitteilungen: 964
Aus: Aachen
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Themenstart: 2020-01-15


Hallo zusammen,

ich versuche von einer Webseite (www.adac.de/rund-ums-fahrzeug/autokatalog/marken-modelle/bmw/1er-reihe/f40/300035/#technische-daten) die aufgeführten Daten in eine Tabelle in R zu überführen (am einfachsten einen data.frame).

All meine Versuche sind bis jetzt fehlgeschlagen. Ich habe mit rvest usw. versucht, etwas auszulesen, aber habe es nie geschafft, die Daten wirklich lesbar hinzubekommen.

Hat jemand einen guten Tipp für mich?

Danke im Voraus.


-----------------
Never underestimate the impossible!



  Profil  Quote  Link auf diesen Beitrag Link
zippy
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 24.10.2018
Mitteilungen: 909
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.1, eingetragen 2020-01-16


Hallo mrdjv2,

der Inhalt dieser Seite wird per JavaScript generiert, so dass ihn ein Web-Scraper, der sich nur den HTML-Code anschaut, gar nicht sehen kann. Um an den Inhalt zu kommen, brauchst du also ein Programm, das das JavaScript ausführt oder zumindest versteht.

Da das für einen Web-Browser kein Problem ist, kannst du dir die Seite einfach aus einem Browser heraus als Text herunterladen (im Firefox: Kontextmenü > Save Page as > Text Files) und erhältst dann die Tabellen als TAB-separierte Listen.

--zippy



  Profil  Quote  Link auf diesen Beitrag Link
mrdjv2
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 05.07.2003
Mitteilungen: 964
Aus: Aachen
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.2, vom Themenstarter, eingetragen 2020-01-16


Hi Zippy,

die Idee hatte ich auch schon. Das klappt auch. Aber das ist leider nicht so geeignet, wenn man das für "mehrere" Seiten machen will.
Für z.B. 10 Seiten kann man das durchaus machen. Für über 100 ist das dann schon ein wenig unschön...

VG
Daniel


-----------------
Never underestimate the impossible!



  Profil  Quote  Link auf diesen Beitrag Link
zippy
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 24.10.2018
Mitteilungen: 909
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.3, eingetragen 2020-01-16


2020-01-16 10:23 - mrdjv2 in Beitrag No. 2 schreibt:
Aber das ist leider nicht so geeignet, wenn man das für "mehrere" Seiten machen will.

Wenn du die Arbeit, den JavaScript-Code zu verstehen, nicht den Browser erledigen lassen willst, kannst du es selbst tun.

Ein Blick in den HTML-Code der Seite zeigt, dass der JavaScript-Code, der den eigentlichen Seiteninhalt liefert, hierher stammt:
HTML
<link as="script" rel="preload" href="/app-19e96cad6151ccdabd34.js"/>

Und ein Blick in diesen JavaScript-Code zeigt, dass die Daten, aus denen der Seiteninhalt erzeugt wird, in Form einer JSON-Datei eingebunden ist:
JavaScript
_ = function (t) {
      var e;
      return "/page-data/"
             + ("/" === t ? "index"
                          : e = (e = "/" === (e = t)[0] ? e.slice(1)
                                                        : e).endsWith("/") ? e.slice(0, -1)
                                                                           : e)
             + "/page-data.json" }

Diese JSON-Datei kann über die recht systematisch aufgebaute URL
https://www.adac.de/page-data/rund-ums-fahrzeug/autokatalog/marken-modelle/bmw/1er-reihe/f40/300035/page-data.json
direkt heruntergeladen werden und enthält die interessanten Informationen quasi als Klartext:
JavaScript
{ "name": "Motor und Antrieb",
  "daten": [ { "name": "Motorart"                     , "wert" : "Diesel"                             },
             { "name": "Kraftstoffart"                , "wert": "Diesel"                              },
             { "name": "Abgasreinigung"               , "wert": "SCR-Kat und NOx-Speicherkat mit DPF" },
             { "name": "Motorbauart"                  , "wert": "Reihe"                               },
             { "name": "Anzahl Zylinder"              , "wert": "4"                                   },
             { "name": "Gemischaufbereitung"          , "wert": "Common Rail"                         },
             { "name": "Aufladung"                    , "wert": "Turbo"                               },
             { "name": "Anzahl Ventile"               , "wert": "4"                                   },
             { "name": "Hubraum"                      , "wert": "1995 ccm"                            },
             { "name": "Leistung in kW"               , "wert": "110"                                 },
             { "name": "Leistung in PS"               , "wert": "150"                                 },
             { "name": "Leistung maximal bei U/min."  , "wert": "4000 U/min"                          },
             { "name": "Drehmoment"                   , "wert": "350 Nm"                              },
             { "name": "Drehmoment maximal bei U/min.", "wert": "1750 U/min"                          },
             { "name": "Antriebsart"                  , "wert": "Front"                               },
             { "name": "Getriebeart"                  , "wert": "Automatikgetriebe"                   },
             { "name": "Anzahl Gänge"                 , "wert": "8"                                   },
             { "name": "Start-/Stopp-Automatik"       , "wert": "Serie"                               },
             { "name": "Schaltpunktanzeige"           , "wert": "-"                                   },
             { "name": "Schadstoffklasse"             , "wert": "Euro 6d-TEMP-EVAP-ISC (WLTP)"        },
             { "name": "Kraftstoffart (2.Antrieb)"    , "wert": "-"                                   }
           ]
}



  Profil  Quote  Link auf diesen Beitrag Link
mrdjv2
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 05.07.2003
Mitteilungen: 964
Aus: Aachen
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.4, vom Themenstarter, eingetragen 2020-01-18


Danke für den Tipp. Die entsprechenden json-files hatte ich sogar in der Zwischenzeit auch gefunden.

Ich müsste jetzt noch diese Informationen in einen Dataframe bringen, bei dem das von "Name" die Überschrift ist und der "Wert" dann entsprechend in der Zeile steht.

Bis jetzt habe ich die html-seite mit VBA als Text heruntergeladen und habe nach den entsprechenden Schlüsselwörtern gesucht um daraus einen Dataframe zu bauen. Das geht grundsätzlich, ist aber nicht so elegant, finde ich.

Auch kann man die json-files schneller laden als die html-files.

Hast du da auch noch einen Tipp für mich?

Wenn ich die json-file in R einlese, sind die für mich interessanten Daten wie folgt abrufbar:
R
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"))
autos2<-autos$result$pageContext$fahrzeug$technischeDaten
 

Autos2 ist eine "list of 8". Auf der entsprechenden Webseite sieht man, dass diese 8 Elemente genau die einzelnen Kategorien sind, die man dann auswählen kann (also "Allgemein", "Motor und Antrieb",...).

Alles, was ich bis jetzt versucht habe, hat nicht so richtig funktioniert. Mein Ansatz war ein "unlist", aber das würde nur nach umständlicher Handarbeit zum Ziel führen, da er mir dann einfach alles hintereinander in eine Zeile schreibt.



-----------------
Never underestimate the impossible!



  Profil  Quote  Link auf diesen Beitrag Link
zippy
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 24.10.2018
Mitteilungen: 909
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.5, eingetragen 2020-01-19


Wenn du je Kategorie einen Dataframe haben willst, kannst in fromJSON den Parameter simplifyVector auf FALSE setzen und dann den Dataframe selbst zusammenbauen:
R
> url <- paste("http://adac.de/page-data/rund-ums-fahrzeug",
               "autokatalog/marken-modelle/bmw/1er-reihe",
               "f20-f21-facelift-2/276907/page-data.json",
               sep = "/")
 
> json <- fromJSON(url, simplifyVector = FALSE)
 
> read.data.frame <- function(json, kategorie) {
    d = json$result$pageContext$fahrzeug$technischeDaten
    k = d[sapply(d, function(t) t$name == kategorie)][[1]]$daten
    data.frame(Name = sapply(k, function(t) t$name),
               Wert = sapply(k, function(t) t$wert))
  }
 
> read.data.frame(json, "Motor und Antrieb")
                            Name                    Wert
1                       Motorart                  Diesel
2                  Kraftstoffart                  Diesel
3                 Abgasreinigung NOx-Speicherkat mit DPF
4                    Motorbauart                   Reihe
5                Anzahl Zylinder                       4
6            Gemischaufbereitung             Common Rail
7                      Aufladung                   Turbo
8                 Anzahl Ventile                       4
9                        Hubraum                1995 ccm
10                Leistung in kW                     140
11                Leistung in PS                     190
12   Leistung maximal bei U/min.              4000 U/min
13                    Drehmoment                  400 Nm
14 Drehmoment maximal bei U/min.              1750 U/min
15                   Antriebsart                    Heck
16                   Getriebeart          Schaltgetriebe
17           Anzahl G<U+00E4>nge                       6
18        Start-/Stopp-Automatik                   Serie
19            Schaltpunktanzeige                   Serie
20              Schadstoffklasse          Euro 6b (NEFZ)
21     Kraftstoffart (2.Antrieb)                       -

Wenn du dagegen alle Kategorien in einen Dataframe packen willst, ist die Standardeinstellung mit simplifyVector = TRUE geeigneter:
R
> json <- fromJSON(url)
 
> do.call(rbind, json$result$pageContext$fahrzeug$technischeDaten$daten)



  Profil  Quote  Link auf diesen Beitrag Link
mrdjv2
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 05.07.2003
Mitteilungen: 964
Aus: Aachen
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.6, vom Themenstarter, eingetragen 2020-01-21


Vielen Dank!

Ich hab jetzt endlich alles so, wie ich es brauche... :-)


-----------------
Never underestimate the impossible!



  Profil  Quote  Link auf diesen Beitrag Link
mrdjv2 hat die Antworten auf ihre/seine Frage gesehen.
mrdjv2 hat selbst das Ok-Häkchen gesetzt.
Neues Thema [Neues Thema]  Druckversion [Druckversion]

 


Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2019 by Matroids Matheplanet
This web site was made with PHP-Nuke, a web portal system written in PHP. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]