通过Python请求模块发出HTTP请求,而curl通过代理不工作?为什么?

通过Python请求模块发出HTTP请求,而curl通过代理不工作?为什么?,python,proxy,get,http-request,python-requests,Python,Proxy,Get,Http Request,Python Requests,使用这个curl命令,我可以从Bash获得我想要的响应 curl -v -u z:secret_key --proxy http://proxy.net:80 \ -H "Content-Type: application/json" https://service.com/data.json 它帮助我用Python编写代码,但我需要通过代理发出请求。然而,即使提供适当的代理,它也不起作用。也许我只是没看到什么 >>> requests.request('GET', 'h

使用这个curl命令,我可以从Bash获得我想要的响应

curl -v -u z:secret_key --proxy http://proxy.net:80  \
-H "Content-Type: application/json" https://service.com/data.json

它帮助我用Python编写代码,但我需要通过代理发出请求。然而,即使提供适当的代理,它也不起作用。也许我只是没看到什么

>>> requests.request('GET', 'https://service.com/data.json', \
>>> headers={'Content-Type':'application/json'}, \ 
>>> proxies = {'http' : "http://proxy.net:80",'https':'http://proxy.net:80'}, \
>>> auth=('z', 'secret_key'))
此外,在同一个python控制台上,我可以使用urllib发出一个成功的请求

>>> import urllib
>>> urllib.urlopen("http://www.httpbin.org").read()
---results---
即使只是在非https地址上尝试请求也无法工作

>>> requests.get('http://www.httpbin.org')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Library/Python/2.6/site-packages/requests/api.py", line 79, in get
   return request('get', url, **kwargs)
File "/Library/Python/2.6/site-packages/requests/api.py", line 66, in request
    prefetch=prefetch
File "/Library/Python/2.6/site-packages/requests/sessions.py", line 191, in request
    r.send(prefetch=prefetch)
File "/Library/Python/2.6/site-packages/requests/models.py", line 454, in send
    raise ConnectionError(e)
requests.exceptions.ConnectionError: Max retries exceeded for url:
>>请求。获取('http://www.httpbin.org')
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
get中的文件“/Library/Python/2.6/site packages/requests/api.py”,第79行
返回请求('get',url,**kwargs)
文件“/Library/Python/2.6/site packages/requests/api.py”,第66行,请求中
预回迁=预回迁
文件“/Library/Python/2.6/site packages/requests/sessions.py”,第191行,在request中
r、 发送(预回迁=预回迁)
文件“/Library/Python/2.6/site packages/requests/models.py”,第454行,在send中
升起连接器错误(e)
requests.exceptions.ConnectionError:超过url的最大重试次数:

请求是如此优雅和令人敬畏,但在这种情况下它怎么会失败呢

问题实际上在于python的标准url访问库—urllib/urllib2/httplib。我不记得哪个库是罪魁祸首,但为了简单起见,让我们称它为urllib。不幸的是,urllib没有实现通过HTTP(s)代理访问https站点所需的HTTP Connect方法。我使用urllib添加功能的努力没有成功(自从我尝试以来已经有一段时间了)。所以不幸的是,我所知道的唯一可行的方法就是在这种情况下使用pycurl

然而,有一个相对干净的解决方案,它几乎与python请求完全相同的API,但它使用pycurl后端而不是python标准库


图书馆的名字叫。我自己也用过,效果很好。

相信上面的答案,我们试过人类卷曲

人类会犯一些错误,比如未知错误, 鉴于 urllib3给出了正确的错误,如请求超时,url超过了最大重试次数

所以,我们回到urllib3,urllib3是线程安全的。我们对urllib3很满意

现在唯一的问题是“超过最大重试次数”, 我们不能解决它, 猜测这可能与服务器/代理有关,
但不确定。

我知道我可以在Mac电脑上安装和使用pycurl,而不会有太多麻烦(或者根本不会)。我只是想寻找一个更优雅的解决方案来使用请求,这是非常棒和干净的。不过,谢谢你的建议。在这里设置一个用于请求的代理就可以了。理想情况下,我们可以重现你所看到的。。。否则告诉我们为什么它不起作用是唯一的选择。您是否从请求中获取堆栈跟踪?您还可以监视您的网络并检查实际请求,因为我只能猜测它们必须不同,才能在curl/请求之间观察到不同的效果。我现在注意到,使用任何库/模块的任何类型的https请求在Python中都不起作用。但是,只执行一个普通的http请求就可以了。你认为这可能是我的环境变量吗?如何检查错误?默认情况下,请求进行https证书验证。可能是无法验证您的代理的证书?我在工作中使用请求,一切似乎都正常,包括通过https连接的通信。此外,我们还使用代理调试http请求。如果你能阐明你的问题,我也许能帮助你。那是不对的。urllib2确实支持HTTP connect(),而请求直到2.0()才支持它。