Seite 1 von 1

Laden eines Bildes von einer Webseite

Verfasst: Freitag 17. August 2012, 20:03
von starki
Hallo Leute,

ich habe eine URL von einem Bild und will dieses Bild downloaden und lokal abspeichern. Leider tritt bei mir ein Fehler auf, bei dem ich nicht mehr weiter weiß :-(
Traceback (most recent call last):
File "/usr/lib/python3.2/urllib/request.py", line 1764, in open_local_file
stats = os.stat(localname)
OSError: [Errno 2] No such file or directory: 'None'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "wbw.py", line 105, in <module>
save_img(find_picture_url(load_url(start_url)))
File "wbw.py", line 59, in save_img
urllib.request.urlretrieve(img_url, "./my_image" + rand_name() + ".jpg")
File "/usr/lib/python3.2/urllib/request.py", line 150, in urlretrieve
return _urlopener.retrieve(url, filename, reporthook, data)
File "/usr/lib/python3.2/urllib/request.py", line 1569, in retrieve
fp = self.open(url, data)
File "/usr/lib/python3.2/urllib/request.py", line 1537, in open
return getattr(self, name)(url)
File "/usr/lib/python3.2/urllib/request.py", line 1755, in open_file
return self.open_local_file(url)
File "/usr/lib/python3.2/urllib/request.py", line 1766, in open_local_file
raise URLError(e.errno, e.strerror, e.filename)
TypeError: __init__() takes at most 3 positional arguments (4 given)
Und hier mal der Code der Funktion:

Code: Alles auswählen

	
def save_img(img_url):
	urllib.request.urlretrieve(img_url, "./my_image" + rand_name() + ".jpg")
	urllib.request.urlcleanup()

Re: Laden eines Bildes von einer Webseite

Verfasst: Freitag 17. August 2012, 22:42
von BlackJack
@starki: Lass Dir mal `img_url` ausgeben.

Re: Laden eines Bildes von einer Webseite

Verfasst: Samstag 18. August 2012, 11:37
von starki
Danke für den Hinweis. Hab ein Return bei der Funktion vergessen, die mir das die URL des Bildes ausgibt.

Aber jetzt habe ich ein anderes Problem: Die Datei wird nicht runtergeladen. Also es gibt schon eine neue Datei, aber die ist gerade mal 23 Byte groß :-/ Und das kann nicht ganz sein.

Habt ihr ein paar Ideen?

Re: Laden eines Bildes von einer Webseite

Verfasst: Samstag 18. August 2012, 12:10
von fnorb
Hallo starki,

Du solltest zunächst mal die URL des Bildes in einem Browser ausprobieren, um sicherzustellen, dass das Bild tatsächlich an der entsprechenden Adresse existiert.

Dann schau dir die Rückgabewerte von retrieve(...) an. Der HTTP-Antwort-Header im zweiten Rückgabewert gibt Dir evtl. Aufschluss darüber, was schiefgegenagen ist.

Achte auch darauf, ob die Rückgabe komprimiert (bspw. GZIP) ist.

Gruß

Re: Laden eines Bildes von einer Webseite

Verfasst: Samstag 18. August 2012, 12:26
von starki
Also die URL stimmt schon mal.

Die Ausgabe vom retrieve lautet folgendermaßen:
('my_image440326292.jpg', <http.client.HTTPMessage object at 0xb6e2490c>)
Nur kann ich jetzt damit nichts anfangen ...

Edit: OK, habs herausgefunden. Anstelle der Bilddateien kommt nur eine Nachricht und diese wird in die Bilddatei gespeichert.

Re: Laden eines Bildes von einer Webseite

Verfasst: Samstag 18. August 2012, 12:41
von Hyperion
Und statt `urllib` und Konsorten würde ich auf requests zurückgreifen - eine angenehmere API für HTTP wirst Du kaum finden :-)

Re: Laden eines Bildes von einer Webseite

Verfasst: Samstag 18. August 2012, 13:53
von fnorb
Hallo starki,

das zweite Rückgabeargument ist -- zumindest in Python 3 -- eine Instanz von email.message.Message.
In Python 2 heißt das Modul evtl. anders.

Wirf mal einen Blick in die Python-Doku. Da ist die Klasse recht ausführlich beschrieben.

Versuch mal:

Code: Alles auswählen

filename, message = urllib.request.urlretrieve(...)
for key, value in message.items():
    print( key, '=', value )
Und schick mal die Ausgabe.

Gruß

Re: Laden eines Bildes von einer Webseite

Verfasst: Samstag 18. August 2012, 14:24
von /me
fnorb hat geschrieben:das zweite Rückgabeargument ist -- zumindest in Python 3 -- eine Instanz von email.message.Message.
Die Doku sagt folgendes: "Return a tuple (filename, headers) where filename is the local file name under which the object can be found, and headers is whatever the info() method of the object returned by urlopen() returned"

Warum sollte ein HTTP-Request eine Mail-Message-Objekt zurückliefern?

Re: Laden eines Bildes von einer Webseite

Verfasst: Samstag 18. August 2012, 14:59
von fnorb
Hallo /me,

Vielleicht war es in Python 2 anders, ich hab momentan nur eine Python 3-Installation zum Testen.
Dort wird eine Instanz von http.client.HTTPMessage, welche wiederum von email.message.Message erbt, zurückgegeben.
Der Code-Schnipsel könnte trotzdem funktionieren.

Gruß

Re: Laden eines Bildes von einer Webseite

Verfasst: Dienstag 21. August 2012, 15:59
von Leonidas
Hyperion hat geschrieben:Und statt `urllib` und Konsorten würde ich auf requests zurückgreifen - eine angenehmere API für HTTP wirst Du kaum finden :-)
requests soll ja seit neuestem auch Python 3-fähig sein *hint* *hint* *hint*.

Re: Laden eines Bildes von einer Webseite

Verfasst: Mittwoch 22. August 2012, 18:23
von Hyperion
Leonidas hat geschrieben: requests soll ja seit neuestem auch Python 3-fähig sein *hint* *hint* *hint*.
Ich mache noch mehr Werbung und drücke es mal in einer Adaption eines Subkultur-Werbeslogans aus: Das Ding ist der Burner!!! :twisted:

Ich glaube mehr können wir nicht tun... ;-)