Отправить без использования кнопки отправки, Механизировать - PullRequest
10 голосов
/ 18 февраля 2011

Итак, я начал с 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 (), похоже, не работает с этим.

Итак ... Есть ли способ обойти это?

Любая помощь приветствуется. Большое спасибо!

- [Edit] -

Функция 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 голосов
/ 01 августа 2011

Три способа:

Первый метод предпочтителен, если форма отправляется с использованием метода POST / GET, в противном случае вам придется прибегнуть ко второму и третьему методу.*

Отправка формы вручную и проверка POST / GET-запросов, их параметров и URL-адреса, необходимого для отправки формы.Популярными инструментами для проверки заголовков являются расширение Live HTTP заголовки и расширение Firebug для Firefox, а также расширение Developer Tools для 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.

Эмулируйте полный браузер.Проверьте Селен и Ветряная мельница.

...