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!
Netzwerkdaten auswerten und zwischenspeichern
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.
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
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.
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Code: Alles auswählen
curl -i --head http://deine-url.com
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
- DeaD_EyE
- User
- Beiträge: 1030
- 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.
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