2010-05-28 12 views
9

Diese Arbeit fein:Python urllib2> HTTP Proxy> HTTPS-Anfrage

import urllib2 

opener = urllib2.build_opener(
       urllib2.HTTPHandler(), 
       urllib2.HTTPSHandler(), 
       urllib2.ProxyHandler({'http': 'http://user:[email protected]:3128'})) 
urllib2.install_opener(opener) 
print urllib2.urlopen('http://www.google.com').read() 

Aber wenn http Änderung https:

... 
print urllib2.urlopen('https://www.google.com').read() 

Es gibt Fehler:

Traceback (most recent call last): 
    File "D:\Temp\6\tmp.py", line 13, in <module> 
    print urllib2.urlopen('https://www.google.com').read() 
    File "C:\Python26\lib\urllib2.py", line 124, in urlopen 
    return _opener.open(url, data, timeout) 
    File "C:\Python26\lib\urllib2.py", line 389, in open 
    response = self._open(req, data) 
    File "C:\Python26\lib\urllib2.py", line 407, in _open 
    '_open', req) 
    File "C:\Python26\lib\urllib2.py", line 367, in _call_chain 
    result = func(*args) 
    File "C:\Python26\lib\urllib2.py", line 1154, in https_open 
    return self.do_open(httplib.HTTPSConnection, req) 
    File "C:\Python26\lib\urllib2.py", line 1121, in do_open 
    raise URLError(err) 
URLError: <urlopen error [Errno 10060] 

Warum und wie löst man dieses Problem?

+3

wenn Sie dies lesen: Bitte markieren Sie die richtige Antwort als richtig. Dies soll sicherstellen, dass niemand seine Zeit verschwendet, um eine bereits beantwortete Frage zu beantworten. Es ist auch eine nette Art, sich bei der Person zu bedanken, die eine Lösung für Ihr Problem gefunden hat. – Sheena

Antwort

1

In Windows ist errno 10060 ein Winsock-Fehler, was bedeutet, dass die Verbindung abgelaufen ist. Können Sie https://www.google.com von demselben Computer mit einem Webbrowser erreichen, dessen Proxy auf http://user:[email protected]:3128 gesetzt ist? Sind Sie sicher, dass Ihr Proxy-Server sowohl HTTPS als auch HTTP am selben Port verarbeiten kann?

16

Ändern Sie diese Zeile:

urllib2.ProxyHandler({'http': 'http://user:[email protected]:3128'})) 

dazu:

urllib2.ProxyHandler({'https': 'http://user:[email protected]:3128'})) 

Es funktioniert gut für mich.

+0

Ja, das ist die richtige Lösung – fijiaaron

+0

urllib2.ProxyHandler ({'https': 'https: // user: pass @ proxy: 3128 '})) Ändern Sie das zweite http zu https, wenn Sie http und einen http-Proxy in Ihrem urllib2 verwenden möchten – k9b

1

Die documentation für urllib2 sagt der folgende:

Hinweis: Derzeit urllib2 nicht Abrufen von https Standorten über einen Proxy-Unterstützung nicht. Dies kann jedoch durch Erweitern von urllib2 als , gezeigt in this recipe, ermöglicht werden.

Ich muss zugeben, oben Rezept funktionierte nicht sofort für Jython 2.5.3, aber ich versuche immer noch.

UPDATE: Ich bewarb mich this patch zu Jython 2.5.3, und es für mich gearbeitet. Ich kann jetzt HTTPS-Ressourcen über einen Proxy-Server abrufen.

UPDATE2: Hier ist der Code HTTPS-Ressourcen mit der Standardauthentifizierung über HTTP Proxy abfragen (NICHT VERGESSEN PATCH zuerst zu installieren (siehe vorherige Update)):

from suds.client import Client 
from suds.transport.https import HttpAuthenticated 

credentials = dict(username='...', password='...', proxy={'https': 'host:port', 'http': 'host:port'}) 
t = HttpAuthenticated(**credentials) 
url = 'https://example.com/service?wsdl' 
client = Client(url, transport=t) 
print client.service.getFoo()