seminar-wir-bauen-uns-einen.../04_4_download_der_metadaten.md

67 lines
3.3 KiB
Markdown
Raw Normal View History

2016-10-23 18:53:42 +02:00
# 4.4 Download der Metadaten
2016-10-25 13:22:05 +02:00
Die Verbundzentrale des Bibliotheksverbunds bietet derzeit keinen einfachen Weg an, um regelmäßig vollständige Abzüge der Daten einer Bibliothek zu bekommen.
2016-10-24 01:34:29 +02:00
## Aufgabe 1: 100 PPNs aus dem Katalog in einer Text-Datei notieren
2016-10-23 19:56:59 +02:00
2016-10-24 01:34:29 +02:00
Für die Abfrage über die unAPI-Schnittstelle benötigen wir die Identifikationsnummern (hier PPNs) derjenigen Datensätze, die wir abfragen wollen. Also brauchen wir eine Liste der PPNs, z.B. in einer einfachen Text-Datei.
2016-10-24 01:11:14 +02:00
## Lösung
Folgende Abfrage über die [SRU-Schnittstelle des GBV](https://www.gbv.de/wikis/cls/SRU) liefert die ersten 100 Treffer in einer XML-Datei im Format PICAXML für den Suchbegriff ```open```
{%s%}http://sru.gbv.de/opac-de-18-302?operation=searchRetrieve&query=pica.all%3Dopen&maximumRecords=100&startRecord=1&recordSchema=picaxml{%ends%}
2016-10-24 01:34:29 +02:00
Daraus können wir die PPNs im Feld 003@ mit grep und sed extrahieren:
2016-10-24 01:11:14 +02:00
2016-10-24 01:34:29 +02:00
{%s%}curl "http://sru.gbv.de/opac-de-18-302?operation=searchRetrieve&query=pica.all%3Dopen&maximumRecords=100&startRecord=1&recordSchema=picaxml" | grep --no-group-separator -A 1 "003@" | sed 's/^ *//; s/ *$//; s/<[^>]*>//g; /^$/d' > 100ppns.txt{%ends%}
2016-10-24 01:11:14 +02:00
## Aufgabe 2: Shell-Script zum Download der Metadaten schreiben
* Mit curl über die unAPI-Schnittstelle wie in Kapitel 4.2 geübt
2016-10-23 22:47:05 +02:00
* Format: PICAXML
2016-10-23 23:46:44 +02:00
* Bei zu schnell aufeinander folgenden Abfragen verweigert die Schnittstelle evtl. die Antwort, daher Wartezeit 1 Sekunde zwischen den Abfragen einbauen
2016-10-23 19:56:59 +02:00
2016-10-23 22:47:05 +02:00
**Literaturtipps:**
* https://wiki.ubuntuusers.de/Shell/Bash-Skripting-Guide_f%C3%BCr_Anf%C3%A4nger/
* http://stackoverflow.com/questions/16131321/shell-script-using-curl-to-loop-through-urls
2016-10-23 19:56:59 +02:00
2016-10-23 22:47:05 +02:00
## Lösung
2016-10-23 23:46:44 +02:00
```
#!/bin/bash
2016-10-24 01:11:14 +02:00
url=http://unapi.gbv.de/?id=opac-de-18-302:ppn:
2016-10-23 23:46:44 +02:00
format=picaxml
2016-10-24 01:11:14 +02:00
mkdir download
2016-10-23 23:46:44 +02:00
while read ppn
do
content=$(curl "{$url}${ppn}&format=${format}")
2016-10-24 01:11:14 +02:00
echo $content >> download/$ppn.picaxml
2016-10-23 23:46:44 +02:00
sleep 1
done < 100ppns.txt
```
* Diesen Textinhalt in einer Datei abspeichern, z.B. mit ```nano download.sh```
2016-10-24 01:11:14 +02:00
* Danach muss das Script noch ausführbar gemacht werden: ```chmod +x download.sh```
* Script starten mit ```./download.sh```
2016-10-23 19:56:59 +02:00
2016-10-24 01:44:50 +02:00
## Aufgabe 3: Heruntergeladene XML-Dateien zusammenführen
2016-10-23 19:56:59 +02:00
2016-10-23 22:47:05 +02:00
XML bietet durch seine Baumstruktur die Möglichkeit mehrere Datensätze in einer Datei abzubilden. Die Inhalte der Einzeldateien einfach aneinanderzureihen funktioniert leider nicht, da jede Datei einen eigenen "Header" mitbringt und die XML-Syntax nur einen Header erlaubt. Die Zusammenführung gestaltet sich also etwas komplizierter. Dazu können entweder extra Tools verwendet werden, die für XML gebaut wurden oder Sie nutzen die typischen Kommandozeilenwerkzeuge in trickreicher Kombination.
2016-10-23 19:56:59 +02:00
2016-10-23 22:47:05 +02:00
**Literaturtipps:**
* https://en.wikipedia.org/wiki/Comparison_of_XML_editors
* http://www.ethanjoachimeldridge.info/tech-blog/combine-xml-files
2016-10-23 19:56:59 +02:00
2016-10-23 22:47:05 +02:00
## Lösung
2016-10-24 01:11:14 +02:00
...
## Alternative: SRU-Schnittstelle
Mit Suchabfragen der folgenden Form ließen sich auch alle Daten sukzessive abrufen:
2016-10-24 01:44:50 +02:00
http://sru.gbv.de/opac-de-18-302?operation=searchRetrieve&query=pica.ppn=.*&maximumRecords=100&startRecord=1&recordSchema=picaxml
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.