Skip to main content
 首页 » 编程设计

用于获取受 DES/kerberos 保护的 URL 的 Python 脚本

2025年05月04日8tintown

我有一个 Python 脚本,它每天从 URL 自动下载一次。

最近更改了保护 URL 的身份验证。为了让它与 Internet Explorer 一起工作,我必须通过在某处的注册表项中添加 SupportedEncryptionTypes“0x7FFFFFFF”来为 Kerberos 启用 DES。然后,当我浏览该站点时,它会提示我在 IE 中输入我的域/用户/密码。

我之前运行的 python 代码是:

  def __build_ntlm_opener(self): 
    passman = HTTPPasswordMgrWithDefaultRealm() 
    passman.add_password(None, self.answers_url, self.ntlm_username, self.ntlm_password) 
 
    ntlm_handler = HTTPNtlmAuthHandler(passman) 
 
    opener = urllib.request.build_opener(ntlm_handler) 
    opener.addheaders= [ 
        #('User-agent', 'Mozilla/5.0 (Windows NT 6.0; rv:5.0) Gecko/20100101 Firefox/5.0') 
        ('User-agent', 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)') 
    ] 
 
    return opener 

现在代码在使用开启器时失败并显示简单的 401:

urllib.error.HTTPError: HTTP Error 401: Unauthorized 

我对 Kerberos 或 DES 知之甚少,但据我目前所见,我无法确定 urllib 是否支持使用这些。

是否有任何第 3 方库或技巧可以让我再次使用它?

请您参考如下方法:

您可以尝试使用 selenium 的 webdriver 直接驱动浏览器。当我想抓取动态生成的网站时,我有时会这样做。这是打开页面并输入密码的代码示例

from selenium import webdriver 
 
b = webdriver.Chrome() 
b.get('http://www.example.com') 
username_field = b.find_element_by_id('username') 
username_field.send_keys('my_username') 
password_field = b.find_element_by_id('password') 
password_field.send_keys('secret') 
login_button = b.find_element_by_link_text('login').click() 

这会让您通过网站的典型登录屏幕。然后

b.page_source 

将为您提供该页面的源代码。即使它主要是用 Javascript 生成的。

源代码解析起来非常简单:http://code.google.com/p/selenium/source/browse/trunk/py/selenium/webdriver/remote/webelement.py