【问题标题】:Curl and Python Requests (get) reporting different http status codeCurl 和 Python 请求 (get) 报告不同的 http 状态代码
【发布时间】:2018-07-10 23:51:30
【问题描述】:

我编写了一个 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 请求模块.....

>>> 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的原因可能在正文中进行了更详细的解释。

标签: python python-3.x curl python-requests


【解决方案1】:

似乎 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 来检查正在发送的标头,然后使用response.requestrequests 进行相同的检查(假设响应保存为response )。

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

【讨论】:

  • 这很有帮助,谢谢。您是否介意分享一下您如何得出以下结论的背景:“正在为用户代理提供来自站点的 403 响应”。例如。如果我正在排除故障,我怎么知道这个虚拟标头是 h2o.ai 所期望的?
  • 这个响应和(尤其是)更新是一件美丽的事情。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-21
  • 2016-03-22
  • 2013-07-25
  • 2022-01-15
  • 1970-01-01
  • 2016-11-04
  • 2017-09-15
相关资源
最近更新 更多