Update 04_4_download_der_metadaten.md

This commit is contained in:
Felix Lohmeier 2016-10-25 19:21:21 +02:00
parent 692c133a91
commit 5aaf47ed50
1 changed files with 118 additions and 11 deletions

View File

@ -27,22 +27,25 @@ Lesen Sie die [Dokumentation zur SRU-Schnittstelle im Wiki des GBV](https://www.
* Format: ```marcxml```
* Anzahl Records: ```100```
Laden Sie die Daten mit **curl**, wie in Kapitel 4.2 geübt.
## Lösung
Folgende Abfrage über die SRU-Schnittstelle des GBV liefert die ersten 100 Treffer im Format ```marcxml``` für den Suchbegriff ```open``` im Katalog der HAW Hamburg:
{%s%}http://sru.gbv.de/opac-de-18-302?operation=searchRetrieve&query=pica.all%3Dopen&maximumRecords=100&recordSchema=marcxml{%ends%}
Zum Speichern der Daten nutzen wir curl wie in Kapitel 4.2 geübt:
Speichern der Daten mit curl:
{%s%}curl "http://sru.gbv.de/opac-de-18-302?operation=searchRetrieve&query=pica.all%3Dopen&maximumRecords=100&recordSchema=marcxml" > 1_100.marcxml{%ends%}
## Aufgabe 2: 1.000 Records über die SRU-Schnittstelle laden
In Aufgabe 1 haben wir 100 Records über die SRU-Schnittstelle geladen. Wenn wir den Parameter maximumRecords einfach auf 1000 erhöhen, dann meldet die Schnittstelle einen Fehler zurück (probieren Sie es aus...). Wir müssen also mehrere Anfragen in 100er-Paketen stellen.
In Aufgabe 1 haben wir 100 Records über die SRU-Schnittstelle geladen. Wenn wir den Parameter maximumRecords einfach auf 1000 erhöhen, dann meldet die Schnittstelle einen Fehler zurück (probieren Sie es aus...). Suchen Sie nach einer Möglichkeit, mehr als 100 Records für den Suchbegriff ```open``` zu laden.
**Hinweise:**
* Nutzen Sie den zusätzlichen Parameter ```startRecord```
* Stellen Sie mehrere Anfragen in 100er-Paketen.
* Nutzen Sie dazu den zusätzlichen Parameter ```startRecord```.
## Lösung
@ -79,13 +82,12 @@ while [ "$counter" -le 1000 ] ; do
let startRecord=startRecord+100
done
exit
```
**Ausführen:**
* Diesen Textinhalt in einer Datei abspeichern, z.B. mit ```nano download.sh```
* Danach muss das Script noch ausführbar gemacht werden: ```chmod +x download.sh```
* Script starten mit ```./download.sh```
* Diesen Textinhalt in einer Datei abspeichern, z.B. mit ```nano download-1000.sh```
* Danach muss das Script noch ausführbar gemacht werden: ```chmod +x download-1000.sh```
* Script starten mit ```./download-1000.sh```
**Erläuterungen:**
* Anfangs werden die Variablen ```url```, ```startRecord``` und ```counter``` definiert, die später mit ```${url}``` usw. wieder abgerufen werden. Der Wert für die Variable ```url``` muss in Anführungszeichen gesetzt werden, weil sonst das &-Zeichen von der Shell missverstanden würde.
@ -93,10 +95,115 @@ exit
* Der curl-Befehl lautet nach Auflösung der Variablen genauso wie aus den vorigen Aufgaben bekannt. Der Dateiname unter dem das jeweilige Ergebnis gespeichert werden soll, setzt sich aus den Variablen ```startRecord``` und ```counter``` zusammen.
* Bevor der curl-Befehl erneut ausgeführt wird, sorgen die beiden ```let```-Befehle dafür, dass ```startRecord``` und ```counter``` jeweils um 100 erhöht werden. Somit lädt der zweite Durchlauf der Schleife die Records 101 bis 200.
## Download der vollständigen Metadaten des HAW-Katalogs
## Aufgabe 4: Download der vollständigen Metadaten des HAW-Katalogs
...
In der vorigen Aufgabe haben Sie mit einem Script mehrere 100er-Pakete für den Suchbegriff ```open``` heruntergeladen. Um die Metadaten aus dem HAW-Katalog **vollständig** abzurufen, benötigen wir eine oder mehrere Suchabfragen, welche die gesamte Ergebnismenge zurückliefern und die wir dann mit dem Parameter ```startRecord``` in 100er-Paketen nach und nach durchgehen können.
http://sru.gbv.de/opac-de-18-302?operation=searchRetrieve&query=pica.ppn=.*&maximumRecords=100&startRecord=1&recordSchema=picaxml
**Aufgabe:**
1. Lesen Sie die Dokumentation der [SRU-Schnittstelle](https://www.gbv.de/wikis/cls/SRU) und des [PICA-Formats](https://www.gbv.de/wikis/cls/PICA-Format) und probieren Sie Abfragen mit verschiedenen Feldern.
2. Wenn Sie eine Möglichkeit gefunden haben, passen Sie das Script aus Aufgabe 3 entsprechend an.
Die Suche nach ```pica.ppn=.*``` liefert alle Datensätze zurück, wird mit ```maximumRecords=100``` begrenzt (sonst liefert die Schnittstelle gar keine Daten) und sukzessive aufsteigend mit ```startRecord=1```, ```startRecord=101```, ```startRecord=201``` usw. abgefragt.
**Hinweise:**
* Probieren Sie den Wert ```.*``` in Ihren Suchanfragen
* Falls Sie sich für die theoretischen Hintergründe interessieren, könnte der Bericht "[Guidelines for preparing a Z39.50/SRU target to enable metadata harvesting](http://cyberdoc.univ-lemans.fr/PUB/CfU/Journee_UNIMARC_Lyon/TELplus-D2.3_v1.0%5B1%5D.pdf)" des EU-Projekts eContentplus vom 30.6.2009 interessieren (dort ist aber keine praktische Lösung für die Aufgabe zu finden).
## Lösung
Folgende Anfrage an die SRU-Schnittstelle liefert die Gesamtmenge zurück:
* Suchanfrage: {%s%}pica.ppn=.*{%ends%}
* Beispiel: {%s%}http://sru.gbv.de/opac-de-18-302?operation=searchRetrieve&query=pica.ppn=.*&maximumRecords=100&startRecord=1&recordSchema=marcxml{%ends%}
* Gesamtanzahl der Records: {%s%}450.101 (Stand: 25.10.2016){%ends%}
### Variante 1: Download-Script "light"
Mit dem Shell-Script aus Aufgabe 3 als Vorlage, der neuen Suchanfrage und der Gesamtanzahl der Records haben wir schon alle Bestandteile, die wir benötigen. Folgendes Script lädt alle Records herunter (vergleichen Sie es mit dem Script aus Aufgabe 3):
```
#!/bin/bash
url="http://sru.gbv.de/opac-de-18-302?operation=searchRetrieve&query=pica.ppn=.*&maximumRecords=100&recordSchema=marcxml&startRecord="
startRecord=1
counter=100
while [ "$counter" -le 450200 ] ; do
curl "${url}${startRecord}" > ${startRecord}-${counter}.marcxml
let counter=counter+100
let startRecord=startRecord+100
done
exit
```
**Ausführen:**
* Diesen Textinhalt in einer Datei abspeichern, z.B. mit ```nano download-light.sh```
* Danach muss das Script noch ausführbar gemacht werden: ```chmod +x download-light.sh```
* Script starten mit ```./download-light.sh```
### Variante 2: Download-Script "comfort"
Üblicherweise werden in Shell-Scripten noch Tests oder Statistiken eingebaut, um gleich prüfen zu können, ob die Aktionen erfolgreich waren. Außerdem werden üblicherweise so viele Variablen wie möglich definiert, damit das Script leicht angepasst und in anderen Kontexten verwendet werden kann. Weiterhin sollten Kommentare mit ```#``` eingeführt werden, damit das Script ohne extra Dokumentation besser nachvollziehbar wird.
Ein etwas komfortableres Script könnte wie folgt aussehen (probieren Sie es einfach mal aus...).
```
#!/bin/bash
# Script zum Download von Metadaten über Z39.50-Schnittstellen mit curl
# Programmvariablen
name=haw
date=$(date +%F)
dir=download
url=http://sru.gbv.de/opac-de-18-302?operation=searchRetrieve
query="pica.ppn=.*"
recordSchema=marcxml
startRecord=1
maximumRecords=100
endRecord=450200
let counter=startRecord+maximumRecords-1
# Variablen ausgeben
echo "Dateinamen: " ${name}_${date}_$(printf "%.6i\n" ${startRecord})-$(printf "%.6i\n" ${counter}).marcxml
echo "Verzeichnis " ${dir}
echo "Schnittstelle: " ${url}
echo "Suchabfrage: " ${query}
echo "Records: " "von "${startRecord}" bis "${endRecord}
echo "pro Datei: " ${maximumRecords}
echo ""
# Startzeitpunkt ausgeben
echo "Startzeitpunkt: $(date)"
echo ""
# Verzeichnis erstellen (falls nicht vorhanden)
mkdir download > /dev/null 2>&1
# Schleife mit Aufruf von curl
while [ "$counter" -le "$endRecord" ] ; do
echo "Download Records "${startRecord}" bis "${counter}"..."
curl "${url}&query=${query}&maximumRecords=${maximumRecords}&recordSchema=${recordSchema}&startRecord=${startRecord}" > $dir/${name}_${date}_$(printf "%.6i\n" ${startRecord})-$(printf "%.6i\n" ${counter}).marcxml
echo "Ergebnis: "$(grep -c -H "<controlfield tag=\"001\">" $dir/${name}_${date}_$(printf "%.6i\n" ${startRecord})-$(printf "%.6i\n" ${counter}).marcxml)" Records"
echo ""
let counter=counter+maximumRecords
let startRecord=startRecord+maximumRecords
done
# Endzeitpunkt ausgeben
echo "Endzeitpunkt: $(date)"
echo ""
# Liste der erstellten Dateien
echo "Folgende Dateien liegen jetzt vor:"
echo "(Dateinamen und Anzahl der enthaltenen Records)"
grep -c "<controlfield tag=\"001\">" $dir/*.marcxml
echo ""
# Gesamtzahl der heruntergeladenen Records
echo "Gesamtanzahl der Records im Ordner download:"
grep "<controlfield tag=\"001\">" $dir/*.marcxml | wc -l
exit
```
**Ausführen:**
* Diesen Textinhalt in einer Datei abspeichern, z.B. mit ```nano download.sh```
* Danach muss das Script noch ausführbar gemacht werden: ```chmod +x download.sh```
* Script starten mit ```./download.sh```