2009-09-20 12 views
66

que abrir direcciones URL con:Proxy con urllib2

site = urllib2.urlopen('http://google.com')

Y lo que yo quiero hacer es conectar la misma manera con un proxy que en algún lugar me hizo decir:

site = urllib2.urlopen('http://google.com', proxies={'http':'127.0.0.1'})

pero eso tampoco funcionó.

Sé que urllib2 tiene algo así como un controlador de proxy, pero no recuerdo esa función.

Respuesta

130
proxy = urllib2.ProxyHandler({'http': '127.0.0.1'}) 
opener = urllib2.build_opener(proxy) 
urllib2.install_opener(opener) 
urllib2.urlopen('http://www.google.com') 
+1

Hola, @ZelluX, solo quiero que la configuración de proxies esté habilitada en alguna función, ¿eso significa? Tengo que instalar y desinstalar el abridor para cada invocación de la función? – satoru

+0

@ Satoru.Logic ¿Quizás pueda escribir un decorador para simplificar el proceso de instalación/desinstalación? – ZelluX

+2

Parece que no hay un método 'uninstall' en' urllib2', pero podemos hacer ajustes de proxy de una sola vez; en lugar de 'instalar' el abridor, creamos un objeto' request', y usamos un abridor para 'abrir'. – satoru

15

Usted tiene que instalar un ProxyHandler

urllib2.install_opener(
    urllib2.build_opener(
     urllib2.ProxyHandler({'http': '127.0.0.1'}) 
    ) 
) 
urllib2.urlopen('http://www.google.com') 
+0

me sale archivo "D:/Escritorio/Escritorio/mygoogl", línea 64, sitio url.urlopen = ('google.com) archivo "C: \ Python26 \ lib \ urllib2.py ", línea 124, en urlopen return _opener.open (url, data, timeout) AttributeError: la instancia de ProxyHandler no tiene el atributo 'abierto' –

+0

Me perdí una llamada a urllib2.build_opener() – dcrosta

6

Para utilizar los servidores proxy por defecto del sistema (por ejemplo, desde el entorno http_support variable), las siguientes obras para la petición actual (sin instalarlo en urllib2 a nivel mundial) :

url = 'http://www.example.com/' 
proxy = urllib2.ProxyHandler() 
opener = urllib2.build_opener(proxy) 
in_ = opener.open(url) 
in_.read() 
7

Puede establecer proxies utilizando variables de entorno.

import os 
os.environ['http_proxy'] = '127.0.0.1' 
os.environ['https_proxy'] = '127.0.0.1' 

urllib2 añadirá automáticamente los controladores de proxy de esta manera. Es necesario establecer proxies para diferentes protocolos por separado, de lo contrario, fallarán (en términos de no pasar por el proxy), ver a continuación.

Por ejemplo:

proxy = urllib2.ProxyHandler({'http': '127.0.0.1'}) 
opener = urllib2.build_opener(proxy) 
urllib2.install_opener(opener) 
urllib2.urlopen('http://www.google.com') 
# next line will fail (will not go through the proxy) (https) 
urllib2.urlopen('https://www.google.com') 

lugar

proxy = urllib2.ProxyHandler({ 
    'http': '127.0.0.1', 
    'https': '127.0.0.1' 
}) 
opener = urllib2.build_opener(proxy) 
urllib2.install_opener(opener) 
# this way both http and https requests go through the proxy 
urllib2.urlopen('http://www.google.com') 
urllib2.urlopen('https://www.google.com') 
+0

¿No debería haber usado, por ejemplo? os.environ ['http_proxy'] en los dos conjuntos inferiores de ejemplos? –

3

además de la respuesta aceptada: Mi scipt me dio un error

File "c:\Python23\lib\urllib2.py", line 580, in proxy_open 
    if '@' in host: 
TypeError: iterable argument required 

solución fue añadir http:// en frente de la cadena proxy:

proxy = urllib2.ProxyHandler({'http': 'http://proxy.xy.z:8080'}) 
opener = urllib2.build_opener(proxy) 
urllib2.install_opener(opener) 
urllib2.urlopen('http://www.google.com') 
0

Además establecer el proxy para la sesión de línea de comandos Abrir una línea de comandos, donde es posible que desee ejecutar la secuencia de comandos

netsh winhttp set proxy YourProxySERVER:yourProxyPORT 

ejecutar la secuencia de comandos en ese terminal.

1

También se pueden usar solicitudes si queremos acceder a una página web utilizando proxies. Código de Python 3:

>>> import requests 
>>> url = 'http://www.google.com' 
>>> proxy = '169.50.87.252:80' 
>>> requests.get(url, proxies={"http":proxy}) 
<Response [200]> 

También se pueden agregar más de un proxies.

>>> proxy1 = '169.50.87.252:80' 
>>> proxy2 = '89.34.97.132:8080' 
>>> requests.get(url, proxies={"http":proxy1,"http":proxy2}) 
<Response [200]>