我正在尝试使用以下代码段检索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代码!
这是怎么回事?如何获取真实状态代码(例如404)?
答案 0 :(得分:2)
302是HTTP重定向。 Web浏览器将按照重定向到Location
响应标头中报告的URL。请求下一个URL时,它将具有自己的响应代码,其中可以包含404。
您的Python代码没有遵循重定向,这将解释为什么它获得原始302的原因。
根据Requests文档:
默认情况下,请求会对所有动词 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)。