通过SOCKS代理发送请求

3 投票
2 回答
4999 浏览
提问于 2025-04-17 16:36

我该如何通过SOCKs代理发起HTTP请求(简单来说,就是用ssh -D作为代理)?我试过用requests库配合SOCK代理,但似乎不太管用(我看到过这个拉取请求)。比如:

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

继续使用requests库会很方便,但如果知道urllib2可以正常工作,我也可以切换过去。

2 个回答

5

自从 requests 2.10.0 版本开始支持 SOCKS,使用起来变得非常简单,跟你现在的做法很接近。

  1. 首先,安装 requests[socks]

    $ pip install requests[socks]
    
  2. 然后,设置你的代理变量,并使用它:

    >>> 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:// 作为协议。

3

目前,requests库对SOCKS的支持还在开发中。如果你有兴趣,可以查看我的Github仓库,里面有我对Socksipy库的修改版本。这一版本正在逐步整合进requests库,不过要等一段时间才能完全支持。

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

它应该可以和urllib2正常工作。你只需要在你的文件中导入 sockshandler,然后按照里面的例子来做。你需要创建一个像这样的打开器:

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

然后你可以使用 opener.open(url),这样就可以通过代理进行访问了。

撰写回答