2

我有一个 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 方库或技巧可以让我再次使用它?

4

1 回答 1

1

您可以尝试使用 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

于 2012-04-30T21:07:29.830 回答