如何在滚动木偶时获取元素

时间:2019-08-11 19:59:28

标签: node.js 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函数将获取spesific div中的所有链接,如果它们尚不存在,则将它们添加到数据库中,但是从SetInterval调用函数似乎不起作用

在滚动页面时,如何包括我的伪造者异步功能?

1 个答案:

答案 0 :(得分:0)

  

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

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

由于getUsers与数据库一起使用,因此只能在node.js上使用,而不能在page.evaluate中使用,因此您应该重写抓取代码。

我建议先将userdata放入page.evaluate中,只有在页面不再滚动后,才将数据返回到主上下文,然后保存到数据库中。


如果您需要specifically subscribe to it查看控制台消息,则不会显示console.log中的

page.evaluate