如何在Windows上使用python Requests与Putty SOCKS代理?

1 投票
1 回答
3722 浏览
提问于 2025-04-17 23:21

我设置了Putty来创建一个Socks代理,连接到一个服务器。现在我可以用Chrome和Firefox访问这个主机。

但是,当我用requests库时,出现了一个错误,似乎是和Putty的连接有问题。

我尝试设置HTTP_PROXY这个环境变量,也尝试过传递proxies参数。设置环境变量的方法出现了“解析失败”的错误,而使用proxies的方法则显示“最大重试次数超出”的错误。

设置环境变量时,调用 requests.get("http://10.122.116.17:8080/") 会出现这个错误:

requests.packages.urllib3.exceptions.LocationParseError: Failed to parse: Failed to parse: "localhost:1088"

传递proxies参数时,调用 requests.get("http://10.122.116.17:8080/",proxies=proxies) 会出现这个错误:

requests.exceptions.ConnectionError: HTTPConnectionPool(host='localhost', port=1088): Max retries exceeded with url: http://10.122.116.17:8080/ (Caused by <class 'httplib.BadStatusLine'>: '')

我安装了Wireshark,并在我的代理服务器(216.255.67.119)上进行过滤。当我运行Firefox时,可以看到有流量发送到这个地址。但当我运行Python的Requests库时,似乎没有任何流量到达服务器。所以我怀疑requests中的代理机制没有连接到我的Putty会话。

有没有人能给我一些提示或建议,看看这里可能发生了什么?我已经谷歌搜索到手指都疼了!

提前谢谢大家!!!

这是我用Firefox访问服务器时的样子……

Tomcat on Private Server

---------------- cmd输出 -------------------------

C:\Users\patman>set HTTP_PROXY="localhost:1088"
C:\Users\patman>echo %HTTP_PROXY%
"localhost:1088"
C:\Users\patman>set HTTPS_PROXY="localhost:1088"
C:\Users\patman>python
Enthought Python Distribution -- www.enthought.com
Version: 7.3-2 (64-bit)

Python 2.7.3 |EPD 7.3-2 (64-bit)| (default, Apr 12 2012, 15:20:16) [MSC v.1500 64 bit (AMD64)] on win32
Type "credits", "demo" or "enthought" for more information.
>>> import requests
>>> requests.get("http://10.122.116.17:8080/")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\site-packages\requests-1.2.0-py2.7.egg\requests\api.py",
line 55, in get
    return request('get', url, **kwargs)
  File "C:\Python27\lib\site-packages\requests-1.2.0-py2.7.egg\requests\api.py",
line 44, in request
    return session.request(method=method, url=url, **kwargs)
  File "C:\Python27\lib\site-packages\requests-1.2.0-py2.7.egg\requests\sessions
.py", line 346, in request
    resp = self.send(prep, **send_kwargs)
  File "C:\Python27\lib\site-packages\requests-1.2.0-py2.7.egg\requests\sessions
.py", line 449, in send
    r = adapter.send(request, **kwargs)
  File "C:\Python27\lib\site-packages\requests-1.2.0-py2.7.egg\requests\adapters
.py", line 263, in send
    conn = self.get_connection(request.url, proxies)
  File "C:\Python27\lib\site-packages\requests-1.2.0-py2.7.egg\requests\adapters
.py", line 188, in get_connection
    conn = ProxyManager(self.poolmanager.connection_from_url(proxy))
  File "C:\Python27\lib\site-packages\requests-1.2.0-py2.7.egg\requests\packages
\urllib3\poolmanager.py", line 122, in connection_from_url
    u = parse_url(url)
  File "C:\Python27\lib\site-packages\requests-1.2.0-py2.7.egg\requests\packages
\urllib3\util.py", line 156, in parse_url
    raise LocationParseError("Failed to parse: %s" % url)
requests.packages.urllib3.exceptions.LocationParseError: Failed to parse: Failed to parse: "localhost:1088"

>>> >>> proxies = {
...           "http": "localhost:1088",
...           "https": "localhost:1088",
...         }
>>> requests.get("http://10.122.116.17:8080/",proxies=proxies)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\site-packages\requests-1.2.0-py2.7.egg\requests\api.py",
line 55, in get
    return request('get', url, **kwargs)
  File "C:\Python27\lib\site-packages\requests-1.2.0-py2.7.egg\requests\api.py",
line 44, in request
    return session.request(method=method, url=url, **kwargs)
  File "C:\Python27\lib\site-packages\requests-1.2.0-py2.7.egg\requests\sessions
.py", line 346, in request
    resp = self.send(prep, **send_kwargs)
  File "C:\Python27\lib\site-packages\requests-1.2.0-py2.7.egg\requests\sessions
.py", line 449, in send
    r = adapter.send(request, **kwargs)
  File "C:\Python27\lib\site-packages\requests-1.2.0-py2.7.egg\requests\adapters
.py", line 318, in send
    raise ConnectionError(e)
requests.exceptions.ConnectionError: HTTPConnectionPool(host='localhost', port=1
088): Max retries exceeded with url: http://10.122.116.17:8080/ (Caused by <clas
s 'httplib.BadStatusLine'>: '')
>>> requests.__version__
'1.2.0'
>>> import urllib3
>>> urllib3.__version__
'1.7.1'
>>>

Putty设置……

enter image description here

1 个回答

4

目前,Requests库不支持SOCKS代理。我们希望在它的基础库urllib3中能加入这个功能,但具体的时间还不确定。这个问题可以在这里查看

2016年更新: 从Requests 2.10版本开始,Requests现在支持SOCKS代理。你可以通过安装socks这个扩展来获得这个功能,命令是:pip install requests[socks]

撰写回答