2

mechanizeとパスワードで保護されたサイトを使用しているコードがあります。私はうまくログインして、期待する結果を得ることができます。ただし、ログインした後は、リンクを「クリック」したくないので、URLのリストを繰り返し処理します。残念ながら、各.open()呼び出しは、ログインページへのリダイレクトを取得するだけです。これは、ログアウトした場合、または別のブラウザーでログインしようとした場合に予想される動作です。これは、ある種のCookie処理であると私に信じさせますが、私は途方に暮れています。

def main():
    browser = mechanize.Browser()
    browser.set_handle_robots(False)
    # The below code works perfectly
    page_stats = login_to_BOE(browser)
    print page_stats

    # This code ALWAYS gets the login page again NOT the desired 
    # behaviour of getting the new URL. This is the behaviour I would
    # expect if I had logged out of our site.
    for page in PAGES:
        print '%s%s' % (SITE, page)
        page = browser.open('%s%s' % (SITE, page))
        page_stats = get_page_statistics(page.get_data())
        print page_stats
4

3 に答える 3

2

各リンクに使用する代わりに:

browser.open('www.google.com')

最初のログインを行った後、以下を使用してみてください。

browser.follow_link(text = 'a href text')

私の推測では、openを呼び出すと、Cookieがリセットされます。

于 2009-09-08T23:06:00.597 に答える
2

意思、

あなたの提案は私を正確に正しい方向に向けました。

私が今まで使用したすべてのWebブラウザーは、次のような正しい応答を返しました。

http://www.foo.com//bar/baz/trool.html

物事を誤って連結するのは嫌なので、私のSITE変数は「http://www.foo.com/」でした。

さらに、他のすべてのURLは「/bar/baz/trool.html」でした

開くための私の呼び出しは結局で.open('http://www.foo.com//bar/baz/trool.html')あり、機械化ブラウザは明らかに「本物の」ブラウザのようにマッサージしません。ApacheはURLが気に入らなかった。

于 2009-09-08T23:13:39.597 に答える
1

これは答えではありませんが、正しい方向に導く可能性があります。以下のステートメントのいくつかの組み合わせを使用して、Mechanizeの広範なデバッグ機能をオンにしてみてください。

browser.set_debug_redirects(True)
browser.set_debug_responses(True)
browser.set_debug_http(True)

これにより、大量のHTTP情報が提供されます。これは、Mechanizeベースの唯一のアプリケーションを開発したときに非常に役立ちました。

私のアプリケーションでは、あなたが質問で示したものと(もしあれば)それほど違いはないことに注意する必要があります。同じ方法でブラウザオブジェクトを作成し、それを次のログイン関数に渡します。

def login(browser):
    browser.open(config.login_url)
    browser.select_form(nr=0)
    browser[config.username_field] = config.username
    browser[config.password_field] = config.password
    browser.submit()
    return browser

次に、browser.open(url)を使用して認証が必要なページを開くことができ、すべてのCookie処理が透過的かつ自動的に処理されます。

于 2009-09-08T22:40:27.373 に答える