2016-07-03 6 views
0

Мне нужно получить данные ajax с сайта, не поддерживающего PhantomJS. Данные отображаются при нажатии ссылки.Нажмите на ссылку PhantomJS

<div class="show-all-goods"><a href="#">Show all</a></div> 

Вот мой код:

var page = require('webpage').create(); 
page.open('http://dveri.com/catalog/dveri-mezhkomnatnyye/dveri-shponirovannyye/', function() { 
    page.includeJs("https://ajax.googleapis.com/ajax/libs/jquery/3.0.0/jquery.min.js", function() { 
    page.evaluate(function(){ 
     $('.show-all-goods a').click(); 
    }); 

}); 
console.log(page.content); 
phantom.exit(); 
}); 

Но данные не загружаются. Помогите мне, пожалуйста,

ответ

0

Если вы пытаетесь показать данные по линии console.log(page.content);, вы фактически вызываете эту функцию еще до того, как произойдет щелчок.

Думайте асинхронно.

Клик выполняется после загрузки страницы и JS впрыскивается, и вы никогда не можете знать, когда что будет происходить в зависимости от сервера, сети лаг и т.д.

К сожалению, PhantomJS не имеет API для Ajax обратных вызовов ,

До сих пор, что я делал для подобных ситуаций, я писал наблюдателю, чтобы постоянно отслеживать один или несколько элементов HTML, на которые влияет обратный вызов ajax. Скажем, например, есть div, который сейчас пуст, и обратный вызов ajax собирается заполнить это каким-то контентом. Я создал setInterval или setTimeout в коде PhantomJS и назвал evaluate, который, в свою очередь, наблюдал за любыми изменениями в этом div. Из этой функции оценки я вернул логическое значение, основанное на том, что получил, и предпринял дальнейшие шаги. Однако вы также можете вернуть содержимое, которое вы можете поместить в свой console.log, а затем выйти из приложения.

Это можно легко сделать, если вы используете casperJS (http://casperjs.org/), используя один из многих API, как wait() waitFor() waitForResource() waitForSelector() waitWhileSelector() waitForSelectorTextChange() waitForText() waitUntilVisible() waitWhileVisible()

Смежные вопросы