不使用提交按钮提交,Mechanize

10 投票
1 回答
8322 浏览
提问于 2025-04-16 12:02

我一开始用的是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方式提交表单,第一种方法是最好的选择。如果不是,那就得用第二种或第三种方法了。

  1. 手动提交表单,并检查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)
    
  2. 重写JavaScript代码,并在Python中执行。可以看看spidermonkey这个工具。

  3. 模拟一个完整的浏览器。可以尝试Selenium和Windmill这两个工具。

撰写回答