web-dev-qa-db-fra.com

Proxy avec urllib2

J'ouvre les urls avec:

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

Et ce que je veux faire, c'est me connecter de la même manière avec un proxy que je suis quelque part en train de me dire:

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.

71
Chris Stryker
proxy = urllib2.ProxyHandler({'http': '127.0.0.1'})
opener = urllib2.build_opener(proxy)
urllib2.install_opener(opener)
urllib2.urlopen('http://www.google.com')
140
ZelluX

Vous devez installer un ProxyHandler

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

Vous pouvez définir des mandataires à 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 automatiquement les gestionnaires de proxy de cette façon. Vous devez définir des proxys pour différents protocoles séparément, sinon ils échoueront (en termes de non 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')

Au 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')
12
cashmere

Pour utiliser les mandataires système par défaut (à partir de la variable d’environnement http_support, par exemple), la procédure suivante fonctionne pour la requête en cours (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()
6
blueyed

En plus de la réponse acceptée: mon scipt m'a donné une erreur

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

La solution consistait à ajouter 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')
3
HCC

On peut également utiliser des requêtes si on souhaite accéder à une page Web en utilisant des procurations. Python 3 code:

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

Plusieurs procurations peuvent également être ajoutées.

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

En outre, définissez le proxy pour la session en ligne de commande. Ouvrez une ligne de commande sur laquelle vous souhaiterez peut-être exécuter votre script.

netsh winhttp set proxy YourProxySERVER:yourProxyPORT

lancez votre script dans ce terminal.

0
Emma