FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: TechnoTron am 11 Mai 2024, 14:34:45

Titel: Text aus Webseite mit Javascript
Beitrag von: TechnoTron am 11 Mai 2024, 14:34:45
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
Titel: Aw: Text aus Webseite mit Javascript
Beitrag von: betateilchen am 11 Mai 2024, 15:19:27
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.
Titel: Aw: Text aus Webseite mit Javascript
Beitrag von: TomLee am 11 Mai 2024, 16:31:25
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
Titel: Aw: Text aus Webseite mit Javascript
Beitrag 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> [...]
Titel: Aw: Text aus Webseite mit Javascript
Beitrag 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.
Titel: Aw: Text aus Webseite mit Javascript
Beitrag von: TechnoTron am 12 Mai 2024, 18:03:32
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!