【问题标题】:Curl works but not Python requestsCurl 有效,但 Python 请求无效
【发布时间】:2014-09-18 04:05:06
【问题描述】:

我正在尝试从 http://erdos.sdslabs.co/users/shagun.json 获取 JSON 响应。使用浏览器/Python 的 Requests 库会导致身份验证错误,但 curl 似乎可以正常工作。

curl http://erdos.sdslabs.co/users/shagun.json 

返回 JSON 响应。

为什么 curl 请求会在普通浏览器或基于请求的请求失败时工作?

【问题讨论】:

  • 您是在家还是在公司网络中?
  • 在浏览器中访问该 url 会将我重定向到登录对话框,但 curl 有效。也许它正在检查用户代理?
  • 在这种情况下,请求应该有效。
  • 你没有设置代理或任何东西,是吗?
  • 没有。没有设置代理

标签: python curl python-requests


【解决方案1】:

使用telnet查看:

$ telnet erdos.sdslabs.co 80
Trying 62.141.37.215...
Connected to erdos.sdslabs.co.
Escape character is '^]'.
GET http://erdos.sdslabs.co/users/shagun.json HTTP/1.0

HTTP/1.1 302 Found
Date: Sat, 26 Jul 2014 11:18:58 GMT
Server: Apache
Set-Cookie: PHPSESSID=juvg7vrg3vs4t00om3a95m4sc7; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Location: /login
Access-Control-Allow-Origin: http://erdos.sdslabs.co
X-Powered-By: PleskLin
Content-Length: 1449
Connection: close
Content-Type: application/json

{"email":"sshagun.sodhani@gmail.com","username":"shagun","name":"Shagun      
[...]

我们看到 Web 服务器正在响应 302 - 重定向到位置 /login。请求和网络浏览器都遵循这一点,并达到登录提示。但是,我们看到 Web 服务器响应您所追求的 json,并且 curl(和 telnet)非常简单,只需接受该数据。

最佳做法是修复网络服务器,使其不需要您登录,或者在要求用户登录的同时不提供受密码保护的数据。

如果你不能改变网络服务器,你可以告诉请求模块忽略重定向:

import requests
result = requests.get('http://erdos.sdslabs.co/users/shagun.json', allow_redirects=False)
print result.content

【讨论】:

    【解决方案2】:

    如果您在您的环境中配置了代理,请在您的会话/请求中定义它。

    以会话为例:

        my_proxies = {  
            'http': 'http://myproxy:8080',  
            'https': 'https://myproxy:8080'  
        }
    
        session = requests.Session()  
        request = requests.Request('POST', 'http://my.domain.com', data=params_template, headers=req_headers, proxies=my_proxies)  
        prepped = session.prepare_request(request)  
        response = session.send(prepped)  
    

    参见文档:
    请求http://docs.python-requests.org/en/master/user/quickstart/
    会话http://docs.python-requests.org/en/master/user/advanced/

    【讨论】:

    【解决方案3】:

    对于像我这样的迟到的谷歌人:

    就我而言,问题在于我使用requests.get(url, data={...}) 提供了url 参数。改成requests.get(url, params={...})后,问题就解决了。

    【讨论】:

    • 这正是我的情况,现在可以了,谢谢!我想我在 POST 和 GET 之间来回切换,并没有意识到它们使用不同的参数名称。
    【解决方案4】:

    我有这样的经验,一些以前工作的 python 请求代码第二天没有回来,而 curl 仍在工作。不是代码,也不是服务器,阅读此讨论后,我意识到连接中的某些内容可能已经改变。 我禁用并重新启用了我的 Wifi,你瞧,它又工作了。

    我没有进一步调查,请求可能缓存了一些不再有效的东西。很抱歉这个不合格的输入,但也许它会帮助那里的人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-19
      • 2018-10-27
      • 1970-01-01
      • 1970-01-01
      • 2017-01-14
      • 2018-10-22
      • 1970-01-01
      • 2021-11-18
      相关资源
      最近更新 更多