2012-06-25 38 views
2

如何使用mechanize在Python中打開SSL URL?在Python中使用Mechanize打開SSL URL

我在Ubuntu試圖與Python 2.7.3一個簡單的頁面檢索,如:

import mechanize 
browser = mechanize.Browser() 
resp = browser.open('https://mydomain.com') 

,但它引發錯誤:

urllib2.URLError: <urlopen error [Errno 1] _ssl.c:504: error:140773E8:SSL routines:SSL23_GET_SERVER_HELLO:reason(1000)> 

奇怪的是,我沒有得到這個錯誤當我在Fedora上的Python 2.6.4下運行相同的代碼時...

大概,這可能不是機械化的直接問題,而是urllib2和底層的SSL C庫。谷歌搜索顯示幾個點擊。有沒有解決方法?

編輯:我發現這個old bug report,有建議的解決方法(基本上Python是試圖用SSLv23的SSLv3的專用網站),但代碼,而不是導致錯誤httplib.BadStatusLine: ''

+0

你有什麼機會在窗戶上? –

+0

@ samy.vilar,不,我相應地更新了我的問題。 – Cerin

+0

我認爲它的錯誤https://bugs.launchpad.net/ubuntu/+source/openssl/+bug/966058雖然不確定,但您可以查看http://code.google.com/p/selenium/? redir = 1它非常酷。 –

回答

-1

這個問題可能是由於在Web服務器上禁用SSLv2,但默認情況下,Python 2.x會嘗試與PROTOCOL_SSLv23建立連接。這發生在https://github.com/python/cpython/blob/master/Lib/ssl.py#L867

而不是複製和編輯Python庫模塊,您可以通過覆蓋ssl_version關鍵字參數在ssl模塊中對ssl.wrap_socket()進行monkey-patch。以下代碼可以按原樣使用。在提出任何請求之前,請在程序開始時進行此操作。

import ssl 
from functools import wraps 
def sslwrap(func): 
    @wraps(func) 
    def bar(*args, **kw): 
     kw['ssl_version'] = ssl.PROTOCOL_TLSv1 
     return func(*args, **kw) 
    return bar 

ssl.wrap_socket = sslwrap(ssl.wrap_socket)