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