【问题标题】:sHow to fetch elements while scrolling puppeteers如何在滚动 puppeteer 时获取元素
【发布时间】:2019-08-13 15:13:45
【问题描述】:

我正在尝试滚动自动加载页面,在此过程中我想获取出现(和消失的元素)。

我的代码看起来像这样,滚动效果很好,但我无法让我的 puppeteer 代码工作以检测元素并保存它们的值(代码确实在滚动功能之外工作)

async function autoScroll(page) {
    await page.evaluate(async () => {
        await new Promise((resolve, reject) => {
            let totalHeight = 0;
            let distance = 100;
            let timer = setInterval(async () => {
                let scrollHeight = document.body.scrollHeight;
                window.scrollBy(0, distance);
                totalHeight += distance;
                console.log("scrolling"); // That one never shows up 
                await getUsers(); // Trying to fetch elements on every scroll
                if (totalHeight >= scrollHeight) {
                    clearInterval(timer);
                    resolve();
                }
            }, 100);
        });
    });
}


async function getUsers() {
    let hrefs = await page.$$('div > a');
    for (let i = 0; i < hrefs.length; i = i++) { adding each link to database }

-- 我想要实现的是,每次滚动到页面底部时,getUsers 函数都会获取特定 div 中的所有链接,如果它们不存在,则将它们添加到数据库中但是从 SetInterval 调用函数似乎不起作用

如何在滚动页面时包含我的 puppeteer 异步功能?

【问题讨论】:

    标签: node.js puppeteer


    【解决方案1】:

    代码确实在滚动功能之外工作

    getUsers 函数是在 node.js 主脚本中定义的,但在 autoScroll 中它是在 page.evaluate 函数内部使用的,page.evaluate 内部的代码在浏览器上下文中运行(就像我们运行它在 DevTools 控制台中)没有getUsers 函数。

    由于getUsers 与数据库一起工作,它只能在node.js 端工作,而不是page.evaluate,你应该重写抓取代码。

    我建议首先在 page.evaluate 中获取 userdata,并且仅在页面不再滚动后将数据返回到主上下文,然后保存到数据库中。


    不显示来自page.evaluateconsole.log,因为您需要specifically subscribe to it 才能查看控制台消息。

    【讨论】:

    • 我尝试过这样声明:async function autoScroll(page) { await page.evaluate(async () => { async function getUsers() { // some code} await new Promise ((resolve, reject) => { The promise code + call for getUsers() } } ,但它似乎不起作用:/它是如何做到的?
    • 这取决于 getUsers 的作用,你能在问题中添加它的示例代码吗?
    • 好的,改了答案。请注意,这个问题不是关于如何更改代码,而是关于为什么它一开始就不起作用。但是,如果您愿意,您可以随时打开另一个。
    • 你是对的!多亏了你,我已经弄清楚了:)
    猜你喜欢
    • 2021-01-19
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 2019-10-15
    • 2020-11-19
    • 1970-01-01
    • 1970-01-01
    • 2019-04-17
    相关资源
    最近更新 更多