2

URL からの自動ダウンロードを 1 日 1 回行う Python スクリプトがあります。

最近、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 がこれらの使用をサポートしているかどうかはわかりません。

これを再び機能させるために使用できるサードパーティのライブラリまたはトリックはありますか?

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()

これにより、Web サイトの典型的なログイン画面を通過できます。それで

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 に答える