ich habe mal etwas rumgespielt, und versucht eine Datei herunterzuladen. Dazu habe ich mich an requests und urllib bedient. Bei meiner Recherche bin ich hin und wieder darauf gestoßen, dass man von der urllib abrät. Grund sei, dass diese Bibliothek zu unsauber programmiert worden ist, und das bei wenig Aufwand zu viel im Hintergrund gearbeitet wird.
Nun, ich habe mir dann zwei Versionen erstellt, und hätte dann eure Meinung, bzw. eure Kritik, wo ich was falsch gemacht habe. Beide Varianten scheinen zu funktionieren. Dateien liegen nach dem Herunterladen vollständig auf meinem Rechner.
Variante: urllib
Code: Alles auswählen
import os
import shutil
import urllib
def download_and_save_urllib():
#download file from url
location = os.path.abspath(os.path.join('temp', 'example-app-0.3.win32.zip'))
url = 'http://sophus.bplaced.net/download/example-app-0.3.win32.zip'
testfile = urllib.URLopener()
#save file in folder (location)
testfile.retrieve(url, location)
download_and_save_urllib()
Zeile 7: In die lokale Variable location wird der zusammengesetzte Pfad gespeichert.
Zeile 8: In die lojkale Variable url wird die URL gespeichert.
Zeile 9: In die lokale Variable file wird die URLopener()-Methode gespeichert
Zeile 12: Über die retrieve()-Methode wird heruntergeladene Datei (url) in einen entsprechenden Ort (location) gespeichert.
Zeile 14: Aufruf der download_and_save_urllib-Funktion
Variante: requests
Code: Alles auswählen
import os
import requests
def download_and_save_requests():
#download file from url
location = os.path.abspath(os.path.join('temp', 'example-app-0.3.win32.zip'))
url = 'http://sophus.bplaced.net/download/example-app-0.3.win32.zip'
file = requests.get(url, stream=True)
chunk_size = "50"
#save file in folder (location)
with open(location, 'wb') as fd:
for chunk in file.iter_content(chunk_size):
fd.write(chunk)
download_and_save_requests()
Zeile 9: Warum ich hier eine "chunk"-Größe angeben muss, habe ich nicht ganz verstanden. Ich habe mich hier an die folgende Dokumentation (http://docs.python-requests.org/en/v0.10.6/api/) orientiert, im Absatz "Raw Response Content".
Zeile 12: Mit einer with-Anweisung wird die Datei geöffnet, und zwar schreibend im Binär-Modus.
Zeile 13: Da ich Stream auf True gesetzt habe, so wird hier quasi Response.raw durch die For-Schleife ersetzt. Dadurch wird der Inhalt abgerufen.
Zeile 14: Anshcließend wird die Datei geschrieben und hinterher geschlossen
Zeile 16: Aufruf der download_and_save_requests()-Funktion.
Mein Fazit:
Wenn ich mir beide Varianten anschaue, so ist die urllib um einiges kürzer beim Programmieren, oder aber, ich habe einiges nicht berücksichtigt, was ja kein Zufall bei mir ist
Jetzt überlasse ich euch das Feld. Tobt euch was. Was habe ich vergessen, was ist besser? Wie könnte man meine Varianten verbessern. Ich bin über jede Information erfreut.