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

标签 python authentication python-3.x kerberos urllib

我有一个 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

关于用于获取受 DES/kerberos 保护的 URL 的 Python 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10389240/

相关文章:

javascript - 使用 ajax 的 javascript 应用程序的身份验证模型

linux - 操作系统中 Admin-Guest 登录部分的编码

swift - 等效的 Swift NSURLSession 或 Alamofire Curl 帖子

python - 附加到上一行

python - 在 Python 中使用 Libtorrent 下载多个 torrent 文件

c++ - C++/Qt 应用程序中的 PySide DLL 加载冲突

python - 使用selenium和python通过CssSelector的 "begins with"方法定位元素

Python:循环不等待用户的输入

python - Plotly 中的条件格式

python - 使用属性从 H5 文件中过滤 HDF 数据集