Curl和Python Requests(get)报告不同的HTTP状态码

9

我写了一个Python脚本来验证主机的URL连接性。在Linux中,curl报告成功(http 200),但在Python(3.6)的requests模块中报告为403。

我希望有人能帮助我理解这里报告的HTTP状态码的差异。

从Linux命令行运行Curl...

$ curl -ILs https://www.h2o.ai|egrep ^HTTP
HTTP/1.1 200 OK

Python requests module.....

>>> import requests
>>> url = 'https://www.h2o.ai'
>>> r = requests.get(url, verify=True, timeout=3)
>>> r.status_code
403
>>> requests.packages.urllib3.disable_warnings()
>>> r = requests.get(url, verify=False, timeout=3)
>>> r.status_code
403

你发送了哪些头部信息?你接收到了哪些头部信息?403错误的原因可能在正文中有更详细的解释。 - tripleee
1个回答

19

看起来 python-requests/<version>User-Agent 会收到该网站的403响应:

In [98]: requests.head('https://www.h2o.ai', headers={'User-Agent': 'Foo bar'})
Out[98]: <Response [200]>

In [99]: requests.head('https://www.h2o.ai')
Out[99]: <Response [403]>

如果你想联系网站所有者,或者通过 User-Agent 头部(就像我上面所用的)使用不同的用户代理,那么你可以这样做。


我如何调试这个问题:

我运行了带有 -v (--verbose)选项的 curl 命令,以检查正在发送的标头,然后使用 requests 并使用 response.request (假设响应已保存为 response)来检查相同的内容。

除了 User-Agent 标头之外,我没有发现任何显着的差异;因此,更改 User-Agent 标头就像我期望的那样起作用了。


这很有帮助,谢谢。您介意分享一下您是如何得出“User-Agent从该站点接收到403响应”的结论的背景吗?例如,如果我正在进行故障排除,我怎么知道这个虚拟标头是h2o.ai所期望的东西? - user9074332
2
这个回复和(尤其是)更新真是太棒了。谢谢! - user9074332

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接