Curl和Python请求(get)报告不同的http状态代码

use*_*332 4 python curl python-3.x python-requests

我编写了一个python脚本来验证来自主机的url连接.在Linux中报告成功(http 200)的内容在curlpython(3.6)requests模块中报告为403 .

我希望有人能帮我理解报告的http状态代码中的差异吗?

来自Linux命令行的卷曲....

$ curl -ILs https://www.h2o.ai|egrep ^HTTP
HTTP/1.1 200 OK
Run Code Online (Sandbox Code Playgroud)

Python请求模块.....

>>> 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
Run Code Online (Sandbox Code Playgroud)

hee*_*ayl 6

看来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]>
Run Code Online (Sandbox Code Playgroud)

如果需要,您可以联系网站所有者,或者只是通过User-Agent标题使用其他用户代理(就像我上面使用的那样).


我是如何调试的:

我已经curl使用-v(--verbose)选项来检查正在发送的标头,然后requests使用相同的方式检出response.request(假设响应保存为response).

除了User-Agent标题之外,我没有发现任何显着差异; 因此,更改User-Agent标题按预期工作.

  • 这种回应和(尤其是)更新是一件美妙的事情。谢谢你! (2认同)