Skip to main content
 首页 » 编程设计

python之在 Python 中使用 Mechanize 打开 SSL URL

2025年05月04日14xiaohuochai

如何使用 mechanize 在 Python 中打开 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 下运行相同的代码时,我没有收到此错误...

据推测,这可能不是 mechanize 的直接问题,而是 urllib2 和底层 SSL C 库的问题。谷歌搜索显示很少点击。有解决方法吗?

编辑:我找到了这个 old bug report ,使用建议的解决方法(基本上 Python 正在尝试将 SSLv23 用于仅 SSLv3 的站点),但该代码反而会导致错误 httplib.BadStatusLine: ''

请您参考如下方法:

这个问题可能是因为 SSLv2 在 Web 服务器上被禁用,但 Python 2.x 默认尝试与 PROTOCOL_SSLv23 建立连接。这发生在 https://github.com/python/cpython/blob/master/Lib/ssl.py#L867

您可以通过覆盖 ssl_version 关键字参数来猴子修补 ssl 模块中的 ssl.wrap_socket(),而不是复制和编辑 Python 库模块。以下代码可以按原样使用。在发出任何请求之前将其放在程序的开头。

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)