いくつかの簡単で汚い実験の後、私はあなたの質問に対する部分的な答えを見つけたと言えると思います. どちらもデフォルトで同じように動作しますopener.open()
。urlopen()
関数を介してしか出力を読み取ることができない場合でも、リダイレクト先のページをダウンロードしますread()
。
ただし、 に渡される独自のハンドラを使用して、これらのデフォルトをオーバーライドできますbuild_opener()
。たとえば、一部の URL へのリダイレクトを失敗させるには、HTTPRedirectHandlerをサブクラス化することで、これと同様のことを行うことができます。
class MyRedirectHandler(urllib2.HTTPRedirectHandler):
def http_error_302(self, req, fp, code, msg, hdrs):
if fp.geturl().startswith('http://www.facebook.com/'):
# This will raise an exception similar to this:
# urllib2.HTTPError: HTTP Error 302: FOUND
return None
else:
# Let the default handling occur
return super(MyRedirectHandler, self).http_error_302(req, fp, code, msg, hdrs)
次のように使用します。
opener = urllib2.build_handler(MyRedirectHandler)
try:
fp = opener.open(url)
except urllib2.HTTPError:
content = None
print 'This URL is not allowed or something'
else:
content = fp.read()
もちろん、その例外をキャッチするには、呼び出しブロックを try/except ブロックに含める必要があります。これを克服し、ハンドリングをより良くする方法があるのではないかと思いますが、よくわかりません。
とにかく、詳細についてはこちらのドキュメントを確認してください。
それが役に立てば幸い。
編集:
redirect_request
実際には、 (302 だけでなく) 他のリダイレクト コードもカバーするものをオーバーライドしたい場合があります。thisによると、それが進むべき道です。