Text aus Webseite mit Javascript

Begonnen von TechnoTron, 11 Mai 2024, 14:34:45

Vorheriges Thema - Nächstes Thema

TechnoTron

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
Das Käseparadoxon.

Käse hat Löcher.
Je mehr Käse desto mehr Löcher.
Je mehr Löcher desto weniger Käse.

betateilchen

#1
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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

TomLee

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

Aurel_B

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> [...]

betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

TechnoTron

Zitat von: Aurel_B am 12 Mai 2024, 12:30:09
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> [...]


Stimmt, da habe ich wohl zu schnell voreilige Schlüsse gezogen.


Zitat von: betateilchen am 12 Mai 2024, 12:39:53
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.

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!
Das Käseparadoxon.

Käse hat Löcher.
Je mehr Käse desto mehr Löcher.
Je mehr Löcher desto weniger Käse.