经过一些快速而肮脏的实验,我想我可以说我找到了您问题的部分答案。默认情况下,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 块中包含调用块才能捕获该异常。我想可能有办法克服这个问题,让处理更好,但我不确定。
无论如何,您可以查看文档here 了解更多详细信息。
希望对你有帮助。
编辑:
实际上,您可能想要覆盖 redirect_request,它还涵盖其他重定向代码(不仅是 302)。按照this的说法,应该是要走的路。