Domanda

Qual è il modo migliore per specificare un proxy con nome utente e password per una connessione http in Python?

È stato utile?

Soluzione

Usa questo:

import requests

proxies = {"http":"http://username:password@proxy_ip:proxy_port"}

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

print(r.content)

Penso che sia molto più semplice che usare urllib.Non capisco perché la gente ami usarlo urllib tanto.

Altri suggerimenti

Questo funziona per me:

import urllib2

proxy = urllib2.ProxyHandler({'http': 'http://
username:password@proxyurl: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()

Impostazione di una variabile di ambiente denominata http_proxy come questo: http://nomeutente:password@url_proxy:porta

Il modo migliore per passare attraverso un proxy che richiede l'autenticazione è utilizzare urllib2 per creare un apri URL personalizzato, quindi utilizzarlo per effettuare tutte le richieste che desideri passare attraverso il proxy.Nota in particolare, probabilmente non vorrai incorporare la password del proxy nell'URL o nel codice sorgente Python (a meno che non si tratti solo di un trucco veloce).

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

In un programma più complesso, puoi separare questi componenti in modo appropriato (ad esempio, utilizzando un solo gestore di password per tutta la durata dell'applicazione).La documentazione di Python ha altri esempi su come fare cose complesse con urllib2 che potresti trovare utile anche tu.

Oppure se vuoi installarlo, in modo che venga sempre utilizzato con urllib2.urlopen (quindi non è necessario tenere in giro un riferimento all'opener):

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()

Ecco il metodo per utilizzare 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/')
"""
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top