2013-03-27 6 views
1

Я заполняю и отправляю форму с помощью PhantomJS, а затем выводя результирующую страницу. Дело в том, что я понятия не имею, если эта вещь вообще представлена.PhantomJS: отправьте форму

Я печатаю результирующую страницу, но это то же самое, что и исходная страница. Я не знаю, связано ли это с тем, что он перенаправляет обратно, или я не отправил его, или мне нужно подождать дольше или или. В реальном браузере он отправляет GET и получает cookie, который он использует для отправки большего количества GETS, прежде чем в конечном итоге получит окончательный результат - данные полета.

Я скопировал этот пример How to submit a form using PhantomJS, используя различные функции url и page.evaluate.

var page = new WebPage(), testindex = 0, loadInProgress = false; 

page.onConsoleMessage = function(msg) { 
    console.log(msg); 
}; 

page.onLoadStarted = function() { 
    loadInProgress = true; 
    console.log("load started"); 
}; 

page.onLoadFinished = function() { 
    loadInProgress = false; 
    console.log("load finished"); 
}; 

var steps = [ 
    function() { 
    //Load Login Page 
    page.open("http://www.klm.com/travel/dk_da/index.htm"); 
    }, 
    function() { 
    //Enter Credentials 
    page.evaluate(function() { 

        $("#ebt-origin-place").val("CPH"); 
        $("#ebt-destination-place").val("CDG"); 
        $("#ebt-departure-date").val("1/5/2013"); 
        $("#ebt-return-date").val("10/5/2013"); 

    }); 
    }, 
    function() { 
    //Login 
    page.evaluate(function() { 

    $('#ebt-flightsearch-submit').click() ; 

    # also tried: 
    # $('#ebt-flight-searchform').submit(); 

    }); 
    }, 
    function() { 
    // Output content of page to stdout after form has been submitted 
    page.evaluate(function() { 
     console.log(document.querySelectorAll('html')[0].outerHTML); 
    }); 
    } 
]; 


interval = setInterval(function() { 
    if (!loadInProgress && typeof steps[testindex] == "function") { 
    console.log("step " + (testindex + 1)); 
    steps[testindex](); 
    testindex++; 
    } 
    if (typeof steps[testindex] != "function") { 
    console.log("test complete!"); 
    phantom.exit(); 
    } 
}, 50); 
+0

Возможно, вы захотите попробовать CasperJS - он работает с Phantom, чтобы сделать его немного более дружелюбным. –

+0

Я предполагаю, что я не уверен, что с этой страницей что-нибудь будет работать. Как будто они активно препятствуют попыткам соскабливания. PhantomJs - четвертая вещь, которую я пытаюсь. – user984003

+0

Использование Каспера, пауза около 400 мс между действиями, изменение User Agent на что-то анонимное, например. «Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/536.28.10 (KHTML, например, Gecko) Версия/6.0.3 Safari/536.28.10 '(это на Webkit, таком как Phantom, но совпадает с любым пользователем Safari на OSX 10.8.3), будет удивлен, если это не сработает. –

ответ

0

Интересующий объект довольно сложно очистить. Я вошел в HTTP-трафик с сайта США KLM и получил это:

GET /travel/us_en/apps/ebt/ebt_home.htm?name=on & EBT-происхождения место = New York + + - + Джон + F + Kennedy + International +% 28JFK% 29% 2CNew + York & ebt-destination-place = Paris + - + Charles + De + Gaulle + Airport +% 28CDG% 29% 2C + Франция & c% 5B0% 5D.os = JFK & c % 5B0% 5D.ost = & аэропорт гр% 5B0% 5D.ds = КОДИРОВАНИЯ & C% 5B0% 5D.dst = & аэропорт гр% 5B1% 5D.os = КОДИРОВАНИЯ & C% 5B1% 5D.ost = & аэропорт гр % 5B1% 5D.ds = JFK & inboundDestinationLocationType = аэропорт & redirect = no & chdQty = 0 & infQty = 0 & c% 5B0% 5D.dd = 2013-07-31 & c% 5B1% 5D.dd = 2013-08-14 & c% 5B1% 5D.format = dd% 2Fmm% 2Fyyyy & flex = true & EBT-кабина класса = & ЭКОНОМИКА adtQty = 1 & GotoPage = & cffcc = & ЭКОНОМИКА СБН = ложь HTTP/1.1

Ваши введенные значения для элементов формы не то, что их сервер ищет.

Внутри page.evaluate() вы изолированы песочницей, но пример кода включает в себя крючок, чтобы передать активность консольной консоли на внешнюю консоль. Для другой отладки вы также можете включать инспекторов объектов и т. Д., Но их нужно вводить на страницу или часть кода, переданного в функцию оценки().