Node.js 是否有任何方法可以等待动态内容添加到页面之后。在Puppeter中单击()

Node.js 是否有任何方法可以等待动态内容添加到页面之后。在Puppeter中单击(),node.js,puppeteer,cheerio,Node.js,Puppeteer,Cheerio,我一直在写一个代码刮网站。 该网站是动态的,因此当我单击“显示更多”按钮时,它会加载用户拥有的其他徽章。因此,有没有一种方法可以让我单击该按钮,然后等待添加新内容,然后再将标记加载到cheerio中进行抓取 目前我只是让broswer等待3秒再重新单击,但这会使整个过程花费大量时间,如果浏览器无法在该时间内获取,也可能会失败 那么,除了这一点,还有其他选择吗? 请在下面找到我的代码--> 下面的代码适用于您的要求。我让它在进入while循环之前点击[first_button]的原因是第一个“sh

我一直在写一个代码刮网站。 该网站是动态的,因此当我单击“显示更多”按钮时,它会加载用户拥有的其他徽章。因此,有没有一种方法可以让我单击该按钮,然后等待添加新内容,然后再将标记加载到cheerio中进行抓取

目前我只是让broswer等待3秒再重新单击,但这会使整个过程花费大量时间,如果浏览器无法在该时间内获取,也可能会失败

那么,除了这一点,还有其他选择吗? 请在下面找到我的代码-->


下面的代码适用于您的要求。我让它在进入while循环之前点击[first_button]的原因是第一个“show more”按钮实际上并没有发出网络请求

const go = async () => {
  const browser = await puppeteer.launch({
    headless: false,
    args: [
      "--no-sandbox",
      "--disable-setuid-sandbox",
      "--window-size=1600,1200"
    ],
    defaultViewport: null
  });
  const context = await browser.createIncognitoBrowserContext();
  const page = await context.newPage();
  try {
    await page.goto("https://trailblazer.me/id/akganesa", {
      waitUntil: "networkidle2"
    });
    const [first_button] = await page.$x("//button[contains(., 'Show More')]");
    await first_button.click();
    while (
      (await (await page.$x("//button[contains(., 'Show More')]")).length) > 0
    ) {
      const [button] = await page.$x("//button[contains(., 'Show More')]");
      await button.click();
      await page.waitForResponse(response => response.status() === 200);
    }
    browser.close();
    return;
  } catch (err) {
    console.log(err);
    browser.close();
    return;
  }
};

go();

单击按钮是否生成网络请求?如果是,尝试使用waitForSelector吗?@hardkoded和mbit是的,我尝试过。我还尝试了waitForNavigation,但两者都返回了超时错误。1-->我已更新了上述代码以匹配您提供的答案,但此代码仅在再次显示后返回html。2-->您的答案可以正常工作,但不会返回页面内容。在所有加载完成后,我需要它继续执行所需任务。因此,您能帮我修复其中一个解决方案吗?NVM我找到了解决方案,但是,请务必让我知道如何从您的代码中返回page.content,因为我没有这样做。@Maverick
const html=wait page.content()
在browser.close()之前,然后将
html
传递到您的cheerio函数中。如果要从函数返回html,请确保获取html并对其执行操作的函数标记为async,并在对其执行任何操作之前等待函数的结果。
const go = async () => {
  const browser = await puppeteer.launch({
    headless: false,
    args: [
      "--no-sandbox",
      "--disable-setuid-sandbox",
      "--window-size=1600,1200"
    ],
    defaultViewport: null
  });
  const context = await browser.createIncognitoBrowserContext();
  const page = await context.newPage();
  try {
    await page.goto("https://trailblazer.me/id/akganesa", {
      waitUntil: "networkidle2"
    });
    const [first_button] = await page.$x("//button[contains(., 'Show More')]");
    await first_button.click();
    while (
      (await (await page.$x("//button[contains(., 'Show More')]")).length) > 0
    ) {
      const [button] = await page.$x("//button[contains(., 'Show More')]");
      await button.click();
      await page.waitForResponse(response => response.status() === 200);
    }
    browser.close();
    return;
  } catch (err) {
    console.log(err);
    browser.close();
    return;
  }
};

go();