python请求中的Http重定向代码3XX

时间:2014-03-03 14:59:38

标签: python redirect python-requests http-status-codes

我正在尝试为重定向网址捕获http状态代码3XX / 302。但我无法得到它,因为它提供了200个状态代码。

以下是代码:

import requests
r = requests.get('http://goo.gl/NZek5')
print r.status_code

我认为这应该发出301或302,因为它会重定向到另一个页面。我曾经尝试过几次重定向网址(例如http://fb.com)但是又发布了200.应该怎样做才能正确捕获重定向代码?

3 个答案:

答案 0 :(得分:47)

requests为您处理重定向 ,请参阅redirection and history

如果您不希望allow_redirects=False处理重定向,请设置requests,或者您可以检查r.history列表中包含的重定向响应。

演示:

>>> import requests
>>> r = requests.get('http://goo.gl/NZek5')
>>> r.history
(<Response [301]>,)
>>> r.history[0].status_code
301
>>> r.history[0].headers['Location']
'http://docs.python-requests.org/en/latest/user/quickstart/'
>>> r.url
u'http://docs.python-requests.org/en/latest/user/quickstart/'
>>> r = requests.get('http://goo.gl/NZek5', allow_redirects=False)
>>> r.status_code
301
>>> r.url
u'http://goo.gl/NZek5'

因此,如果allow_redirectsTrue,则会遵循重定向,并且返回的最终响应是重定向后的最后一页。如果allow_redirectsFalse,则会返回第一个响应,即使它是重定向。

答案 1 :(得分:10)

requests.get允许使用默认为allow_redirects的可选关键字参数True。将allow_redirects设置为False将自动禁用重定向,如下所示:

In [1]: import requests
In [2]: r = requests.get('http://goo.gl/NZek5', allow_redirects=False)
In [3]: print r.status_code
301

答案 2 :(得分:0)

此解决方案将识别重定向并显示重定向的历史记录,并将处理常见错误。这将在控制台中询问您的URL。

import requests

def init():
    console = input("Type the URL: ")
    get_status_code_from_request_url(console)


def get_status_code_from_request_url(url, do_restart=True):
    try:
        r = requests.get(url)
        if len(r.history) < 1:
            print("Status Code: " + str(r.status_code))
        else:
            print("Status Code: 301. Below are the redirects")
            h = r.history
            i = 0
            for resp in h:
                print("  " + str(i) + " - URL " + resp.url + " \n")
                i += 1
        if do_restart:
            init()
    except requests.exceptions.MissingSchema:
        print("You forgot the protocol. http://, https://, ftp://")
    except requests.exceptions.ConnectionError:
        print("Sorry, but I couldn't connect. There was a connection problem.")
    except requests.exceptions.Timeout:
        print("Sorry, but I couldn't connect. I timed out.")
    except requests.exceptions.TooManyRedirects:
        print("There were too many redirects.  I can't count that high.")


init()