python和mechanize.open()

python和mechanize.open(),python,mechanize,Python,Mechanize,我有一些使用mechanize和密码保护站点的代码。我可以很好地登录并获得我期望的结果。然而,一旦我登录,我不想“点击”链接,我想通过URL列表进行迭代。不幸的是,每次.open()调用都会直接返回登录页面,这是我在注销或尝试使用其他浏览器登录时所期望的行为。这让我相信这是某种饼干处理方式,但我不知所措 def main(): browser = mechanize.Browser() browser.set_handle_robots(False) # The belo

我有一些使用mechanize和密码保护站点的代码。我可以很好地登录并获得我期望的结果。然而,一旦我登录,我不想“点击”链接,我想通过URL列表进行迭代。不幸的是,每次.open()调用都会直接返回登录页面,这是我在注销或尝试使用其他浏览器登录时所期望的行为。这让我相信这是某种饼干处理方式,但我不知所措

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

这不是一个答案,但它可能会引导你走向正确的方向。尝试使用以下语句的组合来启用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

然后,我可以使用浏览器打开需要身份验证的页面。打开(url),所有cookie处理都将为我透明地自动处理。

而不是为每个链接使用:

browser.open('www.google.com')
完成初始登录后,请尝试使用以下命令:

browser.follow_link(text = 'a href text')
我猜调用open就是重置cookies的原因。

威尔

你的建议为我指明了正确的方向

我使用过的每个web浏览器都会对以下内容做出正确的响应:

http://www.foo.com//bar/baz/trool.html
因为我讨厌错误地连接东西,所以我的站点变量为“”

此外,所有其他URL都是“/bar/baz/trool.html”


我对open的调用结果是
.open('http://www.foo.com//bar/baz/trool.html)
而且mechanize浏览器显然不像“真正的”浏览器那样有说服力。Apache不喜欢URL。

第一个打开的调用是否有效,所有顺序调用是否都会命中登录页,还是所有调用都会命中登录页?第一个调用在login_to_BOE()调用中处理,其工作方式完全符合预期。for循环中的所有调用都返回登录页面(添加了一个参数,指示成功登录时要重定向到的url)。