无限滚动完成后获取帖子标题

时间:2018-10-28 04:01:00

标签: puppeteer

我设法在站点上显示所有帖子,该站点上有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();

1 个答案:

答案 0 :(得分:1)

有多种方法,最好的方法是将以下两种不同的方法结合起来。

寻找Ajax

等待请求。每当您单击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并等待新元素

请参阅以下答案herehere

基本上,您可以删除收集的dom元素,因此下次收集更多数据时,将不会有任何重复。

因此,一旦删除了所有当前元素,如document.querySelectorAll('.jeg_post'),以后就可以根据需要简单地再做一个page.waitFor('.jeg_post')