HTTPS代理与Python的requests模块不兼容

11 投票
1 回答
41900 浏览
提问于 2025-04-18 08:42

我刚接触Python,正在用它的requests模块来代替PHP的cURL库。我的代码如下:

import requests
import json
import os
import urllib
import math
import sys

def main() :    
   url = 'https://api.com'

   headers = {'Content-Type': 'application/json; charset=utf-8',
              'User-Agent': '(iPhone; iOS 7.0.4; Scale/2.00)'}

   d = {'token': "12345"}

   proxies = {
      "https": "https://27.254.52.99:8080",
   }

   post = json.dumps(d);
   r = requests.post(url, data=post, headers=headers, proxies=proxies)
   print r.json

if __name__ == "__main__":
    main()

但是,我遇到了以下错误:

File "test.py", line 42, in test
r = requests.post(url, data=post, headers=headers, proxies=proxies)
File "/Library/Python/2.7/site-packages/requests-2.2.1-py2.7.egg/requests/api.py", line 88, in post
return request('post', url, data=data, **kwargs)
File "/Library/Python/2.7/site-packages/requests-2.2.1-py2.7.egg/requests/api.py", line 44, in request
return session.request(method=method, url=url, **kwargs)
File "/Library/Python/2.7/site-packages/requests-2.2.1-py2.7.egg/requests/sessions.py", line 383, in request
resp = self.send(prep, **send_kwargs)
File "/Library/Python/2.7/site-packages/requests-2.2.1-py2.7.egg/requests/sessions.py", line 486, in send
r = adapter.send(request, **kwargs)
File "/Library/Python/2.7/site-packages/requests-2.2.1-py2.7.egg/requests/adapters.py", line 381, in send
raise ProxyError(e)
ProxyError: Cannot connect to proxy. Socket error: [Errno 54] Connection reset by peer.

1 个回答

12

编辑于2019年6月:这个回复现在已经不相关了。问题已经解决。

编辑2:“请注意,即使是HTTPS代理,代理地址的协议也是HTTP,这是因为客户端和代理服务器在普通HTTP中发起了隧道连接(CONNECT方法)。不过,这在三年前可能并不成立。” - 来自评论

在请求中,HTTPS有些“问题”。我不太清楚具体情况,但你可以在这个网站上找到一些关于这个问题的其他话题。此外,GitHub上还有一个相关的问题仍在讨论中,在这里。我怀疑你遇到的问题就是那里提到的。如果我说错了,请有人纠正我。

为了验证:

$~ curl --proxy https://27.254.52.99:8080 icanhazip.com
27.254.52.99

可以工作,但在Python中:

>>> proxies={'https': 'https://27.254.52.99:8080'}
>>> r = requests.get('http://icanhazip.com', headers={'User-Agent': 'Bla'}, proxies=proxies)
print r.content
<my ipv6 address comes up>

如你所见,我的地址显示出来了,这意味着代理没有起作用。

我不明白你为什么会收到堆栈跟踪信息。也许是因为你的API也是HTTPS(?)。或者可能你的API就是...挂了。

无论如何,如果是HTTP,代理在请求中是可以工作的。

>>> proxies={'http': 'http://27.254.52.99:8080'}
>>> r = requests.head('http://icanhazip.com', headers={'User-Agent': 'Bla'}, proxies=proxies)
print r.content
27.254.52.99

撰写回答