2

我有一些使用机械化和受密码保护的站点的代码。我可以很好地登录并获得我期望的结果。但是,一旦我登录,我不想“点击”链接,我想遍历 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

将要,

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

我曾经使用过的每个网络浏览器都对以下内容做出了正确的响应:

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

因为我讨厌把东西错误地连接起来,所以我的 SITE 变量是“ http://www.foo.com/

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

我对 open 的呼吁最终是.open('http://www.foo.com//bar/baz/trool.html')机械化浏览器显然不像“真正的”浏览器那样按摩。Apache 不喜欢这些网址。

于 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 回答