web-dev-qa-db-fra.com

Utiliser un HTTP PROXY - Python

Je connais bien le fait que je devrais définir la variable d'environnement HTTP_RPOXY sur l'adresse proxy.

Généralement, urllib fonctionne bien, le problème concerne urllib2.

>>> urllib2.urlopen("http://www.google.com").read()

résultats

urllib2.URLError: <urlopen error [Errno 10061] No connection could be made because the target machine actively refused it>

ou

urllib2.URLError: <urlopen error [Errno 11004] getaddrinfo failed>

Informaitons supplémentaires:

urllib.urlopen (....) fonctionne bien! C'est juste urllib2 qui joue des tours ...

J'ai essayé de répondre @Fenikso mais je reçois cette erreur maintenant:

URLError: <urlopen error [Errno 10060] A connection attempt failed because the 
connected party did not properly respond after a period of time, or established
connection failed because connected Host has failed to respond>      

Des idées?

40
RadiantHex

Vous pouvez le faire même sans la variable d’environnement HTTP_PROXY. Essayez cet échantillon:

import urllib2

proxy_support = urllib2.ProxyHandler({"http":"http://61.233.25.166:80"})
opener = urllib2.build_opener(proxy_support)
urllib2.install_opener(opener)

html = urllib2.urlopen("http://www.google.com").read()
print html

Dans votre cas, il semble vraiment que le serveur proxy refuse la connexion.


Quelque chose de plus à essayer:

import urllib2

#proxy = "61.233.25.166:80"
proxy = "YOUR_PROXY_GOES_HERE"

proxies = {"http":"http://%s" % proxy}
url = "http://www.google.com/search?q=test"
headers={'User-agent' : 'Mozilla/5.0'}

proxy_support = urllib2.ProxyHandler(proxies)
opener = urllib2.build_opener(proxy_support, urllib2.HTTPHandler(debuglevel=1))
urllib2.install_opener(opener)

req = urllib2.Request(url, None, headers)
html = urllib2.urlopen(req).read()
print html

Edit 2014: Cela semble être une question/réponse populaire. Cependant, aujourd’hui, j’utiliserais un tiers requests module.

Pour une demande, faites simplement:

import requests

r = requests.get("http://www.google.com", 
                 proxies={"http": "http://61.233.25.166:80"})
print(r.text)

Pour plusieurs requêtes, utilisez l'objet Session afin d'éviter de devoir ajouter le paramètre proxies à toutes vos demandes:

import requests

s = requests.Session()
s.proxies = {"http": "http://61.233.25.166:80"}

r = s.get("http://www.google.com")
print(r.text)
59
Fenikso

Je vous recommande simplement d'utiliser le module de requêtes. 

C'est beaucoup plus facile que les clients http intégrés: http://docs.python-requests.org/en/latest/index.html

Exemple d'utilisation:

r = requests.get('http://www.thepage.com', proxies={"http":"http://myproxy:3129"})
thedata = r.content
14
abeusher

Je voulais juste mentionner que vous devrez peut-être également définir la variable d’environnementhttps_proxyOS au cas où il faudrait accéder à des URL https . .

Mon cas d'utilisation: Win 7, installation de jython-standalone-2.5.3.jar, setuptools via ez_setup.py

6
Andreas Dietrich

Python 3:

import urllib.request

htmlsource = urllib.request.FancyURLopener({"http":"http://127.0.0.1:8080"}).open(url).read().decode("utf-8")
3
user136036

J'ai rencontré cela sur le client Jython.
Le serveur ne parlait que TLS et le client utilisant le contexte ssl javax.net.ssl.SSLContext.getInstance ("SSL") 

Une fois que le client était sur TLS, les choses ont commencé à fonctionner.

0