Python中使用Requests出现BadStatusLine错误

4

我在Python中使用Requests库,但经常遇到BadStatusLine错误。

我的代码如下:

import requests

ip = 'xx.xx.xx.xx'
port = 80
proxies={
        'http': 'http://%s:%s'%(ip, port),
        'https': 'https://%s:%s'%(ip, port)
    }

url = 'https://url'
d = {'active_id': 117}

r=requests.post(url, data=d, proxies=proxies)

例外显示:
File "/root/untitled-5.py", line 13, in <module>
  r=requests.post(url, data=d,proxies=proxies, headers={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36'},verify=False)
File "/usr/lib/python2.7/dist-packages/requests/api.py", line 110, in post
  return request('post', url, data=data, json=json, **kwargs)
File "/usr/lib/python2.7/dist-packages/requests/api.py", line 56, in request
  return session.request(method=method, url=url, **kwargs)
File "/usr/lib/python2.7/dist-packages/requests/sessions.py", line 488, in request
  resp = self.send(prep, **send_kwargs)
File "/usr/lib/python2.7/dist-packages/requests/sessions.py", line 609, in send
  r = adapter.send(request, **kwargs)
File "/usr/lib/python2.7/dist-packages/requests/adapters.py", line 473, in send
  raise ConnectionError(err, request=request)

requests.exceptions.ConnectionError: ('Connection aborted.', BadStatusLine("''",))

我从Google上找到了一些解决方案。我尝试将最后一行改为:
1 r=requests.post(url, data=d, proxies=proxies, varify=False)
2 r=requests.post(url, data=d, proxies=proxies, headers={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36'})

但实际上没有人在工作。我想知道为什么以及如何处理这个问题。谢谢。

你能否尝试使用 https 代理再次运行? - bhansa
如果不起作用,请尝试添加您的头文件headers={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36'}。 - Argus Malware
1个回答

1
当您的Python客户端接收到空响应(头/正文)时,会出现此错误。
顺便说一句,更新的Python版本会抛出不同的异常,这可能是由于服务器断开连接或网络问题引起的。
在我的情况下,我们花了几周时间尝试重现它,直到我们找到了主要原因,我们有一个Python应用程序向Nginx负载均衡器后面的服务发送请求,
我们发现当客户端超过默认的Nginx配置client_header_timeout/client_body_timeout(60秒)时,Nginx会断开连接,这是Nginx等待来自客户端的其他数据包的时间。
您可以参考此链接http://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_timeout 当我们的应用程序加载了CPU处理时,连接已建立,但是头和请求体需要长时间延迟才能传输,超过82秒。
因此,Nginx关闭连接并返回重置数据包(记录了带有空正文和标题的tcpdump),官方应该返回状态码408,但实际上没有发生。
我们通过将client_header_timeout/client_body_timeout增加到180秒来解决这个问题。
server {
..
client_body_timeout 180s;
client_header_timeout 180s;
}

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