我正在连接需要使用机械化登录的页面。它在首页上使用了一些javascript,使得机械化直接使用起来更加困难。我知道我必须提交什么形式才能登录 - 这个形式总是由js生成,每次都是一样的。如何设置机械化只需提交页面上没有的自定义表单?基本上等同于this perl problem但在Python中。
答案 0 :(得分:5)
(注意:最近又出现了这个问题,我现在实际上已经开始工作了。)
这似乎有效:
br.open(URL)
res = mechanize._form.ParseString(FORM_HTML, BASE_URL)
br.form = res[1]
#continue as if the form was on the page and selected with .select_form()
br['username'] = 'foo'
br['password'] = 'bar'
br.submit()
URL
是访问过的网站的完整网址。 BASE_URL
是网址所在的目录。FORM_HTML
是具有form
元素的任何HTML,例如:
<form method='post' action='/login.aspx'>
<input type='text' name='username'>
<input type='text' name='password'>
<input type='hidden' name='important_js_thing' value='processed_with_python TM'>
</form>
出于某种原因,mechanize._form.ParseString
会返回两个表单。第一个是对基本URL的GET
请求,没有输入;第二个,来自FORM_HTML
的正确解析的表单。
答案 1 :(得分:0)
解析页面,提取所需的元素,改造页面,然后将它们注入机械化。
对于我参与的项目,我不得不使用模拟浏览器,发现Mechanize在表单处理方面非常差。它会从Javascript块中剔除未解释的元素并死掉。我不得不写一个使用BeautifulSoup的解决方法来去掉所有会导致它在到达表单解析器之前死掉的位。
你可能会遇到或不会遇到这个问题,但这是要记住的事情。我最终放弃了机械化方法,并选择了Selenium。它的表单处理程序非常优越,它可以处理JS。它有问题(浏览器增加了一层复杂性),但我发现它更容易使用。