通过SOCKS代理发送请求
我该如何通过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,使用起来变得非常简单,跟你现在的做法很接近。
首先,安装
requests[socks]
:$ pip install requests[socks]
然后,设置你的代理变量,并使用它:
>>> 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)
,这样就可以通过代理进行访问了。