2016-04-01 9 views
0

私は奇妙な問題に直面しています。urllib.retrieveを使用してイメージをダウンロードしようとすると、返されず、端末は応答を待っています。決して戻ることはありません。イメージをダウンロードした後、urllib.retrieveとurllib2.urlopenは返さない

コード

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

あなたは 'urllib2.urlopen'や' urllib.urlretrieve'を使っていますか?あなたの質問は1つ、あなたの例はもう1つです。あなたの質問を編集して、正しい機能を一貫して参照してください。 – snakecharmerb

+0

ああ、タイプミスですが、私は両方の選択肢を試しましたが、どちらも動作していません – codeomnitrix

答えて

1

それはリクエストに応じて、ユーザーエージェントヘッダーを検査することによって、あなたはPythonスクリプトから画像を取得していることを検出したため、サーバーはリクエストを拒否しています。別のユーザーエージェントヘッダーを追加して、既定値を上書きし、ブラウザーからの要求を模倣することができます。

>>> 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' 

ユーザーエージェントヘッダーの設定の詳細は、this questionを参照してください。

サーバ管理者が、たとえば帯域幅コストなどの理由でスクリプトダウンロードをブロックしようとしていることに注意する価値があるので、特にダウンロードを頻繁に実行する場合は、ブロックメカニズムを迂回することが許容できるアクションかどうかを検討する必要があります。