Estoy usando urllib.urlopen con algunos servidores proxy http y, a veces (probablemente cuando requieren autorización), aparece el siguiente mensaje impreso en la consola:

Enter username for Private Proxy Access (country) at xxx.xxx.xxx.xxx:xxxx

¿Cómo puedo plantear una excepción por tal cosa?

Aquí está el ejemplo:

from urllib import urlopen

p = '64.79.209.238:36867'
print urlopen('http://google.com', proxies={'http': 'http://'+p})

En caso de que el proxy mencionado muera demasiado pronto, aquí hay algunos reemplazos 64.79.197.36:43444, 64.79.209.203:34968, 64.79.197.36:43444, 209.59.207.197:3438

1
Fluffy 16 nov. 2009 a las 13:39

3 respuestas

La mejor respuesta

Necesita sobrescribir el método FancyURLopener.prompt_user_passwd:

class AuthorizationRequired(Exception):

    pass


class MyURLOpener(urllib.FancyURLopener):

    def prompt_user_passwd(self, host, realm):
        raise AuthorizationRequired()


opener = MyURLOpener(proxies={'http': 'http://'+p})
fp = opener.open(url)
2
Denis Otkidach 16 nov. 2009 a las 15:47

Adapte un poco el código de Denis a esto:

import urllib
urllib.FancyURLopener.prompt_user_passwd = lambda *a, **k: (None, None)

Deshabilitará la solicitud de contraseña por completo

1
sebulba 25 abr. 2012 a las 07:33

urllib.urlencode no nunca imprime ese mensaje. Ese método nunca llega a la red en primer lugar. Tu problema está en otro lado.

Supongo que estás ejecutando algún otro demonio en segundo plano que imprime el mensaje.

Proporcione el código y el mensaje reproducibles exactos. Ejemplo de proxy que dispara el mensaje también sería bueno.

1
nosklo 16 nov. 2009 a las 10:45