tovotu

8. Dezember 2012
Neuer SpringerLink Downloader
Sprache:Python - Libs:pyPdf,PyGObject,lxml,urllib2

Update vom 09.07.2013: Ein Update der SpringerLink-Seite hat dieses Tool ein Stück weit überflüssig gemacht: Zukünftig können ganze Bücher in Form einer einzelnen DRM-freien PDF direkt bezogen werden. Es gibt aber weiterhin Bücher (vor allem ältere Ausgaben), die nicht als einzelne PDF verfügbar sind. (Der SpringerLink Downloader erkennt automatisch, ob das Buch als einzelne PDF oder kapitelweise heruntergeladen werden muss.)

Die neue Webseite von SpringerLink ist übersichtlicher, schöner und nützlicher als die bisherige. Aber einen Nachteil hat das vollständige Redesign: Das Python-Script springer_download.py[1] funktioniert nicht mehr.

Diese Gelegenheit habe ich genutzt, um das Tool komplett neu zu schreiben und dabei einige meiner Verbesserungsvorschläge von vor einem halben Jahr einzubringen. Meine neue Version basiert nun auf Python (ab Version 2.7), urllib2, lxml (mit cssselect) und pyPdf. Man benötigt außerdem entweder Ghostscript oder pdftk und für die Verarbeitung des Frontcovers auch ImageMagick.

Es handelt sich nicht um einen Fork, sondern um eine komplette Neukonzeption des Vorbilds von Milian Wolff. Obwohl einzelne User einen tadellosen Betrieb unter Windows mit cygwin vermelden, sei darauf hingewiesen, dass eine Entwicklung zum jetzigen Zeitpunkt ausschließlich unter und im Hinblick auf Linux stattfindet.

Enthalten ist eine sehr einfache grafische Oberfläche basierend auf Gtk3 (also PyGObject), die verwendet wird, wenn das Programm durch einen Doppelklick oder aus der Kommandozeile mit der Option --gui gestartet wird. Das Programm ist auch auf Systemen ohne die Gtk-Bibliotheken in der Kommandozeile lauffähig und nur dort kann man den vollen Funktionsumfang des Tools nutzen.

Download: springer_download.py (application/octet-stream, 160,27 kB, letztes Update: 21.10.2013)

Nach dem Download markiert man die Datei als ausführbar und die Software ist sofort nutzbar: Durch einen Doppelklick startet man die grafische Oberfläche. Wie üblich muss natürlich vor dem Aufruf des Programms eine Verbindung mit dem Universitätsnetzwerk bestehen, damit ein Zugriff auf die Inhalte von SpringerLink möglich ist.

Die Funktionsweise der Software

Das Tool bezieht die wesentlichen Metadaten (Titel, Autor, Anzahl der Kapitel, ...) von der Webseite und lädt das Buchcover herunter. Nach dem Download der PDF-Dateien werden diese zusammen mit dem Cover und den Metadaten in eine neue PDF-Datei geschrieben, die standardmäßig die ISBN des Buchs als Namen trägt.

Die Ausgabedatei wird mit einem Inhaltsverzeichnis versehen, das - falls vorhanden - aus den PDF-Dateien der einzelnen Kapitel extrahiert oder nötigenfalls aus den Angaben auf der Webseite zusammengestellt wird. Außerdem bleiben besondere Seitenbezeichnungen (etwa mit römischen Ziffern) bestehen, sodass insbesondere die Nummerierung der PDF-Seiten mit der durch die Druckausgabe vorgegebenen Nummerierung der Buchseiten übereinstimmt.

Bedienung über die Kommandozeile

Man übergibt dem Tool die URL des gewünschten Buchs wie folgt:

./springer_download.py "http://link.springer.com/book/10.1007/978-3-642-21017-4/"

Mit der Option --output (bzw. kurz -o) kann man den Pfad zur Ausgabedatei angeben und mittels --no-cover lässt sich der Download des Frontcovers unterdrücken. Statt der gesamten URL genügt auch die Angabe des Buchcodes in der URL (meist die ISBN):

./springer_download.py --output ausgabe.pdf "978-3-642-21017-4"
./springer_download.py --no-cover "BFb0062071"

Ohne die Option -o wird für den Dateinamen der Ausgabedatei standardmäßig die ISBN-Nummer verwendent. Mit der Option --autotitle wird stattdessen im Format AUTOREN - TITEL.pdf gespeichert - auf die Gefahr hin, dass der Titel sehr lang wird und unter Umständen viele Leer- und Sonderzeichen enthält.

Eine Übersicht über die zahlreichen weiteren Optionen erhält man mit

./springer_download.py --help

Quellcode

Das Projekt ist auf FramaGit beheimatet.[2] Dort können der Quellcode und alternative Möglichkeiten zur Installation eingesehen werden.

  1. tovotu.de/blog/514-...SpringerLink-beziehen
  2. framagit.org/tuxor1337/springerdownload

Kommentare

Administrator 16. April 2013

Da es Bücher gibt, bei denen die Kapitel in völlig wirrer Reihenfolge gelistet sind (vgl. link.springer.com/b...-3-540-73528-1/page/1), versucht sich mein Tool an einer Umsortierung.

Dummerweise fängt die Seitennummerierung bei dem von dir angegebenen Buch beim Back Cover wieder von vorne an, was den Sortieralgorithmus natürlich in die Irre leitet.

Ich habe in der aktuellsten Version mal spontan eine Option "--sorted" eingefügt, mit der das bisherige Verhalten erzielt werden kann. Standardmäßig "glaubt" das Tool jetzt einfach die Reihenfolge auf der Webseite.

Tim 16. April 2013

Super Tool! Besonders die Korrektur der Seitenzahlen erleichtert das Lesen und Suchen erheblich!

Allerdings stimmt die Reihenfolge der zusammengefügten Kapitel noch nicht immer ganz.
So wird zum Beispiel bei link.springer.com/b...007/978-3-642-00688-3 der back-matter Abschnitt (mit Anhang und Index) nach dem ersten Kapitel eingefügt.

Adiminstrator 15. April 2013

Für diesmal war es noch leichter, das Problem direkt in pyPdf zu beheben. Die neueste Version sollte dein Problem beheben, Mark.

Administrator 15. April 2013

Das ist jetzt tatsächlich ein Fehler in pyPdf. Man muss aber der Ehrlichkeit halber sagen, dass die PDF wirklich fehlerhaft ist. Evince wirft beispielsweise auch eine Fehlermeldung aus, ist allerdings fähig den Fehler darüber hinaus zu ignorieren.

Ich schau mal, was sich machen lässt. Zur Not implementiere ich die Option, den pyPdf-Teil im Programmablauf zu überspringen.

Mark 15. April 2013

Vielen dank für dein Hilfe met das letztes Buch, ich könnte es downloaden. Jetzt ist da leider noch ein Buch wer nicht zum downloaden ist. Das Buch "Environmental Change and Food Security in China", <link.springer.com/b...007/978-1-4020-9180-3>, hat ein "Back Matter". Es downloaded bis chapter 11/10 und denn gibt man dieses Fehler:

Jenifer Huang McBeath, Jerry McBeath
Environmental Change and Food Security in China (10 chapters)
==> Fetching chapter data...done.
==> Chapter 0/10, downloading 448/448 kB... [===========================]
==> Fetching book cover...done.
Traceback (most recent call last):/510 kB... [==========================]
File "./springer_download.py", line 63, in <module>
sys.exit(main())
File "./springer_download.py", line 55, in main
fet.run()
File "/home/mark/Downloads/SpringerLink/sprin gerdl/fetcher.py", line 148, in run
self.fetchPdfData(pgs)
File "/home/mark/Downloads/SpringerLink/sprin gerdl/fetcher.py", line 412, in fetchPdfData
iterateRec(accessible_toc,fetchCh)
File "/home/mark/Downloads/SpringerLink/sprin gerdl/fetcher.py", line 345, in iterateRec
el = func(el,lvl)
File "/home/mark/Downloads/SpringerLink/sprin gerdl/fetcher.py", line 389, in fetchCh
el['title'],lvl,len(el['children']))
File "/home/mark/Downloads/SpringerLink/sprin gerdl/pdftoc.py", line 51, in getTocFromPdf
ch = _getDestinationPageNumbers(pdf)
File "/home/mark/Downloads/SpringerLink/sprin gerdl/pdftoc.py", line 38, in _getDestinationPageNumbers
outline_page_ids = _setup_outline_page_ids(pdf.getOutlines( ))
File "/usr/lib/pymodules/python2.7/pyPdf/pdf. py", line 538, in getOutlines
self.getOutlines(node["/First"], subOutlines)
File "/usr/lib/pymodules/python2.7/pyPdf/pdf. py", line 531, in getOutlines
outline = self._buildOutline(node)
File "/usr/lib/pymodules/python2.7/pyPdf/pdf. py", line 575, in _buildOutline
raise utils.PdfReadError("Unexpected destination %r" % dest)
pyPdf.utils.PdfReadError: Unexpected destination u'0001145122.INDD:Sec1_BM1'
« 1 2 3 4 5 6 7 8 9 10 11 12 13 »
Neue Kommentare zu diesem Artikel bitte per Mail an kommentare-518(at)tovotu.de!