Puppeteer:从使用延迟加载的页面中抓取整个 html

2024-03-29

我正在尝试获取使用延迟加载的网页上的整个 html。我尝试过的是一直滚动到底部,然后使用 page.content()。我还尝试在滚动到底部后滚动回页面顶部,然后使用 page.content()。两种方法都会抓取表格的一些行,但不是全部,这是我的主要目标。我相信该网页使用了react.js 的延迟加载。

const puppeteer = require('puppeteer');
const url = 'https://www.torontopearson.com/en/departures';
const fs = require('fs');

puppeteer.launch().then(async browser => {
    const page = await browser.newPage();
    await page.goto(url);
    await page.waitFor(300);

    //scroll to bottom
    await autoScroll(page);
    await page.waitFor(2500);

    //scroll to top of page
    await page.evaluate(() => window.scrollTo(0, 50));

    let html = await page.content();

    await fs.writeFile('scrape.html', html, function(err){
        if (err) throw err;
        console.log("Successfully Written to File.");
    });
    await browser.close();
});

//method used to scroll to bottom, referenced from user visualxcode on https://github.com/GoogleChrome/puppeteer/issues/305
async function autoScroll(page){ 
    await page.evaluate(async () => {
        await new Promise((resolve, reject) => {
            var totalHeight = 0;
            var distance = 300;
            var timer = setInterval(() => {
                var scrollHeight = document.body.scrollHeight;
                window.scrollBy(0, distance);
                totalHeight += distance;

                if(totalHeight >= scrollHeight){
                    clearInterval(timer);
                    resolve();
                }
            }, 100);
        });
    });
}

我在这方面不太擅长,但经过长时间的搜索后,我发现一种解决方案可以为我的要求提供良好的结果。这是我用来处理延迟加载场景的代码片段。

const bodyHandle = await page.$('body');
const { height } = await bodyHandle.boundingBox();
await bodyHandle.dispose();
console.log('Handling viewport...')
const viewportHeight = page.viewport().height;
let viewportIncr = 0;
while (viewportIncr + viewportHeight < height) {
await page.evaluate(_viewportHeight => {
window.scrollBy(0, _viewportHeight);
}, viewportHeight);
await wait(30);
viewportIncr = viewportIncr + viewportHeight;
}
console.log('Handling Scroll operations')
await page.evaluate(_ => {
window.scrollTo(0, 0);
});
await wait(100);  
await page.screenshot({path: 'GoogleHome.jpg', fullPage: true});

由此我什至可以截取长截图。希望对你有帮助。

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

Puppeteer:从使用延迟加载的页面中抓取整个 html 的相关文章

随机推荐

  • 如何将之前的时间戳保存到 Firebase FireStore

    我想将旧数据从不同系统迁移到 firestore 下面的命令保存当前时间戳 firebase firestore FieldValue serverTimestamp 我想存储旧的值 有什么办法可用吗 firebase firestore
  • LSH 是将向量转换为汉明距离的二进制向量吗?

    我读了一些关于 LSH 的论文 我知道它用于解决近似 k NN 问题 我们可以将算法分为两部分 给定一个向量D尺寸 其中D是大 的任何值 用一组翻译它N where N lt
  • 具有相同范围和离线 access_type 的第二次授权具有意外的权限对话框

    如果我在身份验证 URL 中指定 access type offline 并且用户尝试第二次身份验证 我会收到一个框 显示正在请求离线访问 我本以为它已经被授权 所以不需要额外的权限 有任何想法吗 Edit 更多信息 第一次它没有提到用户需
  • 如何在等高线图上绘制具有条件的数组?

    我使用下面的代码绘制了 GPP 的全球地图 lon 和 lat 都是 netCDF4 属性 形状分别为 144 和 90 而 gpp avg 是一个 numpy 数组 形状为 90 144 import numpy as np import
  • 如何:使用 maven2 进行数据库版本控制?

    我正在寻找任何用于版本控制数据库更改的 Maven 插件 有一些插件为此任务提供一些支持 Maven LiquiBase 插件 http www liquibase org manual maven Maven 数据库迁移插件 http c
  • .Rmd 文件打开时完全是空的

    在 RStudio 3 3 2 中打开 rmd 文件时 它们显示为完全空的 如果我使用记事本打开或在另一台计算机上打开 则会有文本 到底是怎么回事 有问题的 RMD 文件 https drive google com open id 0B
  • iOS - 恢复自动续订订阅

    我正在实施自动更新订阅 我有以下问题 订阅内容过期后 用户还能恢复吗 如果是这样 我如何验证它们并让它们下载 Look at 恢复自动续订订阅 https developer apple com library ios documentat
  • 模板类中的模板函数

    我有这个代码 template
  • 继续断言测试用例

    上次我使用 testcafe 时 我意识到这个伟大框架中缺少我的功能 该功能类似于 尽管出现了断言 但仍继续执行特定测试的其余部分 更准确地说 我描述了我缺少此类功能的原因 假设您正在测试 Web 应用程序 例如要在其中输入合同日期的 We
  • 正则表达式 - 时间验证 ((h)h:mm)

    d 1 2 0 5 0 9 是我所拥有的 这将分钟限制为 00 59 然而 它并不将时间限制在 0 到 12 之间 为了相似性和统一性 如果可能的话 我想单独使用 RegEx 来完成此操作 此外 我希望第一个数字是可选的 即接受 09 30
  • 如何在单独的dll项目中配置WCF

    我正在开发一个 Web 应用程序 ASP NET 3 5 它将使用许多 Web 服务 我为每个 Web 服务创建了一个单独的 dll 项目 这些项目包含服务引用和客户端代码 但是 调用网站必须具有
  • 检查字符串是否包含日文/中文字符

    我需要一种方法来检查字符串是否包含Japanese or Chinese text 目前我正在使用这个 string match u3400 u9FBF 但它不适用于以下示例 or 你能帮我吗 Thanks 通常用于中文和日文文本的 Uni
  • redirect_uri 的参数值无效

    当我尝试通过网络在 Google Plus 中验证我的应用程序时 出现错误 错误 无效 请求 redirect uri 的参数值无效 缺少权限 MY APP oauth2callback 我按照说明做了一切 https developers
  • 如何 git svn 仅获取具有特定模式的分支/标签?

    我想使用 git svn 查看 Boost 库 并且只想查看从版本 1 35 开始的主干和标签 即 tags release Boost 1 35 及更高版本 我的配置如下 svn remote svn ignore paths tags
  • MonoTouch.Dialog:UISearchBar 颜色

    在 3 月 31 日发布的 MonoTouch Dialog 中 我们无法设置UISearchBar现在不再这样了 因为有一个带有硬编码颜色的新容器对象 有没有更简单的方法来改变颜色UISearchBar 作为解决方法 我使用它 知道 UI
  • 无法更改样式:使用 getelementsbyclassname 显示

    document getElementByClassName xyz style display none 我无法隐藏课程内容 document getElementsByClassName返回一个类似数组的对象 您可以为此使用以下脚本 d
  • 如何减少Flutter的build_runner构建时间

    我的项目变得非常大 每次运行 build runner 都会花费太多时间来构建 我减少构建时间的想法是仅构建实际需要构建的文件 这些文件是我当前功能目录的文件 有没有办法只为单个文件夹或单个文件运行 build runner 您可以在 bu
  • Android 中的语音通话录音应用

    我想做一个录音通话的应用程序 可以吗 我期待 Android 领域经验丰富的人提供一些适当的指导 我在android中看到了android media MediaRecorder类 我需要使用那个类吗 感谢致敬 帕瓦蒂 卡玛隆 抱歉 开发人
  • 右值到左值转换 Visual Studio

    在 Visual Studio 2012RC 中存在一些非标准扩展 例如这段代码编译 include
  • Puppeteer:从使用延迟加载的页面中抓取整个 html

    我正在尝试获取使用延迟加载的网页上的整个 html 我尝试过的是一直滚动到底部 然后使用 page content 我还尝试在滚动到底部后滚动回页面顶部 然后使用 page content 两种方法都会抓取表格的一些行 但不是全部 这是我的