在Python中机械化 - 提交后重定向无效

时间:2012-07-31 03:48:27

标签: python mechanize mechanize-python

我刚开始在Python中使用mechanize,我已经遇到了一些问题。我已经浏览了StackOverflow和谷歌,我看到人们说文档很棒,应该很容易让它工作,但我想我不知道如何寻找那些文档,因为我所有的可以找到的代码示例并没有真正教会我如何做我正在尝试的特定事情。如果有人能指出我这样的文件,我很乐意自己阅读并解决我的问题。

对于实际问题,我试图通过在表单中​​发送我的用户名和密码信息来登录网站。当信息正确时,我通常会被重定向,但它在机械化方面不起作用。

这是我没有得到的部分,因为如果我在调用submit后立即打印页面的html内容,页面会显示一个变量,表明身份验证有效。如果我将密码更改为不正确的密码,则html会显示“无效凭据”消息,就像我正常浏览网站一样。

这是我如何做的代码示例。请记住,这可能是完全错误的,因为我只是尝试应用我在示例中找到的内容:

import mechanize
import cookielib

# Start Browser
br = mechanize.Browser()
cj = cookielib.LWPCookieJar()

br.set_cookiejar(cj)

br.set_handle_equiv(True)
br.set_handle_redirect(True)
br.set_handle_referer(True)
br.set_handle_robots(False)

br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)

br.open('http://www.complexejuliequilles.com/')


for l in br.links(url_regex='secure'):
    br.follow_link(l)

br.select_form('form1')

br.form['fldUsername'] = 'myUsername'
br.form['fldPassword'] = 'myPassword'
br.submit()

在这个特定示例中,我打开http://www.complexejuliequilles.com,然后我按照底部的链接,其中包含文本“管理”,我在表单中输入我的凭据,然后我提交它。通常情况下,我会被重定向到我所在的第一页,但有更多按钮只能由管理员使用。我想点击其中一个链接填写另一个表单,添加一个用户列表,我有他们的电子邮件地址,姓名等。

有什么简单的我不见了吗?我想我已经掌握了基础知识,但我不知道这个库足以找到重定向的问题。

1 个答案:

答案 0 :(得分:8)

http://wwwsearch.sourceforge.net/mechanize/documentation.html

避免直接使用“_http”。名称中的第一个下划线告诉我们,开发人员认为它是私有的,你可能不需要它。

In [20]: mechanize.HTTPRefreshProcessor is mechanize._http.HTTPRefreshProcessor
Out[20]: True

在打开您并不真正需要的URL之前,您已经放了一些东西。例如:mechanize.Browser()不是urllib,它已经为你管理了cookie。你不应该避免robots.txt。您可以通过查看默认处理程序之前的更多“约定优于配置”:

mechanize.Browser().handlers

你可能在该列表中有机械化.HTTPRedirectHandler(我这样做),如果没有:

br.set_handle_redirect(mechanize.HTTPRedirectHandler)

for循环很奇怪,好像你正在循环中改变它的迭代器(开放URL内的链接)(浏览器打开另一个URL)。我首先想到的是,当有一个“安全”的URL匹配时,你想要递归地点击。错误取决于links()生成器的实现方式(可能它遵循固定的br.response()实例),但我想你只想跟随匹配的第一个链接:

In [50]: br.follow_link(url_regex="secure") # No loops

我不知道你需要什么样的重定向/刷新。 JavaScript更改window.location.href?如果是这样,机械化将不会这样做,除非你自己解析JavaScript。

您可以通过以下方式获取有关上一个打开网址的“原始”信息:

last_response = br.response() # This is returned by br.open(...) too
http_header_dict = last_response.info().dict
html_string_list = last_response.readlines()
html_data = "".join(html_string_list)

即使它是一个JavaScript,您也可以通过使用html_data.find(),正则表达式,BeautifulSoup等将它定位在html_data中来获取重定向URL。

PEP8注意:避免使用孤立的“l”(较低的“L”)作为变量,根据使用的字体和上下文,它可能被错误地看作“一”或“我”(上“i”)。您应该使用“L”或其他名称。