如何使用 Phantomjs 向下滚动加载动态内容

2023-11-24

我试图从当用户向下滚动到底部(无限滚动)时动态生成内容的页面中抓取链接。我尝试过使用 Phantomjs 做不同的事情,但无法收集首页之外的链接。假设加载内容的底部元素有类.has-more-items。它一直可用,直到滚动时加载最终内容,然后在 DOM 中变得不可用(display:none)。这是我尝试过的事情-

  • 之后立即将 viewportSize 设置为较大的高度var page = require('webpage').create();

page.viewportSize = { 宽度:1600,高度:10000, };

  • Using page.scrollPosition = { top: 10000, left: 0 } inside page.open但没有效果,如-
page.open('http://example.com/?q=houston', function(status) {
   if (status == "success") {
      page.scrollPosition = { top: 10000, left: 0 };  
   }
});
  • 也尝试把它放进去page.evaluate函数但这给出了

参考错误:找不到变量页面

  • 尝试在里面使用 jQuery 和 JS 代码page.evaluate and page.open但无济于事——

$("html, body").animate({scrollTop: $(document).height() }, 10, 功能() { //console.log('检查执行情况'); });

照原样,也在里面document.ready。同样对于 JS 代码 -

window.scrollBy(0,10000)

照原样,也在里面window.onload

我真的被它困扰了两天,但找不到方法。任何帮助或提示将不胜感激。

Update

我在以下位置找到了一段有用的代码https://groups.google.com/forum/?fromgroups=#!topic/phantomjs/8LrWRW8ZrA0

var hitRockBottom = false; while (!hitRockBottom) {
    // Scroll the page (not sure if this is the best way to do so...)
    page.scrollPosition = { top: page.scrollPosition + 1000, left: 0 };

    // Check if we've hit the bottom
    hitRockBottom = page.evaluate(function() {
        return document.querySelector(".has-more-items") === null;
    }); }

Where .has-more-items是我想要访问的元素类,它最初在页面底部可用,当我们向下滚动时,它会进一步向下移动,直到加载所有数据然后变得不可用。

然而,当我测试时,很明显它正在进入无限循环而无需向下滚动(我渲染图片进行检查)。我尝试过更换page.scrollPosition = { top: page.scrollPosition + 1000, left: 0 };也包含下面的代码(一次一个)

window.document.body.scrollTop = '1000';
location.href = ".has-more-items";
page.scrollPosition = { top: page.scrollPosition + 1000, left: 0 };
document.location.href=".has-more-items";

但似乎没有任何作用。


找到了一种方法并尝试适应您的情况。我没有测试查找页面底部的最佳方法,因为我有不同的上下文,但请检查下面的解决方案。这里的问题是你必须等待一段时间才能加载页面,并且 javascript 是异步工作的,所以你必须使用setInterval or setTimeout (see) 为了达成这个。

page.open('http://example.com/?q=houston', function () {

  // Check for the bottom div and scroll down from time to time
  window.setInterval(function() {
      // Check if there is a div with class=".has-more-items" 
      // (not sure if there's a better way of doing this)
      var count = page.content.match(/class=".has-more-items"/g);

      if(count === null) { // Didn't find
        page.evaluate(function() {
          // Scroll to the bottom of page
          window.document.body.scrollTop = document.body.scrollHeight;
        });
      }
      else { // Found
        // Do what you want
        ...
        phantom.exit();
      }
  }, 500); // Number of milliseconds to wait between scrolls

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

如何使用 Phantomjs 向下滚动加载动态内容 的相关文章

随机推荐

  • 如何在 mac os x yosemite (10.10) 上安装 mcrypt 扩展

    我已将 Mac OS X 更新到 Yosemite 但这样做会覆盖我的所有开发环境 所以现在 要在本地 apache 上运行 Laravel 4 我需要安装 Mcrypt 扩展 但我尝试的一切都失败了 即使是在 OS X Mavericks
  • Android 蓝牙 VS 低功耗蓝牙

    我正在尝试创建一个应用程序 只要智能手机正在运行 就需要交换少量数据 只是为了通知设备足够接近 据我了解 传统的蓝牙会消耗大量电池 因此打开几个小时是不可行的 我正在考虑 BLE 但仍然担心电池容量 Q0 是否可以在手机运行时就开启BLE
  • JQuery DatePicker 背景颜色

    我正在使用 JQuery DatePicker 的示例链接文本 在我的 asp net 页面上 但是 日期选择器的背景颜色是白色 我不知道如何改变这个 更改为默认颜色 我的asp net页面背景页面是白色的 可能是这个原因 任何帮助将不胜感
  • 如何在模板中迭代 Django CHOICES - 不使用表单或模型实例

    我目前使用选项来定义月份列表和星期几列表 我想在我的模板中显示这些选择列表 而不必与特定实例或表单相关 例如 在我的模型中 MONTH CHOICES 01 January 02 February 03 March etc DAY CHOI
  • file_get_contents() 与使用 http/1.1 的上下文显着降低下载速度

    使用每个图像下载下面的代码 file get contents 平均需要 8 15 秒 如果我不在 file get contents 上使用上下文 则图像下载时间不到一秒 如果我将 opts 更改为 下面 我将获得与 file get c
  • 如何 - 单个 MongoDB 上的多个 Meteor 应用程序 - 相同的集合?

    以前有人问过这样的问题 如何在 Meteor 应用程序之间共享 MongoDB 集合 然而 答案并不清楚 我需要将 Meteor 公共应用程序和管理应用程序分开 出于多种原因 但主要是安全性和代码管理 使用接受的答案 export MONG
  • 有没有办法将进程的当前WorkingSet扩展到1GB? [复制]

    这个问题在这里已经有答案了 可能的重复 在C 中 有没有办法强制进程的WorkingSet为1GB 我们希望提前将 NET 进程的工作集增加到 1GB 以避免页面错误 有没有办法在 NET 中做到这一点 Update 不幸的是 即使我们打电
  • 如何删除babel添加的全局“use strict”

    我正在使用 use strict 的函数形式 并且不想要 Babel 在转译后添加的全局形式 问题是我正在使用一些不使用 use strict 模式的库 并且在连接脚本后可能会抛出错误 正如 Babel 6 中已经提到的 它是transfo
  • 如何在 Kubernetes 中设置自定义 HTTP 错误

    我想创建一个自定义 403 错误页面 目前我已经创建了一个 Ingress 并且在注释中我有这样的内容 nginx ingress kubernetes io whitelist source range 100 01 128 0 20 8
  • 带有缺失值的 dplyr 交叉表

    我想在 R 中使用dplyr 我有充分的理由不只使用底座table 命令 table mtcars cyl mtcars gear 3 4 5 4 1 8 2 6 2 4 1 8 12 0 2 library dplyr library t
  • 禁用其他网站的 iframe 嵌入

    我想禁用从我的网站到其他网站的 iframe 嵌入页面 我做了这个js 脚本有效 但我有 page01 php 和 page02 php 我想在 page01 php 源代码中插入 page02 php 的 iframe 当我这样做时 我被
  • 使用嵌套自定义对象进行 NSCoding?

    我有一系列嵌套对象 我需要将它们通过 NSCoding 协议 以便我可以将顶级对象保存到 NSUserDefaults 中 这是对象的结构 导师 班 NSMutableArray 保存 的实例 类 类 NSMutableArray 保存 的
  • 覆盖溢出:用 z-index 隐藏

    我正在使用 coda bubble jquery 插件 我需要让我的气泡在溢出隐藏 div 中弹出 这是我的示例代码
  • jQuery jqGrid 当编辑行完成时显示消息

    我在这里关注本教程http www trirand com blog jqgrid jqgrid html在 实时数据操作 gt 编辑行 我的网格从脚本接收数据a php 之后用户可以通过jqGrid修改这个数据 jqGrid修改数据后会将
  • 如果从函数返回,局部变量的成员子对象也会被移动吗?

    C 11 标准规定 如果满足复制省略的条件 12 8 31 实施应处理returned 局部左值变量和函数参数 首先作为右值 移动 如果重载解析未按详细说明成功 则应将其视为左值 复制 12 8 class copy p32 当满足或将满足
  • 在 R 中将列表转换为数据帧

    所以我有一个清单 说 L1 lt list 1 10 5 14 10 19 现在我试图将列表的输出作为数据帧 以便我的输出看起来 1 1 2 3 4 5 6 7 8 9 10 2 5 6 7 8 9 10 11 12 13 14 3 10
  • 什么是“跨度”以及何时应该使用“跨度”?

    最近我收到了使用建议span
  • php str_getcsv 数组问题

    我正在上传 csv 文件 然后使用 str getcsv 解析它 一切都很好 只是我需要一种方法来循环它们 理想情况下 如果数组返回并看起来像这样 那就太好了 Array 1 gt Array 0 gt 1 first id in csv
  • C 宏:将数字转换为字符串

    我有一个表 定义 5x7 点显示屏上的符号外观 就像是 extern UINT8 symbols 5 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x5F 0x0 0x0 0x0 0x7 0x0 0x7 0x0 0x14 0x7
  • 如何使用 Phantomjs 向下滚动加载动态内容

    我试图从当用户向下滚动到底部 无限滚动 时动态生成内容的页面中抓取链接 我尝试过使用 Phantomjs 做不同的事情 但无法收集首页之外的链接 假设加载内容的底部元素有类 has more items 它一直可用 直到滚动时加载最终内容