Datensets zum Herunterladen
Der Kulturpool stellt täglich aktualisierte Komplett-Exporte aller Objektdaten zum Download bereit. Diese Datensets ermöglichen die lokale Verarbeitung, Analyse und Wiederverwendung des gesamten Datenbestands für Forschung, eigene Anwendungen oder Archivierungszwecke.
Download-URL
Die tagesaktuellen Datensets sind als komprimiertes TAR-Archiv unter der folgenden, stabilen URL verfügbar:
https://s3.kpool.at/nightly/full_records.tar.gz
Datenformat
1. Archiv (.tar.gz
)
Der Download ist eine einzelne, mit gzip
komprimierte TAR-Archivdatei. Sie müssen diese Datei nach dem Herunterladen entpacken, um auf die eigentlichen Datensätze zugreifen zu können.
2. Datendateien (.jsonl
)
Das entpackte Archiv enthält mehrere Dateien mit der Endung .jsonl
– für jede datenliefernde Institution eine. Das JSONL-Format (JSON Lines) bedeutet, dass jede Datei aus mehreren Zeilen besteht, wobei jede Zeile ein vollständiges, eigenständiges JSON-Objekt darstellt.
3. Datensatz (JSON-LD / EDM)
Jedes JSON-Objekt (also jede Zeile in einer .jsonl
-Datei) repräsentiert ein einzelnes Kulturgut. Der Datensatz ist im JSON-LD-Format strukturiert und folgt dem Europeana Data Model (EDM). Die Struktur entspricht exakt dem metadata
-Objekt, das auch von der Objekte API ausgeliefert wird.
Struktur eines Datensatzes
Jede Zeile in den .jsonl
-Dateien ist ein JSON-Objekt, das wie folgt aussehen kann:
{
"@context": {
"ore": "[http://www.openarchives.org/ore/terms/](http://www.openarchives.org/ore/terms/)",
"edm": "[http://www.europeana.eu/schemas/edm/](http://www.europeana.eu/schemas/edm/)",
"dc": "[http://purl.org/dc/elements/1.1/](http://purl.org/dc/elements/1.1/)",
"...": "..."
},
"id": "#belvedere_5420_AGG",
"type": "Aggregation",
"aggregatedCHO": {
"id": "#belvedere_5420",
"type": "ProvidedCHO",
"dc:title": [
{
"lang": "de",
"value": "Der Kuss"
}
],
"dc:creator": [
{
"value": "Gustav Klimt"
}
]
},
"provider": {
"id": "[https://www.belvedere.at/](https://www.belvedere.at/)",
"type": "Agent",
"dc:title": [
{
"lang": "de",
"value": "Belvedere"
}
]
},
"edm:dataProvider": {
"id": "[https://www.belvedere.at/](https://www.belvedere.at/)",
"type": "Agent",
"dc:title": [
{
"lang": "de",
"value": "Belvedere"
}
]
},
"edm:isShownAt": {
"id": "[https://digital.belvedere.at/objects/5420/der-kuss-liebespaar](https://digital.belvedere.at/objects/5420/der-kuss-liebespaar)",
"type": "WebResource"
},
"edm:isShownBy": {
"id": "[https://digital.belvedere.at/resources/images/xl/5420.jpg](https://digital.belvedere.at/resources/images/xl/5420.jpg)",
"type": "WebResource"
},
"edm:rights": {
"id": "[http://creativecommons.org/publicdomain/mark/1.0/](http://creativecommons.org/publicdomain/mark/1.0/)",
"type": "RightStatement"
}
}
Beispiel zur Verarbeitung (Python)
Das folgende Python-Skript zeigt, wie Sie das Archiv herunterladen, entpacken und die einzelnen JSONL-Dateien Zeile für Zeile verarbeiten können.
import requests
import tarfile
import json
import io
# URL zum Datenset
DATASET_URL = "[https://s3.kpool.at/nightly/full_records.tar.gz](https://s3.kpool.at/nightly/full_records.tar.gz)"
print(f"Lade Datenset von {DATASET_URL} herunter...")
response = requests.get(DATASET_URL, stream=True)
response.raise_for_status()
# Erstelle ein file-like object aus dem heruntergeladenen Inhalt
file_like_object = io.BytesIO(response.content)
print("Entpacke Archiv im Speicher...")
with tarfile.open(fileobj=file_like_object, mode="r:gz") as tar:
# Iteriere durch jede Datei im Archiv
for member in tar.getmembers():
if member.isfile() and member.name.endswith('.jsonl'):
print(f"\n--- Verarbeite Datei: {member.name} ---")
# Extrahiere die Datei in den Speicher
file_content = tar.extractfile(member).read().decode('utf-8')
# Verarbeite jede Zeile der JSONL-Datei
for line in file_content.strip().split('\n'):
try:
# Lade die Zeile als JSON-Objekt
record = json.loads(line)
# Greife auf Daten zu (Beispiel: Titel extrahieren)
# Achtung: Die Struktur kann variieren
if 'aggregatedCHO' in record and 'dc:title' in record['aggregatedCHO']:
# Finde einen Titel, idealerweise auf Deutsch
title_de = next((t['value'] for t in record['aggregatedCHO']['dc:title'] if t.get('lang') == 'de'), None)
title_any = record['aggregatedCHO']['dc:title'][0]['value'] if record['aggregatedCHO']['dc:title'] else "Kein Titel"
print(f"Gefundener Titel: {title_de or title_any}")
except json.JSONDecodeError:
print(f"Fehler beim Parsen einer Zeile in {member.name}")
except Exception as e:
print(f"Ein unerwarteter Fehler ist aufgetreten: {e}")
print("\nVerarbeitung abgeschlossen.")