2011-12-05 27 views
3

下載圖像我試圖下載使用該代碼的圖像:如何使用的urllib從網絡

from urllib import urlretrieve 
urlretrieve('http://gdimitriou.eu/wp-content/uploads/2008/04/google-image-search.jpg', 
      'google-image-search.jpg') 

它的工作。該圖像已下載,可以通過任何圖像查看器軟件打開。


但是,下面的代碼不起作用。下載的圖像僅爲2KB,無法由任何圖像查看器打開。

from urllib import urlretrieve 
urlretrieve('http://upload.wikimedia.org/wikipedia/en/4/44/Zindagi1976.jpg', 
      'Zindagi1976.jpg') 

這是HTML格式的結果。

ERROR 

The requested URL could not be retrieved 

While trying to retrieve the URL: http://upload.wikimedia.org/wikipedia/en/4/44/Zindagi1976.jpg 

The following error was encountered: 

Access Denied. 
Access control configuration prevents your request from being allowed at this time. Please contact your service provider if you feel this is incorrect. 

Your cache administrator is nobody. 
Generated Mon, 05 Dec 2011 17:19:53 GMT by sq56.wikimedia.org (squid/2.7.STABLE9) 
+2

2KB通常是純文本或html。嘗試更改''''Zindagi1976.jpg''''到'''Zindagi1976.html''''並在瀏覽器中打開它。這些信息可能有助於調試。 (我懷疑是頭文件問題。)請在這裏發佈。 – FakeRainBrigand

+0

@FakeRainBrigand請參閱更新 – Kulbir

+1

看起來維基媒體正在檢查您的請求。當您瀏覽到瀏覽器中的圖像時,它會發送Wikimedia.org有關您設置的信息(例如您的[user-agent](http://en.wikipedia.org/wiki/User_agent))。基於Python發送的內容,它拒絕訪問。我不知道如何使用urlretrieve解決這個問題。 [curl](http://curl.haxx.se/)可能可以做你想做的事,儘管它不是最好的解決方案。 – FakeRainBrigand

回答

12

如果使用下面,你可以下載圖片:

wget http://upload.wikimedia.org/wikipedia/en/4/44/Zindagi1976.jpg 

但是,如果你做了以下內容:

from urllib import urlretrieve 
urlretrieve('http://upload.wikimedia.org/wikipedia/en/4/44/Zindagi1976.jpg', 
      'Zindagi1976.jpg') 

您可能無法下載圖像。這可能是這種情況,因爲維基百科可能有規則(robot.txt)拒絕機器人或機器人(未知客戶端)。 嘗試模擬瀏覽器。

要做到這一點,你必須添加以下內容作爲報頭的一部分:

('User-agent', 
'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) 
Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1') 

你可以做這樣的事情

>>> from urllib import FancyURLopener 
>>> class MyOpener(FancyURLopener): 
...  version = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11' 
... 
>>> myopener = MyOpener() 
>>> myopener.retrieve('http://upload.wikimedia.org/wikipedia/en/4/44/Zindagi1976.jpg', 'Zindagi1976.jpg') 
('Zindagi1976.jpg', <httplib.HTTPMessage instance at 0x1007bfe18>) 

這檢索文件

+0

我累了。 'NameError:名稱'FancyURLopener'未定義' – Kulbir

+0

@no_access:謝謝!我只是改變了問題,以便搜索很容易。 – pyfunc

+0

我正在尋找一種快速的方式來從網址獲取http響應代碼。如果代碼是'200',則下載圖像。我可以用'MyOpener'獲得響應碼嗎?謝謝 – Kulbir