4

mechanize.Browser() でpython-ntlmを使用したいurllib2 と mechanize.urlopen() で動作する HTTPNtlmAuthHandler を取得し、Browser() で使用しようとしましたが、動作しません

これがurlopenに使用しているコードです

passman = mechanize.HTTPPasswordMgrWithDefaultRealm()
passman.add_password(None, url, user, password)
auth_NTLM = HTTPNtlmAuthHandler.HTTPNtlmAuthHandler(passman)

opener = mechanize.build_opener(auth_NTLM)
mechanize.install_opener(opener)
mechanize.urlopen(baseurl)

要求に応じてトレースバック

harrisony@lithium:~$ python sitefoo.py 
now running mechanize.urlopen
<addinfourl at 169181868 whose fp = <httplib.HTTPResponse instance at 0xa15858c>>


now running mechanize.Browser then br.open
Traceback (most recent call last):
  File "sitescreaper.py", line 21, in <module>
    br.open(baseurl)
  File "/usr/lib/python2.6/dist-packages/mechanize/_mechanize.py", line 209, in open
    return self._mech_open(url, data, timeout=timeout)
  File "/usr/lib/python2.6/dist-packages/mechanize/_mechanize.py", line 261, in _mech_open
    raise response
mechanize._response.httperror_seek_wrapper: HTTP Error 401: Unauthorized
4

1 に答える 1

1

より良いオプションがあるかもしれませんが、それを機能させる唯一の方法は、HTTPNtlmAuthHandler の呼び出しを何らかの形で妨げていた HTTPRobotRulesProcessor ハンドラーを削除することでした。

注: 次のコードも、プロキシ サーバーをバイパスするために ProxyHandler を削除します。該当する場合は削除します。

passman = mechanize.HTTPPasswordMgrWithDefaultRealm()
passman.add_password(None, baseurl, user, password)
auth_NTLM = HTTPNtlmAuthHandler.HTTPNtlmAuthHandler(passman)

browser = mechanize.Browser()
browser.add_handler(auth_NTLM)

handlersToKeep = []
for handler in browser.handlers:
    if not isinstance(handler, (mechanize._auth.ProxyHandler, 
                                mechanize._urllib2_support.HTTPRobotRulesProcessor)):
        handlersToKeep.append(handler)
browser.handlers = handlersToKeep

browser.open(url)
于 2011-02-25T22:48:38.727 に答える