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

2024-05-01 22:07:44 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

I have already seen this other post on proxies with the Requests module

它帮助我用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:

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


Tags: inpyhttpsjsonhttpnetrequestpackages
2条回答

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

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

这个库称为human_curl。我自己用过,效果很好。

相信以上的答案,我们试着用人卷发

人类卷曲会产生未知的错误, 鉴于 urllib3给出了正确的错误,如请求超时、url超过了最大重试次数。

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

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

相关问题 更多 >