2011-12-05 6 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))がWikimedia.orgに送信されます。これまでにPythonが送信したことに基づいて、アクセスを拒否しています。私はurlretrieveを使ってこれを修正する方法を知らない。 [カール](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:name 'FancyURLopener'が定義されていません。 – Kulbir

+0

@no_access:ありがとうございます。私はちょうどそれが検索のために簡単になるように質問を変更しました。 – pyfunc

+0

私は、URLからhttpレスポンスコードを取得する簡単な方法を探しています。コードが '200 'の場合、画像をダウンロードしてください。私は 'MyOpener'でレスポンスコードを取得できますか?ありがとう – Kulbir

関連する問題