Netzwerkdaten auswerten und zwischenspeichern

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Benutzeravatar
Kebap
User
Beiträge: 686
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Hallo Leute,

ich schlage mich mit einer Idee herum, und finde irgendwie nicht den richtigen Hebel. Dafür gibt es bestimmt schon fertige Designs, aber ich finde auch keine Stichworte bei der Websuche.

Es geht im Grunde darum, dass ich Daten aus dem Internet herunterladen und dann auswerten möchte. Die Daten sind größtenteils statisch, aber es kommen regelmäßig neue hinzu. Es kann aber auch sein, dass sich bestehende Daten leicht verändern.

Um nun nicht für jede neue Auswertung wieder alle Daten neu herunterzuladen (also um Serverlast zu reduzieren), möchte ich sie gerne lokal zwischenspeichern. Das Format ist dabei größtenteils egal. Da ich noch nicht genau weiß, welche Daten ich für zukünftig Auswertungen brauche, sollten sie halbwegs vollständig vorhanden sein.

Andererseits möchte ich auch die bisherigen Daten nicht jedes Mal erneut auswerten. Das heißt vermutlich, auch die Aggregation sollte zwischengespeichert werden, und dann bei Bedarf um die neu hinzugekommenen Daten ergänzt werden.

Unterm Strich brauche ich also mindestens zwei Funktionen: Einmal "alle" Daten aus dem Netzwerk laden (und zu ggf. bereits vorhanden Daten hinzufügen) und dann auswerten und zwischenspeichern (Daten und Auswertung). Andererseits die zwischengespeicherten Daten prüfen, ob sie noch den veröffentlichten Daten entsprechen und ggf. korrigieren.

Ist das ein bekanntes Pattern, oder erfinde ich das Rad hier neu? Nach welchen Stichworten sollte ich suchen? Danke für die Aufmerksamkeit! :mrgreen:
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Was ist denn "das Netzwerk"? Ein eigenes, lokales Netzwerk? Dann ist Teil 1 rsync. Deinen zweiten Teil kannst du nur selbst schreiben, ich kenne da nix vorgefertigtes.
Benutzeravatar
Kebap
User
Beiträge: 686
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Nein, es sind fremde Webseiten.
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Da wuerde ich dann zu wget oder curl greifen, und deren mirror-Modi benutzen. Ich weiss nicht wie smart die sind, ob die zB etags checken, und sich dann den Download klemmen. Aber sowas geht hoffentlich.
Johnes
User
Beiträge: 7
Registriert: Mittwoch 23. November 2022, 19:58

Code: Alles auswählen

curl -i --head http://deine-url.com
liest erstmal nur den Header.

Da kannst du dann deine Daten auslesen und verarbeiten. Wenn das Alter sich zum letzten Abruf geändert hat, kannst du die Site dann komplett abrufen.

Wenn du die Daten zu oft abrufen willst, kann es auch sein, das der Server für dich gesperrt wird. Wenn also alle paar Minuten eine Abfrage von dir kommt, sieht das der Betreiber ggf. und unterbindet diesen Traffic.

MfG
Johnes
Benutzeravatar
DeaD_EyE
User
Beiträge: 1012
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Der Header "Last-Modified" ist wahrscheinlich das, was du auswerten möchtest.
Den ETag-Header wird nicht überall angeboten, aber Last-Modified hat man zumindest beim Nginx oder Apache2, wenn reguläre Dateien angeboten werden. Bei HTML-Dokumenten fehlt mir z.B. diese Info.

Kann man sogar mit der Standardbiliothek machen. dateutil ist wahrscheinlich der einfachere Weg Last-Modified in ein datetime Objekt umzuwandeln.

Code: Alles auswählen

import datetime
from urllib.request import Request, urlopen
from zoneinfo import ZoneInfo


def last_modified(url, tzinfo=None):
    request = Request(url, method="HEAD")
    response = urlopen(request)
    modified = response.headers.get("Last-Modified")

    if not modified:
        return

    # print(modified)
    # https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Last-Modified
    # Last-Modified: <day-name>, <day> <month> <year> <hour>:<minute>:<second> GMT
    modified = datetime.datetime.strptime(modified, "%a, %d %b %Y %H:%M:%S %Z")
    modified = modified.replace(tzinfo=datetime.timezone.utc)
    if tzinfo:
        modified = modified.astimezone(tzinfo)

    return modified


timezone = ZoneInfo("Europe/Berlin")
url = "https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-11.5.0-amd64-netinst.iso"
# modification_utc = last_modified(url)
modification_local = last_modified(url, timezone)
now_local = datetime.datetime.now(timezone)
age_days = (now_local - modification_local) / datetime.timedelta(days=1)
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Antworten