¿Cómo encaminar las solicitudes de urllib a través de la red TOR?

¿Cómo encaminar las solicitudes de urllib a través de la red TOR?

Esto funciona para mí (usando urllib2, no he probado urllib):

def req(url): proxy_support = urllib2.ProxyHandler({"http" : "127.0.0.1:8118"}) opener = urllib2.build_opener(proxy_support) opener.addheaders = [('User-agent', 'Mozilla/5.0')] return opener.open(url).read() print req('http://google.com') 

Tor trabaja como proxy, ¿verdad? Así que pregúntate a ti mismo “¿Cómo uso los servidores proxy en urllib?”

Ahora, cuando miro los documentos, lo primero que veo es

 urllib.urlopen(url[, data[, proxies]]) 

lo que me parece bastante sugerente …

Logré realizar una solicitud urlib.request para obtener una URL de cebolla. Encontré una solución basada en este post: Python 3.2: urllib, SSL y TOR a través de socket: error con la función fileno

Aquí está el código modificado:

 import socks import socket # This function has no DNS resolve # it need to use the real ip adress to connect instead of www.google.com def create_connection_fixed_dns_leak(address, timeout=None, source_address=None): sock = socks.socksocket() sock.connect(address) return sock # MUST BE SET BEFORE IMPORTING URLLIB socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 9050) # patch the socket module socket.socket = socks.socksocket socket.create_connection = create_connection_fixed_dns_leak from urllib import request if __name__ == "__main__": for proxy in request.getproxies(): print(str(proxy)) url = 'http://url_of_hidden_service.onion:port' req = request.Request(url) res = request.urlopen(req) print(str(res.read()))