Casperjs выскабливает динамический контент
Я пытаюсь почистить эту страницу, используя Casperjs. Основная функция моего кода работает просто отлично, но контент загружается динамически, и я не могу понять, как это вызвать.
Вот чем я сейчас занимаюсь:
casper.waitFor(function() {
this.scrollToBottom();
var count = this.evaluate(function() {
var match = document.querySelectorAll('.loading-msg');
return match.length;
});
if (count <= 1) {
return true;
}
else {
return false
};
}, function() { // do stuff });
Время ожидания просто истекает, хотя я увеличил его до 20 секунд, и новый контент никогда не загружается. Я попытался адаптировать эту функцию для моего случая:
function tryAndScroll(casper) {
casper.waitFor(function() {
this.page.scrollPosition = { top: this.page.scrollPosition["top"] + 4000, left: 0 };
return true;
}, function() {
var info = this.getElementInfo('p[loading-spinner="!loading"]');
if (info["visible"] == true) {
this.waitWhileVisible('p[loading-spinner="!loading"]', function () {
this.emit('results.loaded');
}, function () {
this.echo('next results not loaded');
}, 5000);
}
}, function() {
this.echo("Scrolling failed. Sorry.").exit();
}, 500);
}
Но я не мог понять это, и я даже не уверен, что это актуально здесь. Есть идеи?
1 ответ
Я посмотрел на страницу. У него такой вид, что он не загружает средние изображения, когда вы прыгаете до конца.
Когда страница загружена, первые несколько строк полностью загружены, а некоторые еще не загружены полностью (отсутствующее изображение обозначено как '.loading-msg'
элемент). Когда вы прыгаете до конца с this.scrollToBottom();
нет непрерывного свитка. Он переходит к концу, и страница JavaScript не обнаруживает, что средние изображения были в окне просмотра, хотя и кратко. Страница продолжает загружать следующие строки, но не пропущенные изображения пропущенных строк.
Вы должны уменьшить расстояние прыжка в обоих ваших фрагментах.
Первый можно изменить следующим образом:
var pos = 0,
height = casper.page.viewportSize.height;
casper.waitFor(function() {
this.scrollTo(0, pos * height);
return !this.exists('.loading-msg');
}, function() { // do stuff }, 20000);
Второй может работать, изменяя
this.page.scrollPosition = { top: this.page.scrollPosition["top"] + 4000, left: 0 };
в
var height = casper.page.viewportSize.height;
this.page.scrollPosition = { top: this.page.scrollPosition.top + height, left: 0 };