2009-09-20 7 views
66

I ouvrir urls avec:Proxy avec urllib2

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

Et ce que je veux faire est de connecter la même manière avec un proxy je me suis dit quelque part:

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

mais cela n'a pas fonctionné non plus.

Je sais que urllib2 a quelque chose comme un gestionnaire de proxy, mais je ne me souviens pas de cette fonction.

Répondre

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

Bonjour, @ZelluX, je veux seulement que le paramètre proxies soit activé sur certaines fonctions, cela veut-il dire Je dois installer et désinstaller l'ouvreur pour chaque invocation de la fonction? – satoru

+0

@ Satoru.Logic Peut-être que vous pouvez écrire un décorateur pour simplifier le processus d'installation/désinstallation? – ZelluX

+2

Il semble qu'il n'y ait pas de méthode 'uninstall' dans' urllib2', mais nous pouvons faire des réglages de proxy à usage unique; au lieu de 'installer 'l'ouvreur, nous créons un objet' request', et utilisons un opener pour l'ouvrir. – satoru

15

Vous devez installer un ProxyHandler

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

Je reçois Fichier "D:/Desktop/Desktop/mygoogl", ligne 64, le site = url.urlopen ('google.com) fichier « C: \ Python26 \ lib \ urllib2.py ", ligne 124, dans urlopen return _opener.open (url, data, timeout) AttributeError: l'instance de ProxyHandler n'a pas d'attribut 'open' –

+0

J'ai manqué un appel à urllib2.build_opener() – dcrosta

6

Pour utiliser les procurations par défaut du système (par exemple à partir de la variable d'environnement http_support), les travaux suivants pour la demande actuelle (sans l'installer dans urllib2 globalement) :

url = 'http://www.example.com/' 
proxy = urllib2.ProxyHandler() 
opener = urllib2.build_opener(proxy) 
in_ = opener.open(url) 
in_.read() 
7

Vous pouvez définir des proxies à l'aide de variables d'environnement.

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

urllib2 ajoutera les gestionnaires de proxy automatiquement cette façon. Vous devez définir des proxys pour différents protocoles séparément, sinon ils échoueront (en termes de ne pas passer par proxy), voir ci-dessous.

Par exemple:

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

lieu

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

N'auriez-vous pas dû utiliser par exemple os.environ ['http_proxy'] dans vos deux ensembles d'exemples inférieurs? –

3

En plus de la réponse acceptée: Mon scipt m'a donné une erreur a été d'ajouter

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

Solution http:// devant la chaîne de 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

En outre définir le proxy pour la ligne de commande la session Ouvrez une ligne de commande où vous pouvez lancer votre script

netsh winhttp set proxy YourProxySERVER:yourProxyPORT 

exécuter votre script dans ce terminal.

1

On peut également utiliser des requêtes si l'on souhaite accéder à une page web en utilisant des proxies. Code Python 3:

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

Plus d'un proxy peut également être ajouté.

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