我用来刮学生名单的代码:
let collection1 = await page.$$('div.layout-2DM8Md')
console.log("Student Online:")
for (let el of collection1) {
let name = await el.$eval(('div.name-uJV0GL'), node => node.innerText.trim());
console.log(name)
}
发布于 2020-04-12 11:24:17
这可能是因为其他元素的内容是用一个Javascript框架(如React或Vue )动态加载的。这意味着只有当这些元素进入浏览器的视口时才会加载。
要解决这个问题,您需要编写一个自动滚动页面的函数,以便这些元素能够进入视区,然后在收集数据之前等待该函数完成。
滚动功能:
const autoScroll = async(page) => {
await page.evaluate(async () => {
await new Promise((resolve, reject) => {
var totalHeight = 0;
var distance = 100;
var timer = setInterval(() => {
var scrollHeight = document.body.scrollHeight;
window.scrollBy(0, distance);
totalHeight += distance;
if(totalHeight >= scrollHeight){
clearInterval(timer);
resolve();
}
}, 30);
});
});
}
然后调用这个函数,在 page.goto()
之后调用,在之前调用,然后使用page.content()
获取内容。我还设置了视口宽度和高度,然后滚动速度会更快一些:
await page.goto(url, {waitUntil: 'load'});
await page.setViewport({
width: 1200,
height: 800
});
await autoScroll(page); // The scroll function
const html = await page.content()
https://stackoverflow.com/questions/61176809
复制相似问题