2012-09-14 55 views
1

我試圖用下面的Python代碼檢索HTTP JPG圖像ULRs(以在GUI中顯示它們):從URL檢索JPG圖片(蟒蛇)

import urllib3 
from cStringIO import StringIO 
from PIL import Image 

conn = urllib3.connection_from_url('http://www.solarspace.co.uk/') 
img_file = conn.urlopen('GET', 'http://www.solarspace.co.uk/PlanetPics/Neptune/NeptuneAlt1.jpg') 
image = StringIO(img_file.read()) 
image.seek(0) 
resized_image = Image.open(image) 

然而,這給了我這個錯誤消息:「IOError:無法識別圖像文件」。

爲什麼我使用urllib3的原因是因爲我需要一個持久連接(發送多個請求),這是不可用的urllib/urllib2的。

在此先感謝。

回答

1

看來,如果你使用img_file.data而不是img_file.read()工作。 img_file.read()是爲了在請求中指定preload_content=False時使用。現在,我想,這是不是很直觀,也許img_file.read()應該知道緩存的預加載的內容,或者如果它已經被消耗掉,應該拋出異常。該計劃是使preload_content=False默認值,但原來也有很多的優勢情況下落入正常使用情況下,是很難滿足的。我打開了一個錯誤來解決這個問題:https://github.com/shazow/urllib3/issues/102

反正,使用img_file.data應該可以解決您的問題。對困惑感到抱歉! :)

此外,我建議使用conn.request(...)而不是更低級別conn.urlopen(...),也許使用PoolManager如果你可能要跨域(沒有理由不使用它,真的)。試試這個:

>>> http = urllib3.PoolManager() 
>>> r = http.request('GET', 'http://www.solarspace.co.uk/PlanetPics/Neptune/NeptuneAlt1.jpg') 
>>> resized_image = Image.open(StringIO(r.data)) 
+0

感謝您詳細解答做到這一點。現在一切都很好。 –

2

與往常一樣,requests救援:

>>> r = requests.get('http://www.solarspace.co.uk/PlanetPics/Neptune/NeptuneAlt1.jpg') 
>>> i = Image.open(StringIO.StringIO(r.content)) 
>>> i.size 
(262, 299) 
+0

工程。謝謝。 –

+0

謝謝了'r.content' - 由於某種原因,我試圖用'r.text'不工作這麼好,因爲它使得它的Unicode – sofly

1

當保存它,你可以這樣做:

with open('##.jpg','wb') as fout: 
    fout.write(r.content)