Javascript 在不滚动的情况下,刮取无限滚动页面会停止

Javascript 在不滚动的情况下,刮取无限滚动页面会停止,javascript,phantomjs,casperjs,Javascript,Phantomjs,Casperjs,我目前正在与PhantomJS和CasperJS合作,在网站中搜寻链接。该网站使用javascript动态加载结果。然而,下面的代码片段并没有让我获得页面包含的所有结果。我需要的是向下滚动到页面底部,查看是否显示微调器(意味着还有更多的内容),等待新内容加载完毕,然后继续滚动,直到不再显示新内容。然后将类名为.title的链接存储在一个数组中。链接到用于刮削的 var casper = require('casper').create(); var urls = []; function try

我目前正在与PhantomJS和CasperJS合作,在网站中搜寻链接。该网站使用javascript动态加载结果。然而,下面的代码片段并没有让我获得页面包含的所有结果。我需要的是向下滚动到页面底部,查看是否显示微调器(意味着还有更多的内容),等待新内容加载完毕,然后继续滚动,直到不再显示新内容。然后将类名为
.title
的链接存储在一个数组中。链接到用于刮削的

var casper = require('casper').create();
var urls = [];
function tryAndScroll(casper) {
  casper.waitFor(function() {
    this.page.scrollPosition = { top: this.page.scrollPosition["top"] + 4000, left: 0 };
    return true;
  }, function() {
    var info = this.getElementInfo('.badge-post-grid-load-more');
    if (info["visible"] == true) {
      this.waitWhileVisible('.badge-post-grid-load-more', function () {
        this.emit('results.loaded');
      }, function () {
        this.echo('next results not loaded');
      }, 5000);
    }
  }, function() {
    this.echo("Scrolling failed. Sorry.").exit();
  }, 500);
}

casper.on('results.loaded', function () {
  tryAndScroll(this);
});

casper.start('http://example.com/', function() {
    this.waitUntilVisible('.title', function() {
        tryAndScroll(this);
      });
});

casper.then(function() {
  casper.each(this.getElementsInfo('.title'), function(casper, element, j) {
    var url = element["attributes"]["href"];
    urls.push(url);
  });
});

casper.run(function() {
    this.echo(urls.length + ' links found:');
    this.echo(urls.join('\n')).exit();
});

我已经看过这一页了。您的误解可能是您认为
.badge post grid load more
元素在加载下一个元素时立即消失。事实并非如此。这一点都没有改变。您必须找到另一种方法来测试是否将新元素放入DOM中

例如,您可以检索元素的当前数目,并使用
waitFor
来检测数目何时更改

function getNumberOfItems(casper) {
    return casper.getElementsInfo(".listview .badge-grid-item").length;
}

function tryAndScroll(casper) {
  casper.page.scrollPosition = { top: casper.page.scrollPosition["top"] + 4000, left: 0 };
  var info = casper.getElementInfo('.badge-post-grid-load-more');
  if (info.visible) {
    var curItems = getNumberOfItems(casper);
    casper.waitFor(function check(){
      return curItems != getNumberOfItems(casper);
    }, function then(){
      tryAndScroll(this);
    }, function onTimeout(){
      this.echo("Timout reached");
    }, 20000);
  } else {
    casper.echo("no more items");
  }
}

我还简化了一点
tryAndScroll
。有完全不必要的函数:第一个
casper.waitFor
根本没有等待,因此
onTimeout
回调永远无法调用。

+1太好了,你对我的误解是对的。现在,当我运行时出现错误:
等待10000毫秒超时已过期,正在退出。
。你能把整个代码块都贴出来吗?我一定是把它放错了是的,问题是没有传递onTimeout回调,超时错误就会被抛出,脚本会过早停止。我添加了回调并增加了超时时间。请记住,现在页面上有600个链接,还有一个新创建的链接可以打开第二个页面,可以滚动加载更多的项目。完美!我现在理解了onTimeout Callback的问题您是对的,它会刮取所有600个结果,是否可能只刮取最多100个结果?当然,
curItems
变量就在那里。您可以使用另一个if块来检查它是否大于100,并且只有当它小于100时才执行
casper.waitFor