【问题标题】:How do I use python Requests with a Putty SOCKS Proxy on Windows?如何在 Windows 上使用带有 Putty SOCKS 代理的 python 请求?
【发布时间】:2014-04-29 10:46:54
【问题描述】:

我已经设置了 Putty 来创建一个到服务器的 Socks 代理。我可以使用 Chrome 和 Firefox 访问主机。 当我使用请求时,我收到一个错误,似乎表明与 Putty 的连接有问题。 我尝试设置 HTTP_PROXY 环境变量,并尝试传递代理参数。 env 变量方法产生“解析失败”错误,代理方法产生超出的最大重试次数。

调用requests.get("http://10.122.116.17:8080/")时设置env会产生这个错误

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

在调用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 时,我看不到服务器的任何流量。所以我怀疑请求中的代理机制没有进入我的 Putty 会话。

有人对这里可能发生的事情有任何提示或建议吗?我一直在谷歌上搜索,直到我的手指受伤!

提前致谢!!!

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

---------------- 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'
>>>

腻子设置...

【问题讨论】:

  • 粗略浏览一下源代码后,requests 似乎只支持 HTTP 代理而不支持 SOCKS 样式。另请注意,它期望HTTP(S)_PROXY 变量具有模式,即类型为http://x.y.z.t:pppp/。尝试将其设置为socks5://127.0.0.1:1088

标签: python windows python-requests putty socks


【解决方案1】:

Requests 目前不支持 SOCKS 代理。我们希望得到底层urllib3 库的支持,但没有明确的时间框架。由this issue 跟踪。

2016 年编辑:从 Requests 2.10 开始,Requests 现在支持 SOCKS 代理。您可以通过安装socks 额外获得支持:pip install requests[socks]

【讨论】:

  • 谢谢 - 我怀疑可能是这种情况。我能够通过使用这个 requesocks 得到一些有用的东西这是建议的here。这通过腻子起作用!
  • 请求已经从 2.x 版本开始支持 socks。 pip install requests[socks]
  • SOCKS 支持在 2.10 中登陆 Requests,该版本于 2016 年 4 月发布,距离我写这个原始答案两年多。 =)
  • 你能否添加一些示例,如何设置它以便 python 使用 putty socks(例如,我们已经配置了整个 putty 隧道,并且我们在其他软件中使用它......只是如何制作 python 解释器通过 putty 的 127.0.0.1:4444 转发?
猜你喜欢
  • 2012-09-18
  • 1970-01-01
  • 1970-01-01
  • 2012-06-13
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多