Hallo zusammen,
ich stehe vor einer Herausforderung und hoffe, dass mir jemand aus der Community helfen kann.
Ich möchte bestimmte Daten von einer Webseite abfragen, deren Inhalt dynamisch über ein JavaScript-Skript generiert wird. Leider kann das HTTPMOD Modul, soweit ich weiß, diese dynamisch generierten Inhalte nicht direkt abrufen.
Hat jemand Erfahrungen oder Ideen, wie ich solche dynamischen Inhalte effektiv abgreifen kann? Bei meiner recherche bin ich auf Headless Browsers wie Selenium gestoßen um den JavaScript-Code auszuführen und den daraus resultierenden Text zu extrahieren. Aber das ist relativ viel Aufwand.
Vielen Dank im Voraus für eure Unterstützung und Vorschläge!
Details:
Webseite: https://www.wienenergie.at/indexwerte/
Wunschtext als Reading: FM 22 Index Base, FM 22 Index Peak, FM 22 Index
LG
Tobias
Zitat von: TechnoTron am 11 Mai 2024, 14:34:45Bei meiner recherche bin ich auf Headless Browsers wie Selenium gestoßen um den JavaScript-Code auszuführen und den daraus resultierenden Text zu extrahieren. Aber das ist relativ viel Aufwand.
Das ist doch nicht kompliziert, chrome bringt das von Haus aus mit:
chrome --headless --disable-gpu --dump-dom https://www.wienenergie.at/indexwerte/ >wienenergie.txt
auf einer Betriebssystemkonsole ausgeführt, liefert mir den Webseiteninhalt in eine Datei, in der sich dann auch die gesuchten Werte finden.
Hallo,
folgende Funktion könntest mit einem at in regelmäßigen Abständen aufrufen:
sub testy {
my $SELF = shift;
my $url = shift;
HttpUtils_NonblockingGet({
url=>$url,
callback=>sub($$$){
return readingsSingleUpdate($defs{$SELF}, "error", "error: $_[1]", 1) if($_[1]);
my $ret = Encode::encode("UTF-8", Encode::decode("ISO-LATIN-1", $_[2]));
$ret =~ m,.*<tbody>.*?.center..>(\d+\,\d+)<.*?.center..>(\d+\,\d+)<.*?<strong>(\d+\,\d+)<,gms;
my $v1= $1;
my $v2= $2;
my $v3= $3;
readingsSingleUpdate($defs{$SELF}, "FM_22_Index_Base", $v1, 1);
readingsSingleUpdate($defs{$SELF}, "FM_22_Index_Peak", $v2, 1);
readingsSingleUpdate($defs{$SELF}, "FM_22_Index", $v3, 1);
}
})
}
ergäbe dann sowas:
defmod at_example at +*01:00:00 {testy($SELF,'https://www.wienenergie.at/indexwerte')}
setstate at_example Next: 16:59:00
setstate at_example 2024-05-11 16:27:58 FM_22_Index 57,3545
setstate at_example 2024-05-11 16:27:58 FM_22_Index_Base 57,57
setstate at_example 2024-05-11 16:27:58 FM_22_Index_Peak 53,26
Gruß
Thomas
Zitat von: TechnoTron am 11 Mai 2024, 14:34:45ich stehe vor einer Herausforderung und hoffe, dass mir jemand aus der Community helfen kann.
Ich möchte bestimmte Daten von einer Webseite abfragen, deren Inhalt dynamisch über ein JavaScript-Skript generiert wird. Leider kann das HTTPMOD Modul, soweit ich weiß, diese dynamisch generierten Inhalte nicht direkt abrufen.
Hat jemand Erfahrungen oder Ideen, wie ich solche dynamischen Inhalte effektiv abgreifen kann? Bei meiner recherche bin ich auf Headless Browsers wie Selenium gestoßen um den JavaScript-Code auszuführen und den daraus resultierenden Text zu extrahieren. Aber das ist relativ viel Aufwand.
Als Nebenkommentar: die Werte werden scheinbar gar nicht per Javascript geladen? Siehe:
fetch -o - 'https://www.wienenergie.at/indexwerte/' | grep Mai
[...] data-align=\"center\">Mai 2024<\/td><td class=\"has-text-align-center\" data-align=\"center\">57,57<\/td> [...]
Zitat von: Aurel_B am 12 Mai 2024, 12:30:09Als Nebenkommentar: die Werte werden scheinbar gar nicht per Javascript geladen?
Natürlich nicht, sonst würde auch der Codeschnipsel von TomLee nicht funktionieren.
Man kann das auch einfach per HTTPMOD auslesen.
Aber zumindest wollte ich oben eine einfache Variante zum Theme "headless browser" zeigen und die Behauptung widerlegen, dass das kompliziert oder viel Aufwand sei.
Zitat von: Aurel_B am 12 Mai 2024, 12:30:09Zitat von: TechnoTron am 11 Mai 2024, 14:34:45ich stehe vor einer Herausforderung und hoffe, dass mir jemand aus der Community helfen kann.
Ich möchte bestimmte Daten von einer Webseite abfragen, deren Inhalt dynamisch über ein JavaScript-Skript generiert wird. Leider kann das HTTPMOD Modul, soweit ich weiß, diese dynamisch generierten Inhalte nicht direkt abrufen.
Hat jemand Erfahrungen oder Ideen, wie ich solche dynamischen Inhalte effektiv abgreifen kann? Bei meiner recherche bin ich auf Headless Browsers wie Selenium gestoßen um den JavaScript-Code auszuführen und den daraus resultierenden Text zu extrahieren. Aber das ist relativ viel Aufwand.
Als Nebenkommentar: die Werte werden scheinbar gar nicht per Javascript geladen? Siehe:
fetch -o - 'https://www.wienenergie.at/indexwerte/' | grep Mai
[...] data-align=\"center\">Mai 2024<\/td><td class=\"has-text-align-center\" data-align=\"center\">57,57<\/td> [...]
Stimmt, da habe ich wohl zu schnell voreilige Schlüsse gezogen.
Zitat von: betateilchen am 12 Mai 2024, 12:39:53Zitat von: Aurel_B am 12 Mai 2024, 12:30:09Als Nebenkommentar: die Werte werden scheinbar gar nicht per Javascript geladen?
Natürlich nicht, sonst würde auch der Codeschnipsel von TomLee nicht funktionieren.
Man kann das auch einfach per HTTPMOD auslesen.
Aber zumindest wollte ich oben eine einfache Variante zum Theme "headless browser" zeigen und die Behauptung widerlegen, dass das kompliziert oder viel Aufwand sei.
Da danke ich dir auch, werde mich da mal ein wenig mehr reinlesen, ermöglicht ganz neue Dinge.
Danke an alle, das "Problem" wurde behoben!