javascript - 在不滚动的情况下停止无限滚动页面

标签 javascript phantomjs casperjs

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

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 回调。

关于javascript - 在不滚动的情况下停止无限滚动页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29017726/

相关文章:

javascript - casper.js 退出实例 onStepTimeout

javascript - CasperJS 测试覆盖率

javascript - 如何远程获取在heroku上运行的phantomjs脚本的答案?

javascript - phantomjs:找不到命令

mysql - UI 测试 (casperjs) 具有良好的已知数据状态(mysql 数据库)

Javascript:如何显示带有 <div> 内容的弹出窗口

javascript - 为什么 PhantomJS 显示旧版本的 Google 快讯?

javascript - 在具有数组值的对象中搜索单词

javascript - IE 将事件附加到复选框?

javascript - 如何使用 Google Places API Web 服务从地点详细信息请求中获取所有地点详细信息?