我试图从http://erdos.sdslabs.co/users/shagun.json获取JSON响应。使用浏览器/Python的Requests库会导致身份验证错误,但curl似乎工作正常。
curl http://erdos.sdslabs.co/users/shagun.json
字符串
返回JSON响应。
为什么curl请求可以正常工作,而普通浏览器或基于请求的请求会失败?
我试图从http://erdos.sdslabs.co/users/shagun.json获取JSON响应。使用浏览器/Python的Requests库会导致身份验证错误,但curl似乎工作正常。
curl http://erdos.sdslabs.co/users/shagun.json
字符串
返回JSON响应。
为什么curl请求可以正常工作,而普通浏览器或基于请求的请求会失败?
5条答案
按热度按时间kh212irz1#
使用telnet检查:
字符串
我们看到web服务器响应一个302 - a重定向到Location /login。请求和web浏览器都遵守这个命令,并到达登录提示符。然而,我们看到web服务器 * 也 * 响应你想要的json,curl(和telnet)足够简单,只接受这些数据。
最佳做法是修复Web服务器,使其不需要您登录,或者在要求用户登录的同时不给予受密码保护的数据。
如果你不能改变web服务器,你可以告诉requests模块忽略重定向:
型
qjp7pelc2#
对于像我这样的谷歌人来说:
在我的例子中,问题是我使用
requests.get(url, data={...})
提供了url参数。在将其更改为requests.get(url, params={...})
后,问题就解决了。vltsax253#
如果您在环境中配置了代理,请在会话/请求中也定义它。
以session为例:
字符串
参见文档:
请求http://docs.python-requests.org/en/master/user/quickstart/
会话http://docs.python-requests.org/en/master/user/advanced/
jbose2ul4#
我有过这样的经历,一些python请求代码在前一天工作了,第二天却没有回来,而curl仍然工作。这不是代码,也不是服务器,阅读这篇讨论让我意识到连接中的某些东西可能发生了变化。我禁用并重新启用了我的Wifi,你看,它又工作了。
我没有进一步调查,请求可能已经缓存了一些不再有效的东西。很抱歉这个不合格的输入,但也许它会帮助那里的人。
kokeuurv5#
为了将来的参考,同样的问题,但由于netrc文件。Python请求库决定覆盖授权头,如果找到一个netrc匹配条目。https://requests.readthedocs.io/en/latest/user/authentication/#netrc-authentication