2012-07-31 45 views
4

我刚开始在Python中使用机械化,我已经有一些问题了。我浏览过StackOverflow和Google,我也看到有人说文档很棒,应该很容易让它工作,但我认为我不知道该如何查找这些文档,因为所有的可以找到代码示例,这些代码示例并不真正教会我如何执行我正在尝试做的特定事情。如果有人能够指出我的这些文件,我很乐意自己阅读并解决我的问题。Python中的机械化 - 提交后重定向不工作

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

这是我没有得到的部分,因为如果我在调用提交后立即打印页面的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,然后我按照在具有底部的链接文本“管理”,我在表单中输入我的凭证,然后提交。通常情况下,我将被重定向到我所在的第一个页面,但只有更多的按钮可供管理员使用。我想单击其中一个链接来填写另一个表单,以添加我拥有其电子邮件地址,姓名等的用户列表。

有没有简单的东西我错过了?我想我已经掌握了基础知识,但是我不知道该库足以找出重定向发生了什么问题。

回答

7

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

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

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

在打开网址之前,有些东西是您不需要的。例如:mechanize.Browser()不是urllib,它已经为你管理cookies。你不应该避免robots.txt。你可以看到遵循一些更“约定优于配置”的前处理程序是默认:

mechanize.Browser().handlers 

你可能有mechanize.HTTPRedirectHandler在该列表中(我),如果不是:

br.set_handle_redirect(mechanize.HTTPRedirectHandler) 

的for循环很奇怪,好像你在循环内部改变它的迭代器(链接在一个打开的URL里面)(浏览器打开另一个URL)。我首先想到你想递归地点击,而有一个“安全”的URL匹配。错误将取决于如何链接()发生器实施(可能它遵循一个固定br.response()实例),但我认为你只是想跟随匹配的第一个链接:

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

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

你能得到关于最后打开URL“原始”信息是这样的:

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定位它得到重定向URL,使用html_data.find (),正则表达式,BeautifulSoup等。

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

+0

这是很好的建议!对于for循环,这是我已经复制并适应了我的需求,但你的方式显然更好。我只是有一个问题,虽然...你说我可以解析html_data来找到重定向URL,我可以管理它,但是我不知道在我拥有这个URL之后我应该调用什么函数,所以我可以保持登录状态......我还在想,如果我已经知道重定向url而不会丢失我的登录信息,是否真的必须解析html才能获得重定向链接,或者如果我可以硬编码它? – 2012-07-31 12:46:17

+0

它只是br.open(link_string)。 – 2012-08-02 03:31:33

+0

您可以对链接字符串进行硬编码,但您应该知道如果链接更改,您的代码将被弃用。你不应该用cookies来担心:机械化浏览器管理cookies,你可以认为你是在一个普通的图形浏览器内的地址栏中输入你的链接。只要不打开另一个浏览器(即始终使用您创建的相同“br”),因此您的cookies将被保存在“jar”中(即,登录不应该丢失)。 – 2012-08-02 03:45:26