Usando urllib2 con proxy SOCKS

¿Es posible obtener páginas con urllib2 a través de un proxy SOCKS en un servidor de calcetines de una base por abridor? He visto la solución utilizando el método setdefaultproxy, pero necesito tener calcetines diferentes en diferentes abridores.

Así que hay una biblioteca SocksiPy, que funciona muy bien, pero tiene que ser usada de esta manera:

import socks import socket socket.socket = socks.socksocket import urllib2 socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "xxxx", y) 

Es decir, establece el mismo proxy para TODAS las solicitudes urllib2. ¿Cómo puedo tener diferentes proxies para diferentes abridores?

Probar con pycurl :

 import pycurl c1 = pycurl.Curl() c1.setopt(pycurl.URL, 'http://www.google.com') c1.setopt(pycurl.PROXY, 'localhost') c1.setopt(pycurl.PROXYPORT, 8080) c1.setopt(pycurl.PROXYTYPE, pycurl.PROXYTYPE_SOCKS5) c2 = pycurl.Curl() c2.setopt(pycurl.URL, 'http://www.yahoo.com') c2.setopt(pycurl.PROXY, 'localhost') c2.setopt(pycurl.PROXYPORT, 8081) c2.setopt(pycurl.PROXYTYPE, pycurl.PROXYTYPE_SOCKS5) c1.perform() c2.perform() 

Sí tu puedes. Repito mi respuesta en ¿Cómo puedo usar un proxy SOCKS 4/5 con urllib2? Necesita crear un abridor para cada proxy como lo hace con un proxy http. El código para agregar esta función a SocksiPy está disponible en GitHub https://gist.github.com/869791 y es tan simple como:

 opener = urllib2.build_opener(SocksiPyHandler(socks.PROXY_TYPE_SOCKS4, 'localhost', 9999)) print opener.open('http://www.whatismyip.com/automation/n09230945.asp').read() 

Para obtener más información, he escrito un ejemplo ejecutando varias instancias de Tor para que se comporten como un proxy rotativo: Raspado distribuido con múltiples circuitos de Tor

Solo tiene un zócalo para todos los abridores y la implementación de calcetines está en el nivel de zócalo. Entonces, no puedes.
Te sugiero que utilices la librería pycurl, es mucho más flexible.

== EDIT == (el antiguo ejemplo de Proxy HTTP estaba aquí …)

Mi culpa … urllib2 no tiene soporte incorporado para el proxy SOCKS …

Hay algunos ‘ hacks ‘ que agregan SOCKS a urllib2 (o al objeto socket en general) aquí .
Pero casi no sospecho que esto funcionará con varios proxies como usted lo requiere.

Siempre y cuando no quieras enganchar / subclase urllib2.ProxyHandler sugeriría ir con pycurl.

Es posible que pueda usar lockings de subprocesos si no se hacen demasiadas conexiones a la vez, y necesita acceder desde varios subprocesos:

 import socks import socket import thread lock = thread.allocate_lock() socket.socket = socks.socksocket def GetConn(): lock.acquire() import urllib2 socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "xxxx", y) conn = urllib2.urlopen(ARGUMENTS HERE) lock.release() return conn 

También puede usar algo como esto cada vez que necesite obtener una conexión:

 urllib2 = execfile('urllib2.py') urllib2.socket = dummy_class() # dummy_class needs the socket module's methods 

Obviamente, estas no son soluciones fantásticas, pero de todos modos he puesto 2 ¢ 🙂

Una solución incómoda pero útil para usar un proxy SOCKS es configurar el servidor con el encadenamiento de proxy y luego configurar el HTTP_PROXY proporcionado por privoxy a través de la variable del sistema o de cualquier otra forma.

Puede hacerlo configurando la variable de entorno HTTP_PROXY en el siguiente formato:

usuario: pasa @ proxy: puerto

o si usa bat / cmd, agregue antes de llamar al script:

establece HTTP_PROXY = usuario: pasa @ proxy: puerto

Estoy utilizando dicho archivo cmd para hacer que easy_install funcione bajo proxy.