通过SOCKs代理请求

3

如何通过SOCKs代理(仅使用ssh -D作为代理)发出HTTP请求?我尝试过使用SOCK代理的请求,但似乎不起作用(我看到了这个pull request)。例如:

proxies = { "http": "socks5://localhost:9999/" }
r = requests.post( endpoint, data=request, proxies=proxies )

如果 requests 库可用,那么仍然使用它会更为方便,但如果已知 urllib2 经过测试可以正常工作,则也可以切换到使用 urllib2。

2个回答

5

自从请求 2.10.0版本添加了SOCKS支持,它变得非常简单,与您拥有的非常接近

  1. Install requests[socks]:

    $ pip install requests[socks]
    
  2. Set up your proxies variable, and make use of it:

    >>> import requests
    >>> proxies = {
            "http":"socks5://localhost:9999",
            "https":"socks5://localhost:9999"
        }
    >>> requests.get(
            "https://api.ipify.org?format=json",
            proxies=proxies
        ).json()
    {u'ip': u'123.xxx.xxx.xxx'}
    
需要注意的几点是在代理URL末尾不要使用/,如果SOCKS服务器不支持SOCKS5,也可以使用socks4://作为协议。

1
此外,如果您希望在代理上执行DNS查找而不是本地执行,请使用"socks5h"而不是"socks5"。 - Mathieu Longtin

3

目前requests对SOCKS的支持还在等待中。如果您想了解更多信息,可以查看我的Github存储库,以查看我的Socksipy库分支。这是目前正在集成到requests中的分支;但是,需要一些时间才能完全支持它。

https://github.com/Anorov/PySocks/

它与urllib2一起使用应该ok。在您的文件中导入sockshandler,并按其中的示例进行操作。您将需要创建一个这样的打开程序:

opener = urllib2.build_opener(SocksiPyHandler(socks.PROXY_TYPE_SOCKS5, "localhost", 9050))

然后你可以使用 opener.open(url),它会通过代理隧道传输。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接