2009-09-20 25 views
66

apro gli URL con:Proxy con urllib2

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

E quello che voglio fare è collegarsi allo stesso modo con un proxy mi sono da qualche parte che mi dice:

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

ma non ha funzionato neanche.

So che urllib2 ha qualcosa come un gestore proxy, ma non riesco a ricordare quella funzione.

risposta

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

Ciao, @ZelluX, voglio solo l'impostazione dei proxy abilitata su qualche funzione, vuol dire Devo installare e disinstallare l'opener per ogni invocazione della funzione? – satoru

+0

@ Satoru.Logic Forse puoi scrivere un decoratore per semplificare il processo di installazione/disinstallazione? – ZelluX

+2

Sembra che non ci sia il metodo 'uninstall' in 'urllib2', ma possiamo fare impostazioni proxy una tantum; invece di "installare" l'apri, creiamo un oggetto 'request' e usiamo un opener per aprirlo. – satoru

15

È necessario installare un ProxyHandler

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

ottengo file "D:/Desktop/Desktop/mygoogl", linea 64, sito = url.urlopen ('google.com) file "C: \ Python26 \ lib \ urllib2.py ", riga 124, in urlopen return _opener.open (url, data, timeout) AttributeError: l'istanza ProxyHandler non ha attributo 'aperto' –

+0

Ho perso una chiamata a urllib2.build_opener() – dcrosta

6

Per usare i proxy di sistema di default (ad esempio dall'ambiente http_support variabile), i seguenti lavori per la richiesta corrente (senza installarlo in urllib2 a livello globale) :

7

È possibile impostare i proxy utilizzando le variabili di ambiente.

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

urllib2 sarà aggiungere i gestori del proxy automaticamente in questo modo. È necessario impostare separatamente i proxy per protocolli diversi altrimenti non funzioneranno (in termini di non passare attraverso il proxy), vedere di seguito.

Ad esempio:

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

Invece

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

Non dovresti aver usato ad es. os.environ ['http_proxy'] nei tuoi due gruppi di esempi inferiori? –

3

In aggiunta alla risposta accettata: mio scipt mi ​​ha dato un errore

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

soluzione era quella di aggiungere http:// davanti alla stringa del 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

Inoltre impostare il proxy per la sessione di riga di comando Aprire una riga di comando in cui si potrebbe desiderare di eseguire lo script

netsh winhttp set proxy YourProxySERVER:yourProxyPORT 

eseguire lo script in quella terminale.

1

Si possono anche utilizzare le richieste se si desidera accedere a una pagina Web utilizzando i proxy. Codice Python 3:

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

È possibile aggiungere più di un proxy.

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