Forum: PC-Programmierung Website parsen und ausgeben


von Robin F. (gehacktes)


Angehängte Dateien:

Lesenswert?

Nabend,

ich möchte auf einem alten Android Tablet eine Anzeigetafel 
programmieren und mir dort Wetter, Benzinpreise, Kalender, News, etc. 
wie hier 
https://baublog.ozerov.de/2016/01/wand-pc-fuer-smart-home-mit-fhem-und-tablet-ui/ 
anzeigen lassen.

Um die Anzeige aber auch auf Handy und PC angucken zu können, habe ich 
mir überlegt eine Website zu programmieren.

Zunächst habe ich im Internet geguckt wie ich HTML Seiten auslesen 
(parsen) kann. Dabei bin ich schnell auf PYTHON in Verbindung mit 
BeautifulSoup gestoßen. Damit klappt das auslesen der entsprechenden 
Seiten hervorragend.
Nachdem ich das hinbekommen habe ist mir jetzt nicht klar, wie ich 
PYTHON in meine Website so integrieren kann, dass diese den PYTHON 
Script in bestimmten Zeitabständen automatisch ausführt um die Daten zu 
beschaffen.
Es ist wohl irgendwie möglich mit PHP aber das hat bisher bei mir nicht 
geklappt. Dadurch habe ich mich jetzt doch dazu entschlossen zu gucken 
wie das mit JavaScript funktioniert, da diese ja bekannterweise gut mit 
HTML kombinierbar ist. Da bin ich auf Node.js und Cheerio gestoßen.
Das klappt auch relativ gut (zumindest bei der Wetter.de Seite).

Jetzt habe ich versucht das in eine HTML zu integrieren bekomme aber im 
Browser eine Fehlermeldung "Uncaught ReferenceError: require is not 
defined".

Kann mir jemand weiterhelfen?

Genaugenommen will ich nur wissen wie ich meinen Daten regelmäßig aus 
den Internetseiten laden kann und dann anschließend auf meine Website 
darstellen kann.

Ich habe mal im Anhang sowohl den PYTHON Script als auch den Javascript 
Code inklusive HTML Code eingestellt.

von Kolja L. (kolja82)


Lesenswert?

Robin F. schrieb:
> Dabei bin ich schnell auf PYTHON in Verbindung mit
> BeautifulSoup gestoßen. Damit klappt das auslesen der entsprechenden
> Seiten hervorragend.

Nur weil ich letztens etwas ähnliches gesucht habe: https://scrapy.org/
Bei deinem Problem kann ich leider (noch) nicht helfen.

von Robin F. (gehacktes)


Lesenswert?

Danke erstmal.
Wenn ich das richtig verstehe ist das nur eine andere Variante um eine 
html zu parsen.

Mein Problem mit Python ist nur, ich weiß nicht wie ich per html, 
Javascript oder PHP vernünftig bzw. überhaupt meinen PYTHON Script 
ausführen lassen kann. Die Verarbeitung wäre glaube eher weniger das 
Problem. Ich würde beispielsweise die Daten in eine .txt speichern und 
per Javascript in meine Website implementieren.

von Carl D. (jcw2)


Lesenswert?

Das muß das Frontend machen, sprich in index.html integriert sein.
Les mal:
https://www.w3schools.com/js/js_timing.asp

von Hirgl (Gast)


Lesenswert?

Anmerkungen meinerseits, um zum einen meinen Senf dazuzugeben, und zum 
anderen Dir zukünftig die Nerven zu schonen:

1. Bevor Du aus HTML parst, such mal ob es nicht evtl die Daten auch per 
API gibt. Oft sind die für privat kostenlos (bei geringer Nutzung). 
Vorteil ist daß Du nicht jedesmal wenn der Webdesigner eine Inspiration 
hat den Scraper anpassen musst.

2. Trenne das Sammeln vom Darstellen. Schiebe die Daten in zB MySQL (via 
cron alle x Minuten). Zusammen mit id und timestamp baust Du über die 
Zeit eine Datensammlung auf, die Du evtl mal auswerten willst (zB 
Spritpreisverlauf).

3. Trenne Layout vom Programmcode. Entweder "im Code" wie es zB PHP 
erlaubt (oben den Code, unten im HTML nur noch <?php echo $var; ?>). 
Oder besser einen richtigen Template-Engine, wie zB Smarty bei PHP.

4. Wäge ab, ob Du wirklich einen extra Parser einbinden willst, oder die 
Bordmittel der Sprache Deiner Wahl ausreichen. Ich nutze zB Perl dafür 
und habe noch nie zum HTML parsen was extra gebraucht. KISS-Prinzip.

5. Javascript. Würde ich nur für AJAX verwenden; und nein, man braucht 
den ganzen jquery/cheerio/etc Overhead nicht. Auch nodejs ist nur 
gehyped weil Hipster-DevOps bloß noch Fragemente zusammenkopieren, aber 
nicht mehr richtig programmieren können. Bevor ich Zeit damit 
verschwende um ein npm-Modul zu ergoogeln schreibe ich die paar Zeilen 
selber (Hallo left-pad). Außerdem: Sicherheit.

von Robin F. (gehacktes)


Lesenswert?

Hirgl schrieb:
> Anmerkungen meinerseits, um zum einen meinen Senf dazuzugeben, und zum
> anderen Dir zukünftig die Nerven zu schonen:
>
> 1. Bevor Du aus HTML parst, such mal ob es nicht evtl die Daten auch per
> API gibt. Oft sind die für privat kostenlos (bei geringer Nutzung).
> Vorteil ist daß Du nicht jedesmal wenn der Webdesigner eine Inspiration
> hat den Scraper anpassen musst.

Du hast sicherlich recht, ich möchte aber nicht einfach von 
irgendwelchen Seiten die Infos erhalten sondern dazu auch noch lernen 
und gucken wie ich unabhängig alles was ich möchte auslesen kann.

> 2. Trenne das Sammeln vom Darstellen. Schiebe die Daten in zB MySQL (via
> cron alle x Minuten). Zusammen mit id und timestamp baust Du über die
> Zeit eine Datensammlung auf, die Du evtl mal auswerten willst (zB
> Spritpreisverlauf).

Kann ich hier mit PYTHON arbeiten oder wie du unten schreibst lieber mit 
Perl? Bei PYTHON hätte ich wieder das Problem, wie wird das Programm 
automatisch gestartet.

> 4. Wäge ab, ob Du wirklich einen extra Parser einbinden willst, oder die
> Bordmittel der Sprache Deiner Wahl ausreichen. Ich nutze zB Perl dafür
> und habe noch nie zum HTML parsen was extra gebraucht. KISS-Prinzip.

Ich gucke mal was ich hierzu raus finde und ob ich hiermit an mein Ziel 
kommen.

> 5. Javascript. Würde ich nur für AJAX verwenden; und nein, man braucht
> den ganzen jquery/cheerio/etc Overhead nicht. Auch nodejs ist nur
> gehyped weil Hipster-DevOps bloß noch Fragemente zusammenkopieren, aber
> nicht mehr richtig programmieren können. Bevor ich Zeit damit
> verschwende um ein npm-Modul zu ergoogeln schreibe ich die paar Zeilen
> selber (Hallo left-pad). Außerdem: Sicherheit.

Hierzu habe ich noch nichts gefunden wie man das ohne die zusätzlichen 
inits bewerkstelligen kann.

von Hirgl (Gast)


Lesenswert?

Robin F. schrieb:
> Du hast sicherlich recht, ich möchte aber nicht einfach von
> irgendwelchen Seiten die Infos erhalten sondern dazu auch noch lernen
> und gucken wie ich unabhängig alles was ich möchte auslesen kann.

Löblich :) Allerdings mußt Du bei einer API auch die Anfragen stellen 
und die Daten verarbeiten. Da meist über json. Aber zugegeben, parsen 
(regexp) lernen schadet überhaupt nicht. Rechne aber damit ab und zu 
updaten zu müssen.

> Kann ich hier mit PYTHON arbeiten oder wie du unten schreibst lieber mit
> Perl? Bei PYTHON hätte ich wieder das Problem, wie wird das Programm
> automatisch gestartet.
Du kannst mit allem arbeiten, womit Du umgehen kannst. Python, Perl, 
PHP, Bash, usw. Solange Du damit
a) die gewünschte Webseite abrufen,
b) Texte parsen,
c) Daten in eine Datenbank schreiben
kannst.
Ausführen kann man das ganz einfach als Cronjob.

> Hierzu habe ich noch nichts gefunden wie man das ohne die zusätzlichen
> inits bewerkstelligen kann.
Was bewerkstelligen? Zerlege die Aufgabe und mache keine eierlegende 
Wollmilchsau:
Skript 1 (via cron): pullen, parsen, in DB schreiben.
Skript 2 (via httpd): aus DB lesen, HTML an Browser liefern.

von Robin F. (gehacktes)


Lesenswert?

Hirgl schrieb:
>> Kann ich hier mit PYTHON arbeiten oder wie du unten schreibst lieber mit
>> Perl? Bei PYTHON hätte ich wieder das Problem, wie wird das Programm
>> automatisch gestartet.
> Du kannst mit allem arbeiten, womit Du umgehen kannst. Python, Perl,
> PHP, Bash, usw. Solange Du damit
> a) die gewünschte Webseite abrufen,
> b) Texte parsen,
> c) Daten in eine Datenbank schreiben
> kannst.
> Ausführen kann man das ganz einfach als Cronjob.

Ah super, dann belese ich mich mal zum Thema Cronjob! Was ich jetzt 
schon gelesen habe, klingt gut.
Ich werde mir dann wohl mal mein Raspberry rauskramen und darauf einen 
FTP Server installieren. Von dort aus werde ich mal gucken wie das mit 
dem Cronjob funktioniert.
Ich spiele morgen erstmal etwas mit dem Cronjob auf dem Laptop rum und 
gucke das ich erstmal das Grundgerüst der Website auf die Beine stellen 
kann.

Ich werde meine Erkenntnisse dann hier gern mit euch teilen!

>> Hierzu habe ich noch nichts gefunden wie man das ohne die zusätzlichen
>> inits bewerkstelligen kann.
> Was bewerkstelligen? Zerlege die Aufgabe und mache keine eierlegende
> Wollmilchsau:
> Skript 1 (via cron): pullen, parsen, in DB schreiben.
> Skript 2 (via httpd): aus DB lesen, HTML an Browser liefern.

Das werde ich mir zu Herzen nehmen. Ich lese ja aktuell mit Python ja 
schon die Daten aus. Dann werde ich die Daten in einer .txt speichern 
und gucken das ich die vernünftig in die Website einlese.

Wenn das alles nach meinen Vorstellungen funktioniert, implementierte 
ich noch ein ESP8266 und werde Temperatursensoren usw. auch noch mit 
anzeigen lassen.

Erstmal vielen Dank für die Hilfe!

von trampi (Gast)


Lesenswert?

Du könntest auch in Python einen kleinen WebServer implementieren mit 
z.B. Bottle https://bottlepy.org/docs/dev/, und deine Funktion/Skript 
dann über den Webserver starten. D.h. du machst über HTTP eine Anfrage 
an den Python webserver,der führt dir dein Skript aus und gibt die 
Antwort wieder zurück an die Webseite. Das geht ganz gut über 
Ajax-Anfragen. Entweder mit jQuery, oder, aus meiner Sicht schlanker 
falls du jQuery sonst nicht brauchst, mit xmlhttprequest. Oder aber wie 
jmd. schon erwähnt hat, schreibst du die mit einem Cronjob all paar 
Stunden in eine Datenbank, welche dann von HTML und JavaScript 
integriert werden kann.

von trampi (Gast)


Lesenswert?

Robin F. schrieb:
> Wenn das alles nach meinen Vorstellungen funktioniert, implementierte
> ich noch ein ESP8266 und werde Temperatursensoren usw. auch noch mit
> anzeigen lassen.

Wieso nicht direkt alles mit dem ESP8266 machen? Ich meine der hat 
locker genügend Rechenleistung um die Daten zu sammeln, und in dein HTML 
zu integrieren. Die Darstellung erfolgt ja dann sowieso im Browser, dass 
rendern übernimmt also eh die CPU des Computers.

von trampi (Gast)


Lesenswert?

trampi schrieb:
> Robin F. schrieb:
>> Wenn das alles nach meinen Vorstellungen funktioniert, implementierte
>> ich noch ein ESP8266 und werde Temperatursensoren usw. auch noch mit
>> anzeigen lassen.
>
> Wieso nicht direkt alles mit dem ESP8266 machen? Ich meine der hat
> locker genügend Rechenleistung um die Daten zu sammeln, und in dein HTML
> zu integrieren. Die Darstellung erfolgt ja dann sowieso im Browser, dass
> rendern übernimmt also eh die CPU des Computers

Also ich meine dass der ESP dir als Webserver dient, und dem Tablet die 
Seite zur Verfügung stellt.

von Robin F. (gehacktes)


Lesenswert?

trampi schrieb:
> Du könntest auch in Python einen kleinen WebServer implementieren mit
> z.B. Bottle https://bottlepy.org/docs/dev/, und deine Funktion/Skript
> dann über den Webserver starten. D.h. du machst über HTTP eine Anfrage
> an den Python webserver,der führt dir dein Skript aus und gibt die
> Antwort wieder zurück an die Webseite. Das geht ganz gut über
> Ajax-Anfragen. Entweder mit jQuery, oder, aus meiner Sicht schlanker
> falls du jQuery sonst nicht brauchst, mit xmlhttprequest. Oder aber wie
> jmd. schon erwähnt hat, schreibst du die mit einem Cronjob all paar
> Stunden in eine Datenbank, welche dann von HTML und JavaScript
> integriert werden kann.

Das überschreitet aktuell meinen Horizont.
Ich bin noch nicht so sehr tief in der Materie und versteh noch nicht 
richtig was du mir hier sagen will. :)

von Robin F. (gehacktes)


Lesenswert?

trampi schrieb:
> trampi schrieb:
>> Robin F. schrieb:
>>> Wenn das alles nach meinen Vorstellungen funktioniert, implementierte
>>> ich noch ein ESP8266 und werde Temperatursensoren usw. auch noch mit
>>> anzeigen lassen.
>>
>> Wieso nicht direkt alles mit dem ESP8266 machen? Ich meine der hat
>> locker genügend Rechenleistung um die Daten zu sammeln, und in dein HTML
>> zu integrieren. Die Darstellung erfolgt ja dann sowieso im Browser, dass
>> rendern übernimmt also eh die CPU des Computers
>
> Also ich meine dass der ESP dir als Webserver dient, und dem Tablet die
> Seite zur Verfügung stellt.

Das ist auch eine gute Idee. Ich fange jetzt erstmal klein an und gucke 
wie ich die Daten dargestellt bekomme. Wenn ich soweit bin gucke ich mal 
ob ich das direkt mit dem ESP mache oder mit einem Raspberry oder gucke 
wie was du eben noch gemeint hast. Mit dem Python Webserver.

von Benjamin U. (ben123)


Lesenswert?

Robin F. schrieb:
> trampi schrieb:
>> ...Du könntest auch in Python einen kleinen WebServer implementieren mit
>> z.B. Bottle https://bottlepy.org/docs/dev/, und deine Funktion/Skript
>> dann über den Webserver starten. D.h. du machst über HTTP eine Anfrage...
>
> Das überschreitet aktuell meinen Horizont.
> Ich bin noch nicht so sehr tief in der Materie und versteh noch nicht
> richtig was du mir hier sagen will. :)

Das waere die schoenste Loesung, du koenntest alles in einer Datei 
haben. Du hast die Funktionen ja schon geschrieben, du musst das einfach 
in die Route packen und dann HTML Code ausgeben.

Du musst dann nicht mit AJAX arbeiten, du kannst das auch einfach mit 
dem Refresh machen:

<meta http-equiv="refresh" content="5">

Reicht voellig aus, deine Website zeigt ja nur Daten an. Bei jedem 
Aufruf werden die Funktionen neu durchlaufen und die Daten aktualisiert.

Fertig :)

von Walter T. (nicolas)


Lesenswert?

In der zweiten Auflage von "Head First Python" von Paul Barry with als 
Lehrbeispiel ein kleiner Webserver auf Basis von flask programmiert, das 
Ganze mundgerecht und sauber erklärt. Falls der TO Zugriff auf eine 
Hochschulbibliothek hat, wäre das auch ein Ansatz. (Auch ansonsten ist 
das Buch sein Geld wert, wenn man die "Brain Friendly Guide"-Serie mag.)

von Spaßverderber (Gast)


Lesenswert?

Nur der Vollständigkeit halber ein kleines Zitat aus den AGB der Seite, 
die der TE "parsen und ausgeben" möchte:
1
Die Suche im clever-tanken.de-Internetangebot ist kostenfrei. Ein Publikationsrecht von einzelnen Informationen von clever-tanken.de steht dem Nutzer im Rahmen des persönlichen Gebrauchs, insbesondere zur Darstellung und Verlinkung in sozialen Netzwerken zu. Eine weitergehende und umfängliche Nutzung der von clever-tanken.de bereitgestellten Informationen ist ohne Einverständniserklärung seitens clever-tanken.de nicht gestattet. Insbesondere ist es nicht gestattet, eigene Robots, Webcrawler oder sonstige Automatismen zu programmieren und die Inhalte von clever-tanken.de systematisch und umfassend in anderen Medien darzustellen oder für sonstige Zwecke zu extrahieren und zu verarbeiten.

Sei also sehr sehr vorsichtig, und pack die geklauten Informationen blos 
nicht irgendwo hin, wo sie von extern zugreifbar sind.

von Robin F. (gehacktes)


Lesenswert?

Benjamin U. schrieb:
> Robin F. schrieb:
>> trampi schrieb:
>>> ...Du könntest auch in Python einen kleinen WebServer implementieren mit
>>> z.B. Bottle https://bottlepy.org/docs/dev/, und deine Funktion/Skript
>>> dann über den Webserver starten. D.h. du machst über HTTP eine Anfrage...
>>
>> Das überschreitet aktuell meinen Horizont.
>> Ich bin noch nicht so sehr tief in der Materie und versteh noch nicht
>> richtig was du mir hier sagen will. :)
>
> Das waere die schoenste Loesung, du koenntest alles in einer Datei
> haben. Du hast die Funktionen ja schon geschrieben, du musst das einfach
> in die Route packen und dann HTML Code ausgeben.
>
> Du musst dann nicht mit AJAX arbeiten, du kannst das auch einfach mit
> dem Refresh machen:
>
> <meta http-equiv="refresh" content="5">
>
> Reicht voellig aus, deine Website zeigt ja nur Daten an. Bei jedem
> Aufruf werden die Funktionen neu durchlaufen und die Daten aktualisiert.
>
> Fertig :)

Super vielen Dank.

Ich guck mir das mal genauer an :)

Ich bin aktuell auch noch nicht so viel weiter. Das Designe steht soweit 
aber ich habe noch Probleme mit dem implementieren der Daten. Von daher 
bietet es sich ja an sich das Thema doch nochmal genauer anzugucken.

von Robin F. (gehacktes)


Lesenswert?

Walter T. schrieb:
> In der zweiten Auflage von "Head First Python" von Paul Barry with als
> Lehrbeispiel ein kleiner Webserver auf Basis von flask programmiert, das
> Ganze mundgerecht und sauber erklärt. Falls der TO Zugriff auf eine
> Hochschulbibliothek hat, wäre das auch ein Ansatz. (Auch ansonsten ist
> das Buch sein Geld wert, wenn man die "Brain Friendly Guide"-Serie mag.)

Vielen Dank! Auch dieses Tutorial gucke ich mir mal an :)

@Spaßverderber: Oh Danke für die Info. Darüber hatte ich noch gar nicht 
nachgedacht! Ich habe auf keinen Fall vor die Daten weiter zu geben. Ich 
werde mal gucken ob ich noch ne Alternative Seite finde um solche Infos 
zu bekommen.

: Bearbeitet durch User
Beitrag #5970495 wurde von einem Moderator gelöscht.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.