2016-04-01 5 views
0

Ich bin mit einem seltsamen Problem konfrontiert, wenn ich versuche, ein Bild mit urllib.retrieve, es nie zurück, und Terminal bleibt nur beschäftigt auf eine Antwort warten, die kommt nie zurück.urllib.retrieve und urllib2.urlopen kehrt nach dem Download des Bildes nie zurück

-Code

resp = urllib2.urlopen("http://charlesngo.com/wp-content/uploads/2015/11/rat-race-full-res-1030x728.jpg") 
+0

Verwenden Sie 'urllib2.urlopen' oder' urllib.urlretrieve'? Deine Frage sagt eine, dein Beispiel die andere. Bitte bearbeiten Sie Ihre Frage, um sich auf die richtige Funktion zu beziehen. – snakecharmerb

+0

Oh, das ist ein Tippfehler, aber ich habe beide Alternativen ausprobiert, beide funktionieren nicht – codeomnitrix

Antwort

1

Der Server Ihre Anfrage ablehnt, weil er erkennt, dass Sie das Bild von einem Python-Skript zu holen, indem Sie auf Wunsch den User-Agent-Header inspizieren. Sie können einen anderen User-Agent-Header hinzufügen, um den Standard zu überschreiben und eine Anfrage von einem Browser nachzuahmen.

>>> import urllib2 
>>> url = "http://charlesngo.com/wp-content/uploads/2015/11/rat-race-full-res-1030x728.jpg" 
>>> req = urllib2.Request(url) 
>>> resp = urllib2.urlopen(req) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib64/python2.7/urllib2.py", line 127, in urlopen 
    return _opener.open(url, data, timeout) 
    File "/usr/lib64/python2.7/urllib2.py", line 410, in open 
    response = meth(req, response) 
    File "/usr/lib64/python2.7/urllib2.py", line 523, in http_response 
    'http', request, response, code, msg, hdrs) 
    File "/usr/lib64/python2.7/urllib2.py", line 448, in error 
    return self._call_chain(*args) 
    File "/usr/lib64/python2.7/urllib2.py", line 382, in _call_chain 
    result = func(*args) 
    File "/usr/lib64/python2.7/urllib2.py", line 531, in http_error_default 
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp) 
urllib2.HTTPError: HTTP Error 403: Forbidden 
>>> req = urllib2.Request(url) 
>>> req.add_header('user-agent', "Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11") 
>>> resp = urllib2.urlopen(req) 
>>> resp.read()[:10] 
'\xff\xd8\xff\xe0\x00\x10JFIF' 

Siehe this question für mehr auf den User-Agent-Header zu setzen.

Es ist erwähnenswert, dass der Serveradministrator versucht, geskriptete Downloads aus einem bestimmten Grund zu blockieren - z. B. Bandbreitenkosten - also sollten Sie überlegen, ob das Umgehen des Sperrmechanismus eine akzeptable Aktion ist, besonders wenn Sie den Download häufig ausführen.

Verwandte Themen