os-benji
Goto Top

Tabelle einer Webseite abgreifen und auf einer seperaten Webseite anzeigen

Hi,

ich habe hier eine Aufgabe die mich vor ein Rätsel stellt. Ich habe eine Webseite (http://xxx.de/Veranstaltungen.html) auf der eine HTML Tabelle mit Daten ist. Diese Tabelle möchte ich gerne ausschneiden und auf einer zweiten Webseite (http://yyy.de/Index.html) darstellen lassen. Ich weiß, das man nicht einfach Daten einer Webseite abgreift um sie auf einer anderen Webseite darstellen zu lassen aber ich habe mir vorher die Erlaubnis aller Verantwortlichen eingeholt sodass diese Bedenken gleich zerstreut werden können.

Eine Möglichkeit die ich bisher versucht habe ist die Webseite einfach als iframe darstellen zu lassen. Leider ist das nicht wirklich zufriedenstellend da vor der Tabelle noch Text ist und man beim laden eine Cookie Meldung bekommt.

Zweiter Versuch war die Webseite mit Python zu scrapen und mir einfach die Tabelle ausgeben zu lassen. Das funktioniert, scheitert jedoch an der Tatsache das ich auf der zweiten Webseite kein Framework habe welches den Python Code ausführen könnte.

Mein aktueller Versuch ist mittels Javascript und Puppeteer die Seite zu scrapen, und mir die Tabelle ausgeben zu lassen. Hier scheitere ich aktuell daran, das ich zwar ein Ergebnis habe, dieses jedoch nicht dargestellt bekomme. Anbei mal das Script das ich mir erstellt habe:

const puppeteer = require('puppeteer');  

async function scrapeProduct(url) {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto(url);

    const [el] = await page.$x('//*[@id="DataTables_Table_0_wrapper"]')  
    const txt = await el.getProperty('textContent');  
    const table = await txt.jsonValue();

    browser.close();
}

scrapeProduct('http://xxx.de/Veranstaltungen.html');  

Content-Key: 607260

Url: https://administrator.de/contentid/607260

Printed on: April 16, 2024 at 17:04 o'clock

Member: NordicMike
NordicMike Sep 24, 2020 at 08:39:47 (UTC)
Goto Top
Du könntest es per Python (oder sonst was) abholen und auf yyy.de als .html Datei ablegen, dann benötigst du dort kein Framework.
Member: os-benji
os-benji Sep 24, 2020 at 08:52:13 (UTC)
Goto Top
Das ist definitiv eine Möglichkeit, aber leider darf ich keine Computersysteme nutzen. Am besten sollte alles über HTML und JS oder JQuery gemacht werden.
Member: NordicMike
NordicMike Sep 24, 2020 at 08:57:41 (UTC)
Goto Top
Am besten sollte alles über HTML und JS oder JQuery gemacht werden.

Sag ich doch:

(oder sonst was)

Also z.B. so:

Du könntest es per PHP oder JS abholen und auf yyy.de als .html Datei ablegen. Der PHP Code liegt auf yyy.de und holt es vom xxx.de ab und legt es bei sich (yyy.de) ins Verzeichnis.
Mitglied: 145916
145916 Sep 24, 2020 updated at 13:50:06 (UTC)
Goto Top
Prüfe erst mal ob die Zielseite via CORS Header das Skripting auf die selbe Seite eingeschränkt hat. Wenn das der Fall ist kannst du JavaScript erst mal knicken, dann brauchst du z.B. einen Zwischenschritt z.B. über ein PHP Skript das die Tabelle extrahiert und auf deine Seite schreibt.
Bsp:
<?php
# get content of page
$content = file_get_contents('https://administrator.de/latest/');  
# create new DOM Object
$dom = new DOMDocument();
# load HTML into object
$dom->loadHTML($content);
# extract element with id
$node = $dom->getElementById('topics');  
# get html
$result = $dom->saveXML($node);
# and output to page
echo $result;
?>
Statt getElementById kannst du natürlich auch getElementsByTagName usw verwenden, je nachdem wo und wie deine Tabelle liegt.
Member: ASP.NET.Core
Solution ASP.NET.Core Sep 24, 2020 at 12:37:59 (UTC)
Goto Top
Zitat von @os-benji:
Das ist definitiv eine Möglichkeit, aber leider darf ich keine Computersysteme nutzen.

Was soll das heißen? Dass alles clientseitig im Browser gemacht werden soll? Dann sind Bibliotheken wie puppeteer aber der falsche Weg. Die steuern einen Chromium-Browser fern. Somit kann das nicht im Browser selbst funktionieren, sondern nur auf Servern.

Wenn du nur clientseitig per Ajax drauf gehen willst, muss der Inhaber der Seite von der du Daten holen willst den CORS-Header für deine Domain setzen, sonst werden die Anfragen von so ziemlich allen Browsern wegen der Sicherheitspolicy geblockt.

Da würde es sich natürlich auch gleich anbieten, dir eine API zur Verfügung zu stellen. Die liefert dann die gewünschten Daten z.B. als JSON oder XML. Ist sauberer, effizienter und weniger fehleranfällig als in fremden DOMs zu arbeiten. Denn die ändern sich immer mal wieder. Im Regelfall ohne dass du das mitbekommst, bis dir User irgendwie melden, dass die Daten nicht mehr angezeigt werden...
Member: ASP.NET.Core
ASP.NET.Core Sep 24, 2020 at 12:46:11 (UTC)
Goto Top
Dazu sollten die Gefahren solcher simplen Wrapper erwähnt werden: Der Server setzt bei JEDEM Aufruf der eigenen Seite, in der das PHP-Skript eingebunden ist, eine HTTP-Abfrage zur im Skript angegebenen URL ab. Und zwar serverseitig, nicht clientseitig. Da schlagen nicht selten Firewalls oder Rate Limits wie z.B. mod_evasive an, je nachdem wie die Umgebung aussieht.

Ich würde so etwas daher NIE ohne Cache betreiben! Wenn du einen Cache hast der die aktuellen Daten per HTTP Request nur alle 10, 30, 60 Min (je nachdem wie wichtig Aktualität ist) holst, kann das nie passieren. Die Alternative wäre das per Cron regelmäßig zu holen. Ist eine gängige Alternative weil man dann die Latenzzeiten der entfernten Seite nicht hat.

Wie gravierend so was werden kann hängt natürlich stark von der Umgebung ab. In einem 5 Personen Intranet kann man so was (entsprechend dokumentiert) eher machen als auf einer öffentlichen Seite, die bereits einen gewissen Traffic abbekommt. Prinzipiell würde ich mir aber zeitig Gedanken darum machen, bevor nachher was nicht geht oder es Ärger gibt. Automatische Anfragen an Drittanbieter-Dienste sind immer mit Vorsicht zu behandeln, weil man da nicht nur für sich selbst sondern auch für andere Verantwortung mitträgt.
Member: NordicMike
NordicMike Sep 24, 2020 at 13:47:30 (UTC)
Goto Top
Da braucht es nicht einmal einen Cache, wenn man das ganze von PHP aus abholt und als HTML Datei bei sich ablegt.
Das einzige wäre die Frequenz der Aktualisierung, das geht auch ohne Cron, z.B. der erste Zugriff nach Mitternacht (das ist meistens ein Google Crawler), triggert eine PHP Routine an, die die Daten einfach abholt, verarbeitet, filtert und bei sich ablegt. Bei jedem weiteren Zugriff auf die index.php wird dieser trigger dann übersprungen, aber die abgelegte HTML Datei per include wieder eingelesen.