抓取无限滚动页面停止而不滚动

2024-02-17

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

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永远无法调用回调。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

抓取无限滚动页面停止而不滚动 的相关文章

随机推荐

  • 如何在 eclipse luna 中配置 lombok

    我使用 Maven 在 eclipse Luna 中配置 lombok 注解已正确添加 但未生成 getter 和 setter eclipse ini vm E Program Files Java jdk1 7 0 60 bin vma
  • 如何拆分长 GraphQL 模式

    我正在尝试创建一个架构 但是会变得太长且令人困惑 分割不同查询 突变和输入的最佳实践是什么 这样我就可以只需要它们并组织它们以使其易于阅读 我试图在网上查找信息 但没有任何明确的信息 我试图不使用阿波罗 const buildSchema
  • 对可变长度序列进行训练和预测

    传感器 同类型的 分散在我的网站上 不定期地手动向我的后端报告 在报告之间 传感器聚合事件并批量报告它们 以下数据集是批量收集的序列事件数据的集合 例如传感器 1 报告了 2 次 在第一批 2 个事件和第二批 3 个事件中 传感器 2 报告
  • 修复 file_get_contents 权限被拒绝的错误

    我有一个关于 JSON 和 PHP 的问题 因此 如果您访问此网站 作为返回 您会得到 HTML 但如果您转到响应 则响应是纯 JSON 因此我尝试获取 JSON 数据 但失败了 也许我做错了什么 但我不知道是什么 我尝试过file get
  • 使用 jmxagent 将 Spark Worker/Executor 指标导出到 Prometheus

    我已按照说明进行操作here https argus sec com monitoring spark prometheus 启用指标导出到 Prometheus for Spark 为了不仅可以从作业中导出指标 还可以从主控器和工作器中导
  • React Dev Tools 不显示组件名称或状态变量名称

    这是 Google Chrome 中新的 React 开发工具的屏幕截图 仅顶级组件名称AdminArea显示 该组件位于我的脚本的入口文件中 index jsx 还应该有 AddNewCoupon 和 ViewCoupons 组件 没有启
  • 这个 Ruby 类方法是如何被调用的?

    在屏幕投射中从 Rails 应用程序导出 CSV http railscasts com episodes 362 exporting csv and excel Ryan Bates 给出了以下简单的代码 我试图弄清楚类方法 Produc
  • Sublime Text 3 中包的语法高亮 (.tmLanguage)

    我正在研究这个plugin https github com andriyko sublime robot framework assistant 使用包控制安装插件时 语法突出显示不适用于 Sublime Text 3 Error loa
  • WPF 的自定义复选框样式

    我想将 wpf 默认复选框设置为自定义的外观 由于开始一个全新的控件并没有真正的意义 因此我想覆盖复选框的 Bulletchrome 子组件的 Windows Chrome 模板绑定 但是 我不能像使用复选框那样做到这一点 尝试使用类似的东
  • 如何使用 Android 的 ListView 在 React Native 中实现上拉加载更多内容?

    这就像下拉刷新的相反操作 Android 上的 ListView 不支持弹跳 实现无限滚动ListView您可以使用onEndReached and renderFooter from ListView成分 它可能看起来像这样 你只需ren
  • 立即绘制和 Matplotlib

    我目前正在开展一个项目 该项目涉及获取模拟读数并将其实时映射到图表上 因此 为了完成此任务 我通过 Arduino 模拟端口运行光敏电阻 并通过 python 3 4 3 读取该数据 在Python方面 我安装了maplotlib和draw
  • 使用 sendKeys() 在 Selenium 中上传文件不起作用

    我无法使用上传文件sendKeys 这是我的代码 driver findElement By xpath Locators browseFlagIconBtn sendKeys D Images icons png 我有一个用于文件上传的文
  • Spring 和 Hibernate 的正确版本以及所需的依赖项...由于依赖项而出现异常

    三天以来 我一直在尝试运行我的 Spring Hibernate 程序 由于 hibernate2 和 hibernate3 之间的版本差异 我很难找到所涉及的依赖项 最后我能够运行具有以下依赖项的程序 cglib nodep 2 1 3
  • Jupyter Notebook 中的感叹号和问号是什么意思?

    下列词语的含义是什么 尤其是 and 在以下示例中 与查询 Pandas DataFrame 中的数据相关 感叹号 cat olympics csv 问号 df fillna import pandas as pd pd Series co
  • 使用 Google Analytics Export API 获取网站趋势

    我正在开发一个使用 Google Analytics Export API 的应用程序 我正在尝试获取 Google 针对您的每个网站帐户显示的 趋势 结果 百分比 即上涨 35 04 或下跌 16 02 他们如何 在哪里获得这个数字以及它
  • 使用 SecItemImport 导入 PKCS12

    Apple s 文档 https developer apple com library mac documentation security Reference keychainservices Reference reference h
  • Plotly-Dash:如何确定客户端回调中的触发输入

    Dash 的文档描述了在服务器端回调的情况下如何确定哪个输入触发了回调 高级回调 https dash plotly com advanced callbacks 有没有办法确定哪个输入触发了客户端打回来 看起来这个功能是在1 13 0版本
  • REST - 修改部分资源 - PUT 或 POST

    我看到很多关于如何使用 REST 只更新部分资源 例如状态指示器 的问题 选项似乎是 抱怨 HTTP 没有 PATCH 或 MODIFY 命令 然而 接受的答案REST 的 HTTP MODIFY 动词 https stackoverflo
  • 获取当前行的长度

    我正在尝试在状态行中添加一个指示符来显示行的总长度 不仅仅是光标列位置 可以用 c 我该怎么做呢 要将一行内容作为字符串获取 请使用getline
  • 抓取无限滚动页面停止而不滚动

    我目前正在使用 PhantomJS 和 CasperJS 来抓取网站中的链接 该网站使用 JavaScript 动态加载结果 然而 下面的代码片段并没有让我获得页面包含的所有结果 我需要的是向下滚动到页面底部 查看微调器是否显示 意味着还有