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 };
Другие вопросы по тегам