2008-08-29 13 views

Répondre

56

Cela fonctionne pour moi:

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 est ajouté par défaut (voir doc urllib2). Il semble qu'il soit redondant de l'ajouter lors de l'ouverture du bâtiment. – HongboZhu

+0

Et pourquoi utilisez-vous urllib2.HTTPBasicAuthHandler() si aucune authentification n'est en cause? – HongboZhu

+0

Normalement les proxies sont dans un format IP. C'est la même chose que proxyurl, non? – User

9

La meilleure façon de passer par un proxy qui requiert une authentification utilise urllib2 pour construire un ouvre-url personnalisé, puis en utilisant que pour faire toutes les demandes que vous souhaitez passer par le proxy. Notez en particulier, que vous ne voulez probablement pas intégrer le mot de passe du proxy dans le code source url ou python (à moins que ce soit juste un hack rapide).

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..." 

Dans un programme plus complexe, vous pouvez séparer ces composants comme approprié (par exemple, en utilisant un seul gestionnaire de mot de passe pour la durée de vie de l'application). La documentation python a more examples on how to do complex things with urllib2 que vous pourriez également trouver utile.

3

Ou si vous voulez l'installer, de sorte qu'il est toujours utilisé avec urllib2.urlopen (vous n'êtes pas obligé de conserver une référence à l'ouvreur autour):

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

Définition d'un environnement var nommé http_proxy comme ceci: http: // nom d'utilisateur: mot de passe @ proxy_url: port

+0

Maintenant, c'est une réponse propre. –

+4

Mais pas vraiment répondre à la réponse. – Bouncner

+0

@Bouncner Répondre à la question, pas la réponse. Et ça ne répond pas non plus. –

1

est ici l'utilisation de la méthode 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

Utilisez ceci:

import requests 

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

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

print r.content 

Je pense qu'il est beaucoup plus simple que d'utiliser urllib. Je ne comprends pas pourquoi les gens aiment tellement utiliser urllib.

Questions connexes