Messwerte von Website (lokal) loggen

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Darkskater
User
Beiträge: 6
Registriert: Mittwoch 28. Oktober 2020, 12:33

Hallo zusammen,

folgende Situation:
Zwei Sensoren erfassen einen Messwert (Distanz) und geben diesen über eine "lokale Website" (192.168.0.1) wieder aus. Der dort angezeigte Wert wird händisch alle 2min dokumentiert.
Ist natürlich extrem umständlich...

Gesuchte Lösung:
Ein Skript o.Ä., welches den angezeigten Messwert im 2min Takt automatisch protokolliert. Bestenfalls in einem Format, welches ein einfaches Importieren in Excel ermöglicht.


Hat da jemand Tipps oder kann sonst irgendwie weiterhelfen?
Würde mich sehr freuen. :)
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Zum Lesen von Webseiten gibt es das requests-Modul.
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

..und zum parsen der Informationen würde ich dir BeautifulSoup4 empfehlen
Darkskater
User
Beiträge: 6
Registriert: Mittwoch 28. Oktober 2020, 12:33

Vielen Dank schon mal!
Also requests und BeautifulSoups habe ich jetzt auch schon ergoogelt. Allerdings hapert es bei der Installierung / Importierung in VS Code.
Habe auch nur rudimentäre Grundkenntnisse (1 Modul im Studium, wo mal ein bischen mit Schleifen etc. programmiert wurde).

Eine Grundsätzliche Frage:
Der Arbeitsplatz wo der Laptop (offline) zum Auslesen dieser beiden Sensoren steht ist etwas "ungünstig" für längere Aufenthalte.
Ich habe mir also die Website mit "Seite speichern unter" auf meinen Arbeitslaptop gezogen (file:///C:/Users/.../Desktop/F%C3%BCllstandssensoren/...../XXXXX.htm).
Wenn ich jetzt mit "Vorlagen" aus dem Netz arbeite, kann ich den Pfad der htm-Datei z.B. einfach so einfügen

Code: Alles auswählen

r = requests.get('file:///C:/Users/.../Desktop/F%C3%BCllstandssensoren/...../XXXXX.htm')
um das Ganze zu testen? Auf der lokal gespeicherten Website ist ein Wert in dem auszulesende Feld eingetragen.
Dann müsste doch später nur der Dateipfad durch die richtige Adresse (192.168.0.1) ersetzt werden oder?
Benutzeravatar
sparrow
User
Beiträge: 4183
Registriert: Freitag 17. April 2009, 10:28

@Darkskater: Wenn du eine Seite speicherst, hat dein Browser sie bereits für die Darstellung interpretiert. Es kann also sein, dass die sich signifikant von dem unterscheidet, was du bekommst, wenn du die Seite direkt abrufst.

Soweit ich weiß, kann requests keine lokalen Dateien "anfragen".

Ich würde die Seite auf dem "offline"-Laptop abfragen und das Ergebnis der Abfrage in einer Datei speichern.
Auf deinem Enwitklungssystem lädst du dann an der Stelle, wo eigentlich das Ergebnis von requests ankommen soll, den Inhalt der Datei ganz ohne requests und lässt darauf bs4 arbeiten.
Auf dem Produktivsystem benutzt du dann requests.

Und für beides baust du einen Schalter ein, damit du das Verhalten switchen kannst.
Darkskater
User
Beiträge: 6
Registriert: Mittwoch 28. Oktober 2020, 12:33

sparrow hat geschrieben: Freitag 30. Oktober 2020, 09:30 ...Ich würde die Seite auf dem "offline"-Laptop abfragen und das Ergebnis der Abfrage in einer Datei speichern....
Du meinst auf dem offline-Laptop mittels

Code: Alles auswählen

import requests
r = requests.get('192.168.0.1')
print(r.text)
und das Ganze dann einfach per Strg+C z.B. in einer .txt speichern?
sparrow hat geschrieben: Freitag 30. Oktober 2020, 09:30 ...Auf deinem Enwitklungssystem lädst du dann an der Stelle, wo eigentlich das Ergebnis von requests ankommen soll, den Inhalt der Datei ganz ohne requests und lässt darauf bs4 arbeiten.....
Mit Inhalt der Datei laden ohne requests meinst du dann einfaches reinkopieren des auf o.g. Weges erhaltenen Codes?
Benutzeravatar
sparrow
User
Beiträge: 4183
Registriert: Freitag 17. April 2009, 10:28

Na, du hast doch eine Programmiersprache vor dir. Und eine Zeichenkette, und nichts anderes ist das Resultat von requests .content, kann man problemlos in eine Datei speichern und auch wieder laden.

Code: Alles auswählen

with open("sitedata.html", "w", encoding="utf-8") as outfile:
    outfile.write(zeichenkette)
Das Lesen kriegst du sicher selbst hin :wink:
Darkskater
User
Beiträge: 6
Registriert: Mittwoch 28. Oktober 2020, 12:33

Also das Auslesen und Abspeichern funktioniert mit

Code: Alles auswählen

import requests 
r = requests.get('http://192.168.0.1/#!page=configuration&preventback=true') 
print(r.status_code) #200 = connected
with open("sitedata.html", "w", encoding="utf-8") as outfile:
    outfile.write(r.text)
    outfile.close()
nur so halb....
Ich lande beim Öffnen der Datei bloß auf der "Startseite" der Weboberfläche und nicht dort, wohin der Link eigentlich führen soll. Auch finde ich im Code nicht die markanten Stellen, wie ich sie im "Original" finde:

Code: Alles auswählen

<div class="measuredvalue-value"><span class="sjs-translation" data-identifier="32764" data-defaulttext="32764" data-arguments="">32764</span></div>
32764 wäre z.B. der zu loggende Wert.

Der momentane Code sieht so aus (abgeänderte "Vorlage"):

Code: Alles auswählen

import requests
import csv
from bs4 import BeautifulSoup

url = "http://192.168.0.1/#!page=configuration&preventback=true"

response = requests.get(url)

html = BeautifulSoup(response.text, 'html.parser')

quotes_html = html.find_all('span', class_="measured")

quotes = list()
for quote in quotes_html:
    quotes.append(quote.text)

with open('./fuellstaende.csv', 'w') as csv_file:
    csv_writer = csv.writer(csv_file, dialect='excel')
    csv_writer.writerows(zip(quotes))


Jemand eine Idee? :ugeek:
Benutzeravatar
sparrow
User
Beiträge: 4183
Registriert: Freitag 17. April 2009, 10:28

Ich würde statt .test eher .content verwenden.

Warum du nur auf der Startseite landest, lässt sich nur schwer diagnostizieren. Ich schrieb ja schon, dass es sein kann, dass die Seite durch den Browser anders dargestellt wird. Zum Beispiel, weil im Browser Javascript ausgeführt wird.
Um das herauszufinden musst du die Seite mit deinem Browser diagnostizieren.
Darkskater
User
Beiträge: 6
Registriert: Mittwoch 28. Oktober 2020, 12:33

Vielen Dank, habe ich geändert!
Java wird ausgeführt...
Benutzeravatar
sparrow
User
Beiträge: 4183
Registriert: Freitag 17. April 2009, 10:28

Java oder Javascript?

Wenn Javascript ausgeführt wird, musst du im Browser protokollieren, welche Aufrufe vorgenommen werden und schauen, ob du die Daten direkt abrufen kannst.
Mit den Webmaster-Werkzeugen (so heißen die, glaube ich) im Browser sollte das gehen.

Wenn alle Stricke reißen kann man mit Selenium auch noch große Geschütze auffahren, aber ich würde es zuerst ohne versuchen.
Darkskater
User
Beiträge: 6
Registriert: Mittwoch 28. Oktober 2020, 12:33

Erstmal Danke für die Hilfe!
Also es handelt sich um Javascript. Ich kann das Ganze leider nur nebenbei machen, also bitte entschuldigt, wenn es mal etwas dauert.
Ich werde mich um den von dir genannten Punkt als nächstes kümmern!
Antworten