HTTP 404状态代码(未找到)显示为302

时间:2018-10-10 22:36:47

标签: python http python-requests http-status-code-404 http-status-code-302

我正在尝试使用以下代码段检索python中的URL列表的HTTP状态代码:

try:
    r = requests.head(testpoint_url)
    print(testpoint_url+" : "+str(r.status_code))
    # prints the int of the status code.
except requests.ConnectionError:
    print("failed to connect")

令人惊讶的是,对于某些URL,我得到302状态代码,而如果被浏览器浏览,您会看到它显示404代码!

enter image description here

这是怎么回事?如何获取真实状态代码(例如404)?

1 个答案:

答案 0 :(得分:2)

302是HTTP重定向。 Web浏览器将按照重定向到Location响应标头中报告的URL。请求下一个URL时,它将具有自己的响应代码,其中可以包含404。

您的Python代码没有遵循重定向,这将解释为什么它获得原始302的原因。

根据Requests文档:

Redirection and History

  

默认情况下,请求会对所有动词 HEAD 除外的位置执行重定向。

     

我们可以使用Response对象的history属性来跟踪重定向。

     

Response.history列表包含为完成请求而创建的Response对象。列表从最早到最新的响应排序。

     

...

     

如果您使用的是GET,OPTIONS,POST,PUT,PATCH或DELETE,则可以使用allow_redirects参数禁用重定向处理:

>>> r = requests.get('https://github.com/', allow_redirects=False)

>>> r.status_code
301

>>> r.history
[]
     

如果您使用的是HEAD,则也可以启用重定向

>>> r = requests.head('https://github.com/', allow_redirects=True)

>>> r.url
'https://github.com/'

>>> r.history
[<Response [301]>]

因此,在您的代码中更改此内容:

r = requests.head(testpoint_url)

对此:

r = requests.head(testpoint_url, allow_redirects=True)

然后,r.status_code将是遵循所有重定向的最终状态代码(即404)。