python 和 mechanize.open()

2 投票
3 回答
3654 浏览
提问于 2025-04-15 14:10

我有一些代码在使用 mechanize 这个库,访问一个需要密码的网站。我可以顺利登录,并且得到了我想要的结果。不过,一旦我登录后,我不想“点击”链接,而是想通过一个网址列表来逐个访问。不幸的是,每次调用 .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

3 个回答

2

Will,

你的建议让我找到了正确的方向。

我用过的每一个网页浏览器都能正确处理类似下面这样的内容:

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'),而 mechanize 浏览器显然没有像“真正的”浏览器那样处理这个问题。Apache 对这些 URL 也不太满意。

2

与其对每个链接都使用循环:

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

不如在完成初始登录后尝试使用以下方法:

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

我猜测调用 open 这个操作可能是导致你的 cookies 被重置的原因。

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处理都是自动进行的,非常方便。

撰写回答