it-swarm.com.de

Verwendung eines HTTP PROXY - Python

Ich bin mit der Tatsache vertraut, dass ich die Umgebungsvariable HTTP_RPOXY auf die Proxy-Adresse setzen sollte.

Im Allgemeinen funktioniert urllib gut, das Problem ist der Umgang mit urllib2.

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

kehrt zurück

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

oder

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

Zusatzinformation:

urllib.urlopen (....) funktioniert gut! Es ist nur urllib2, das Tricks spielt ...

Ich habe versucht, @Fenikso zu beantworten, bekomme aber jetzt diese Fehlermeldung:

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>      

Irgendwelche Ideen?

40
RadiantHex

Sie können dies auch ohne die Umgebungsvariable HTTP_PROXY tun. Probieren Sie dieses Beispiel aus:

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

In Ihrem Fall scheint es wirklich so zu sein, dass der Proxy-Server die Verbindung ablehnt.


Noch etwas zu versuchen:

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: Dies scheint eine beliebte Frage/Antwort zu sein. Heute würde ich jedoch stattdessen das Modul requests des Drittanbieters verwenden.

Für eine Anfrage machen Sie einfach:

import requests

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

Verwenden Sie für mehrere Anforderungen das Objekt Session, damit Sie nicht in allen Ihren Anforderungen den Parameter proxies hinzufügen müssen:

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

Ich empfehle, dass Sie einfach das Anforderungsmodul verwenden. 

Es ist viel einfacher als die in http eingebauten Clients: http://docs.python-requests.org/de/latest/index.html

Verwendungsbeispiel:

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

Ich wollte nur erwähnen, dass Sie möglicherweise auch die Umgebungsvariablehttps_proxyOS festlegen müssen, falls auf https-URLs zugegriffen werden muss .. In meinem Fall war es für mich nicht offensichtlich und ich habe stundenlang versucht, dies herauszufinden .

Mein Anwendungsfall: Win 7, jython-standalone-2.5.3.jar, Installation von setuptools über ez_setup.py

6

Python 3:

import urllib.request

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

Ich bin auf Jython-Client gestoßen.
Der Server sprach nur über TLS und der Client benutzte den SSL-Kontext javax.net.ssl.SSLContext.getInstance ("SSL"). 

Sobald der Client zu TLS kam, funktionierten die Dinge.

0