示例代码:
#!/usr/bin/python
import socks
import socket
import urllib2
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS4, "127.0.0.1", 9050, True)
socket.socket = socks.socksocket
print urllib2.urlopen("http://almien.co.uk/m/tools/net/ip/").read()
TOR正在端口9050 (其默认端口)上运行SOCKS代理。请求通过TOR,出现在我自己的IP地址之外的其他IP地址。但是,TOR控制台会给出警告:
"Feb 28 22:44:26.233警告您的应用程序(使用socks4到端口80)只给Tor一个IP地址。进行DNS解析的应用程序可能会泄漏信息。请考虑改用Socks4A (例如,通过privoxy或socat)。有关详细信息,请参阅https://wiki.torproject.org/TheOnionRouter/TorFAQ#SOCKSAndDNS。“
即DNS查找不会通过代理。但这就是setdefaultproxy的第四个参数应该做的事情,对吧?
来自http://socksipy.sourceforge.net/readme.txt
设置代理(代理类型,地址[,端口[,rdns[,用户名,密码])
rdns -这是一个布尔标志,用于修改有关DNS解析的行为。如果设置为True,将在服务器上远程执行DNS解析。
选择PROXY_TYPE_SOCKS4和PROXY_TYPE_SOCKS5时效果相同。
它不能是本地DNS缓存(如果urllib2支持的话),因为当我将URL更改为此计算机以前从未访问过的域时,就会发生这种情况。
发布于 2012-12-17 11:32:33
问题是httplib.HTTPConnection
使用了socket
模块的DNS函数,该函数在连接套接字之前通过通常的getaddrinfo
方法执行create_connection
请求。
解决方案是创建您自己的create_connection
函数,并在导入urllib2
之前将其修补到socket
模块中,就像我们对socket
类所做的那样。
import socks
import socket
def create_connection(address, timeout=None, source_address=None):
sock = socks.socksocket()
sock.connect(address)
return sock
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 9050)
# patch the socket module
socket.socket = socks.socksocket
socket.create_connection = create_connection
import urllib2
# Now you can go ahead and scrape those shady darknet .onion sites
发布于 2011-12-17 02:13:33
我发表了一篇带有完整源代码的文章,展示了如何在http://blog.databigbang.com/distributed-scraping-with-multiple-tor-circuits/上使用urllib2 + SOCKS + Tor
希望它能解决你的问题。
https://stackoverflow.com/questions/5148589
复制相似问题