不使用提交按钮提交,Mechanize
我一开始用的是Mechanize,结果我尝试的第一个网站是一个用JavaScript导航的复杂网站。
现在我遇到的问题是如何提交表单。
通常我会用Mechanize自带的submit()函数来提交。
import mechanize
browser = mechanize.Browser()
browser.select_form(name = 'foo')
browser.form['bar'] = 'baz'
browser.submit()
这样的话,它会使用HTML表单里可用的提交按钮。
但是,我现在遇到的网站偏偏不使用HTML提交按钮……他们想当JavaScript高手,直接通过JavaScript来提交。
普通的submit()函数似乎对这个不管用。
那么……有没有办法解决这个问题呢?
任何帮助都非常感谢!
--[编辑]--
我现在卡住的JavaScript函数:
function foo(bar, baz) {
var qux = document.forms["qux"];
qux.bar.value = bar.split("$").join(":");
qux.baz.value = baz;
qux.submit();
}
我在Python中做的(但不管用):
def foo(browser, bar, baz):
qux = browser.select_form("qux")
browser.form[bar] = ":".join(bar.split("$"))
browser.form[baz] = baz
browser.submit()
1 个回答
11
有三种方法:
如果你是通过POST或GET方式提交表单,第一种方法是最好的选择。如果不是,那就得用第二种或第三种方法了。
手动提交表单,并检查POST/GET请求、它们的参数以及提交表单所需的地址。常用的工具有Live HTTP headers扩展、Firefox的Firebug扩展,还有Chrome的开发者工具扩展。下面是使用POST/GET方法的一个例子:
import mechanize import urllib browser = mechanize.Browser() #These are the parameters you've got from checking with the aforementioned tools parameters = {'parameter1' : 'your content', 'parameter2' : 'a constant value', 'parameter3' : 'unique characters you might need to extract from the page' } #Encode the parameters data = urllib.urlencode(parameters) #Submit the form (POST request). You get the post_url and the request type(POST/GET) the same way with the parameters. browser.open(post_url,data) #Submit the form (GET request) browser.open(post_url + '%s' % data)
重写JavaScript代码,并在Python中执行。可以看看spidermonkey这个工具。
模拟一个完整的浏览器。可以尝试Selenium和Windmill这两个工具。