Javascript 木偶演员无限滚动

Javascript 木偶演员无限滚动,javascript,node.js,puppeteer,Javascript,Node.js,Puppeteer,我有一个网站需要清理,我需要清理的是一个div中的内容,该div有一个id左\u容器\u滚动条,其中包含多个a标签。这个div有一个无限长的卷轴,我不能让它工作。我正在尝试使程序在该分区中滚动 我尝试过这样做,但我得到一个错误:评估失败:ReferenceError:elem未定义 htmlTag = '#left_container_scroll'; //I think I am doing something wrong here let elem = await page.evaluat

我有一个网站需要清理,我需要清理的是一个div中的内容,该div有一个id左\u容器\u滚动条,其中包含多个a标签。这个div有一个无限长的卷轴,我不能让它工作。我正在尝试使程序在该分区中滚动

我尝试过这样做,但我得到一个错误:评估失败:ReferenceError:elem未定义

htmlTag = '#left_container_scroll';

//I think I am doing something wrong here
let elem = await page.evaluate((htmlTag)=> {
    return document.querySelector(htmlTag);
})

previousHeight =  await page.evaluate("elem.scrollHeight");
await page.evaluate("window.scrollTo(0,elem.scrollHeight)");
await page.waitForFunction(`elem.scrollHeight > ${previousHeight}`);

有些JavaScript代码在浏览器中运行,有些在Node.js运行时中运行,它们无法看到彼此的变量

例如,
page.evaluate(“elem.scrollheight”)
无法看到您在上面设置的
elem
变量,因为该变量位于Node.js运行时内,而代码
elem.scrollheight
正在浏览器内运行(之前的
htmlTag
也存在类似问题)。
要将值从Node.js传递到浏览器,通常需要为
page.evaluate
提供附加参数

类似的东西可能会起作用(尚未测试滚动是否按预期工作,但至少Puppeter会运行代码)


我会考虑你想要拉的元素,我假设使用无限滚动你想要得到更多的元素。我会设置一个你想要拉的元素的基本计数器,然后有一个循环来检查前一个元素的计数是否等于新元素的计数,这样,你可以打破循环,然后提取你想要的数据。在我的例子中,我会设置元素限制的另一个检查,例如100,不管循环是否完成,它都会中断循环。您可能还想考虑在1-5SEC之间有随机超时,这至少会给您的页面加载时间,记住并非所有的页面都是均等的,而且网络连接也是一个问题。p> 上次我在网上拉屎时做了一个非常简单的解决方案,希望它能帮上忙

let lastHeight = await page.evaluate('document.body.scrollHeight');

while (true) {
    await page.evaluate('window.scrollTo(0, document.body.scrollHeight)');
    await page.waitForTimeout(2000); // sleep a bit
    let newHeight = await page.evaluate('document.body.scrollHeight');
    if (newHeight === lastHeight) {
        break;
    }
    lastHeight = newHeight;
}

它仍然给我这个错误:TimeoutError:waiting for function failed:timeout 30000ms exceeddoops,它看起来像是
waitForFunction
需要一个额外的
options
参数,所以它应该是
page.waitForFunction((e,ph)=>e.scrollHeight>ph,{},elem,previousHeight)
(上面也修复了)。你知道页面上的“无限滚动”代码正在按预期工作?调试的一种方法是将`{headless:false}`添加到
puppeter.launch
(这样您可以看到发生了什么,并看到开发工具控制台),然后在等待函数中记录一些内容,如
wait page.waitForFunction((e,ph)=>{console.log(“当前scrollHeight:,e.scrollHeight,“previousHeight:,ph);返回e.scrollHeight>ph;},{},elem,previousHeight)
。无限滚动不起作用,它只需要与页面一起加载的数据,它不会向下滚动以加载新数据……很难准确地说出发生了什么,但我们想到的一种可能性是,我们对
窗口的调用。滚动到
发生在页面上的无限滚动代码启动之前lly为
scroll
事件添加了事件监听器。我想您可以通过将
window.scrollTo(document.body.scrollHeight)
添加到
waitForFunction
部分来测试这一点(因此它被puppeter反复调用)
let lastHeight = await page.evaluate('document.body.scrollHeight');

while (true) {
    await page.evaluate('window.scrollTo(0, document.body.scrollHeight)');
    await page.waitForTimeout(2000); // sleep a bit
    let newHeight = await page.evaluate('document.body.scrollHeight');
    if (newHeight === lastHeight) {
        break;
    }
    lastHeight = newHeight;
}