我正在尝试为重定向网址捕获http状态代码3XX / 302。但我无法得到它,因为它提供了200个状态代码。
以下是代码:
import requests
r = requests.get('http://goo.gl/NZek5')
print r.status_code
我认为这应该发出301或302,因为它会重定向到另一个页面。我曾经尝试过几次重定向网址(例如http://fb.com)但是又发布了200.应该怎样做才能正确捕获重定向代码?
答案 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_redirects
为True
,则会遵循重定向,并且返回的最终响应是重定向后的最后一页。如果allow_redirects
为False
,则会返回第一个响应,即使它是重定向。
答案 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()