我设法在站点上显示所有帖子,该站点上有load_more按钮可以转到下一页,但是缺少某些内容,
我遇到了错误
e Error: Node is either not visible or not an HTMLElement
at ElementHandle._clickablePoint (/Users/minghann/Documents/productnation_scraper/node_modules/puppeteer/lib/ExecutionContext.js:331:13)
at <anonymous>
at process._tickCallback (internal/process/next_tick.js:188:7)
如果我不加载所有帖子,则不会发生。很难调试,因为我不知道哪个帖子缺少什么。完整代码如下:
const browser = await puppeteer.launch({
devtools: true
});
const page = await browser.newPage();
await page.goto("https://example.net");
await page.waitForSelector(".load_more_btn");
const load_more_exist = !!(await page.$(".load_more_btn"));
while (load_more_exist > 0) {
await page.click(".load_more_btn");
}
const posts = await page.$$(".post");
let result = [];
for (const post of posts) {
result = [
...result,
{
title: await post.$eval(".post_title a", e => e.innerText)
}
];
}
console.log(result);
browser.close();
答案 0 :(得分:1)
有多种方法,最好的方法是将以下两种不同的方法结合起来。
等待请求。每当您单击Load More时,它将对?ajax-request=jnews
进行简单的ajax请求。对于此用例,我们可以使用.waitForRequest或.waitForResponse。这是一个工作示例,
await Promise.all([
page.waitForRequest(response => response.url().includes('?ajax-request=jnews') && response.status() === 200),
page.click(".load_more_btn")
])
基本上,您可以删除收集的dom元素,因此下次收集更多数据时,将不会有任何重复。
因此,一旦删除了所有当前元素,如document.querySelectorAll('.jeg_post')
,以后就可以根据需要简单地再做一个page.waitFor('.jeg_post')
。