python 和 mechanize.open()
我有一些代码在使用 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处理都是自动进行的,非常方便。