2014-09-04 133 views
5

我管理了很多HTTPS代理(這些代理具有自己的SSL連接)。我在python中構建了一個診斷工具,它嘗試通過每個代理連接到一個頁面,如果它無法通過其中一個連接,就會通過電子郵件發送給我。測試python中的HTTPS代理

我開始討論的方式是使用urllib通過每個代理進行連接,並返回一個應該用下面的代碼說「成功」的頁面。

def fetch(url): 
    connection = urllib.urlopen(
    url, 
    proxies={'http':"https://"+server+':443'} 
    ) 
    return connection.read() 


print fetch(testURL) 

此獲取我想要的頁面完美的問題是,它仍然會取我想即使代理服務器信息不正確或代理服務器是不活動的頁面。因此,它不會使用代理服務器,或者它嘗試它並在失敗時連接沒有它。

我該如何解決這個問題?

編輯:沒有人似乎知道如何做到這一點。我將開始閱讀其他語言庫,以查看它們是否可以更好地處理它。有誰知道在Go等其他語言中它更容易嗎?

編輯:我只是在下面的評論中寫了這個,但我認爲這可能是一個誤解。 「代理有它自己的SSL連接,所以如果我去google.com,我首先與foo.com進行密鑰交換,然後再與目標地址bar.com或目的地址baz.com進行密鑰交換。目的地不會'不得不是https,代理是https「

回答

1

我認爲它不適用於https請求。它是否正確?如果是,那麼上面的代碼只爲http定義一個代理。試着增加它的https:

proxies={'https':"https://"+server+':443'}

另一種選擇是使用requests Python模塊,而不是urllib。看看http://docs.python-requests.org/en/latest/user/advanced/#proxies

+0

我試過了。它沒有幫助。在這種情況下請求的好處是什麼? – 2014-09-12 23:45:41

+0

好了,所以我使用數據包捕獲在我的環境中運行了它,它顯示urllib沒有向代理髮送CONNECT請求,這是不正確的。然後我閱讀https://docs.python.org/2/howto/urllib2.html,其中規定「目前urllib2不支持通過代理獲取https位置。但是,可以通過擴展urllib2來啓用它,如食譜http://code.activestate.com/recipes/456195。我建議請求Python模塊,因爲它似乎更簡單,更容易使用,嘗試使用urllib實現這一點 – Yuvika 2014-09-13 12:26:39

0

如何使用超時?如果代理在30秒內連接失敗,則應該將其標記爲未連接。

def fetch(url, server): 
proxy_handler = urllib2.ProxyHandler({'http':'https://'+server+':443'}) 
opener = urllib2.build_opener(proxy_handler, urllib2.HTTPHandler(debuglevel=0)) 
urllib2.install_opener(opener) 

try: 
    response = opener.open(url, timeout = 30) 
    return response.read() 
except: 
    print "Can't connect with proxy %s" % (server) 

print fetch(url,serverIp) 

你可以改變debuglevel = 1看到連接的詳細信息

我用這個全球代理,並與我的互聯網連接30秒爲最大超時知道我是否連接與否。在我的測試中,如果連接時間超過30秒,這總是失敗。

2

大多數人都明白HTTPS代理作爲代理,理解CONNECT請求。我的例子創建了直接的ssl連接。

try: 
    import http.client as httplib # for python 3.2+ 
except ImportError: 
    import httplib # for python 2.7 


con = httplib.HTTPSConnection('proxy', 443) # create proxy connection 
# download http://example.com/ through proxy 
con.putrequest('GET', 'http://example.com/', skip_host=True) 
con.putheader('Host', 'example.com') 
con.endheaders() 
res = con.getresponse() 
print(res.read()) 

如果您的代理是那麼反向代理更改

con.putrequest('GET', 'http://example.com/', skip_host=True) 

con.putrequest('GET', '/', skip_host=True)`