2010-05-28 15 views
9

Ta praca dobrze:Python urllib2> HTTP Proxy> HTTPS żądanie

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() 

Ale jeśli http zmiana https:

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

są błędy:

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] 

Dlaczego i jak rozwiązać ten problem?

+3

jeśli czytasz to: proszę zaznaczyć poprawną odpowiedź jako poprawną. Ma to na celu zagwarantowanie, że nikt nie marnuje czasu, próbując odpowiedzieć na już udzielone pytanie. Jest to również dobry sposób na powiedzenie dzięku osobie, która zaproponowała rozwiązanie twojego problemu. – Sheena

Odpowiedz

1

W systemie Windows errno 10060 jest błędem w usłudze winsock, oznaczającym przekroczenie limitu czasu połączenia. Czy jesteś w stanie dotrzeć do https://www.google.com z tego samego komputera za pomocą przeglądarki internetowej z ustawieniem proxy na http://user:[email protected]:3128? Czy na pewno Twój serwer proxy obsługuje zarówno protokół HTTPS, jak i http na tym samym porcie?

16

Zmiana ta linia:

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

do tego:

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

To działa dobrze dla mnie.

+0

Tak, to jest poprawne rozwiązanie – fijiaaron

+0

urllib2.ProxyHandler ({'https': 'https: // user: pass @ proxy: 3128 '})) Zmień drugi adres http na https, jeśli chcesz używać zarówno adresu http, jak i serwera proxy http w urllib2 – k9b

1

documentation dla urllib2 mówi następujące:

Uwaga: Obecnie urllib2 nie obsługuje sprowadzanie https lokalizacjach przez pełnomocnika. Można to jednak włączyć przez rozszerzenie nazwy urllib2 jako wyświetlanej w this recipe.

Muszę przyznać, że powyższy przepis nie zadziałał od razu dla Jythona 2.5.3, ale wciąż próbuję.

AKTUALIZACJA: Zastosowałem this patch do Jython 2.5.3 i działało dla mnie. Mogę teraz pobierać zasoby HTTPS przez serwer proxy.

Update2: Oto kod do kwerendy HTTPS zasoby z podstawowego uwierzytelniania HTTP proxy (ponad NIE ZAPOMNIJ INSTALL PATCH pierwszy (patrz poprzedni aktualizacji)):

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()