12 votes

Python : Désactiver http_proxy dans urllib2

J'utilise un proxy défini comme une variable d'environnement (export http_proxy=example.com). Pour un appel utilisant urllib2, j'ai besoin de désactiver temporairement cette variable, c'est-à-dire de désactiver le http_proxy. J'ai essayé plusieurs méthodes suggérées dans la documentation et sur Internet, mais jusqu'à présent je n'ai pas réussi à désactiver le proxy. Jusqu'à présent, j'ai essayé :

# doesn't work
req = urllib2.Request('http://www.google.com')
req.set_proxy(None,None)
urllib2.urlopen(req)

# also doesn't work
urllib.getproxies = lambda x = None: {}

10voto

David Alber Points 6205

La documentation urllib2 suggère ce qui suit devrait fonctionner. Est-ce l'une des approches que vous avez essayées ?

import urllib2

proxy_handler = urllib2.ProxyHandler({})
opener = urllib2.build_opener(proxy_handler)
page = opener.open('http://www.google.com')

6voto

Vyacheslav Shvets Points 1066

Vous pouvez le placer avant le code où vous voulez désactiver les proxies du système.

import urllib2
urllib2.getproxies = lambda: {}

Parfois, c'est mieux que de créer du vide ProxyHandler car il fonctionne pour les bibliothèques externes, même si elles créent des leur propre urllib2 ouvreurs .

Une autre possibilité est de désactiver temporairement le proxy avec contextmanager décorateur, mais je ne peux pas parier qu'il fonctionnera avec des fils multiples :

import selenium
import urllib2
from contextlib import contextmanager

@contextmanager
def no_proxies():
    orig_getproxies = urllib2.getproxies
    urllib2.getproxies = lambda: {}
    yield
    urllib2.getproxies = orig_getproxies

with no_proxies():
    driver = selenium.webdriver.Ie()
    driver.get("http://google.com")

Dans cet exemple, nous empêchons python-selenium pour utiliser le paramètre de proxy du système, ce qui entraîne des erreurs comme celles-ci :

IE et Chrome ne fonctionnent pas avec Selenium2 Python

Impossible d'exécuter IEDriverServer.exe avec le proxy configuré dans l'option internet d'IE

0 votes

urllib2.getproxies = lambda: {} Cela a fonctionné à merveille. Merci !

0 votes

Cela n'a pas fonctionné dans mon cas, et je n'ai pas trop creusé sur ce sujet, j'ai juste monkeypaté le module socks.

0 votes

Downvote pour avoir déclaré que monkey-Parcheando (état global (sic !)) est meilleur que l'API désignée.

3voto

geckon Points 7063

Si vous voulez éviter d'utiliser un proxy pour un ensemble de sites connus, vous pouvez utiliser la fonction no_proxy variable d'environnement comme ceci :

$ export no_proxy="google.com,stackoverflow.com,mysite.org:8080"

(liste de suffixes de noms d'hôtes séparés par des virgules, le port peut également être spécifié)

Cela devrait fonctionner avec les deux urllib y urllib2 .

0voto

erm3nda Points 462

Une autre façon est de monkeypatching la bibliothèque socks comme ceci :

import socks, socket, urllib2
def create_connection(address, timeout=None, source_address=None):
    sock = socks.socksocket()
    sock.connect(address)
    return sock

socks.setdefaultproxy(None, None) # this does ["0.0.0.0"], [0]
socket.socket = socks.socksocket
socket.create_connection = create_connection
print urllib2.urlopen("http://httpbin.org/ip").read()

Donc, il semble que si vous le définissez comme 0.0.0.0 au port 0 du moins, devrait éviter de l'utiliser car le inet_aton() la bibliothèque n'a pas accepté 0.0.0.0 comme IP valide.

Évidemment, je n'ai pas vraiment vérifié pourquoi et quoi... mais, en effet, cela fonctionne. Le moyen le plus simple de vérifier est de définir d'abord un proxy, de récupérer une url avec n'importe quelle bibliothèque et de réessayer sans définir de proxy. Vous serez rattrapé par le dernier proxy configuré :) à moins que vous ne le "désactivez" pour les connexions suivantes.

0voto

Alex Fang Points 39

Vous pouvez désactiver le proxy en installant un emtpy ProxyHandler :

#!/usr/bin/python3
from urllib.request import urlopen, Request, ProxyHandler, build_opener, install_opener, urlretrieve

def unset_http_https_proxy():
    proxy_support = ProxyHandler()
    opener = build_opener(proxy_support)
    install_opener(opener)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X