2008-08-29 19 views

Respuesta

56

Esto funciona para mí:

import urllib2 

proxy = urllib2.ProxyHandler({'http': 'http:// 
username:[email protected]:proxyport'}) 
auth = urllib2.HTTPBasicAuthHandler() 
opener = urllib2.build_opener(proxy, auth, urllib2.HTTPHandler) 
urllib2.install_opener(opener) 

conn = urllib2.urlopen('http://python.org') 
return_str = conn.read() 
+0

urllib2.HTTPHandler se agrega de forma predeterminada (ver urllib2 doc). Parece que es redundante agregarlo al abrir el abridor. – HongboZhu

+0

¿Y por qué usas urllib2.HTTPBasicAuthHandler() si no hay autenticación involucrada? – HongboZhu

+0

Normalmente, los proxies están en formato IP. Eso es lo mismo que proxyurl, ¿verdad? – User

9

La mejor manera de ir a través de un proxy que requiere autenticación está usando urllib2 para construir un abridor de URL personalizada, a continuación, utilizarlo para hacer todas las solicitudes que desea ir a través el proxy. Tenga en cuenta, en particular, que probablemente no desee insertar la contraseña del proxy en la url o en el código fuente de Python (a menos que sea un truco rápido).

import urllib2 

def get_proxy_opener(proxyurl, proxyuser, proxypass, proxyscheme="http"): 
    password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm() 
    password_mgr.add_password(None, proxyurl, proxyuser, proxypass) 

    proxy_handler = urllib2.ProxyHandler({proxyscheme: proxyurl}) 
    proxy_auth_handler = urllib2.ProxyBasicAuthHandler(password_mgr) 

    return urllib2.build_opener(proxy_handler, proxy_auth_handler) 

if __name__ == "__main__": 
    import sys 
    if len(sys.argv) > 4: 
     url_opener = get_proxy_opener(*sys.argv[1:4]) 
     for url in sys.argv[4:]: 
      print url_opener.open(url).headers 
    else: 
     print "Usage:", sys.argv[0], "proxy user pass fetchurls..." 

En un programa más complejo, se puede separar estos componentes en los casos adecuados (por ejemplo, usando un único gestor de contraseñas para el tiempo de vida de la aplicación). La documentación de Python tiene more examples on how to do complex things with urllib2 que también podría serle útil.

3

O si lo desea instalarlo, por lo que siempre se utiliza con urllib2.urlopen (lo que no es necesario tener una referencia a la apertura de alrededor):

import urllib2 
url = 'www.proxyurl.com' 
username = 'user' 
password = 'pass' 
password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm() 
# None, with the "WithDefaultRealm" password manager means 
# that the user/pass will be used for any realm (where 
# there isn't a more specific match). 
password_mgr.add_password(None, url, username, password) 
auth_handler = urllib2.HTTPBasicAuthHandler(password_mgr) 
opener = urllib2.build_opener(auth_handler) 
urllib2.install_opener(opener) 
print urllib2.urlopen("http://www.example.com/folder/page.html").read() 
13

Configuración de un entorno var llamado http_proxy así: http: // usuario: contraseña @ proxy_url: puerto

+0

Ahora, esa es una respuesta limpia. –

+4

Pero realmente no responde la respuesta. – Bouncner

+0

@Bouncner Respondiendo a la pregunta, no a la respuesta. Y tampoco está respondiendo. –

1

Aquí está el uso del método urllib

import urllib.request 

# set up authentication info 
authinfo = urllib.request.HTTPBasicAuthHandler() 
proxy_support = urllib.request.ProxyHandler({"http" : "http://ahad-haam:3128"}) 

# build a new opener that adds authentication and caching FTP handlers 
opener = urllib.request.build_opener(proxy_support, authinfo, 
            urllib.request.CacheFTPHandler) 

# install it 
urllib.request.install_opener(opener) 

f = urllib.request.urlopen('http://www.python.org/') 
""" 
0

Utilice esta:

import requests 

proxies = {"http":"http://username:[email protected]_ip:proxy_port"} 

r = requests.get("http://www.example.com/", proxies=proxies) 

print r.content 

creo que es mucho más simple que el uso de urllib. No entiendo por qué a la gente le encanta usar urllib tanto.

Cuestiones relacionadas