如何获取重定向网址?

时间:2018-01-04 19:55:07

标签: python urllib2

我正在使用urllib.request在python 3.6中执行一系列http调用。我需要检索为响应urllib.request.urlopen调用而返回的302 http重定向的值,如此...

import urllib.request

... many previous http calls ...

post_data = {'foo': 'bar', 'some': 'otherdata'}
encoded = urllib.parse.urlencode(post_data).encode('utf-8')
req = urllib.request.Request('https://some-url', encoded)
redirected_url = urllib.request.urlopen(req).geturl()

我收到类似错误的错误

urllib.error.HTTPError: HTTP Error 302: Found - Redirection to url 'gibberish://login_callback?code=ABCD......' is not allowed

我需要的是实际获取302中返回的urt,因为.geturl()方法应该提供,但我得到一个错误。

请不要回答“嘿,使用我现在超级的其他库”,因为我们花了很长时间使用urllib2构建这个脚本,而且我们对python知识很少。

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

如果您不想使用请求库(此时几乎是核心库的一部分),您需要使用urllib2编写自定义HTTPRedirectHandler。

import urllib2

class CustomHTTPRedirectHandler(urllib2.HTTPRedirectHandler):
    def http_error_302(self, req, fp, code, msg, headers):
        ### DO YOUR STUFF HERE
        return urllib2.HTTPRedirectHandler.http_error_302(self, req, fp, code, msg, headers)

    http_error_301 = http_error_303 = http_error_307 = http_error_302

opener = urllib2.build_opener(CustomHTTPRedirectHandler)
post_data = {'foo': 'bar', 'some': 'otherdata'}
encoded = urllib.parse.urlencode(post_data).encode('utf-8')
req = urllib.request.Request('https://some-url', encoded)
opener.urlopen(req)