You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Puppeteer爬取动态网页时如何正确返回HTML值?

问题分析与解决:dynamicScraper返回[Function]而非HTML字符串

嘿,我一眼就揪出问题根源了——你在dynamicScraper里处理page.content的时候犯了个小疏忽:page.content是Puppeteer的异步方法,不是直接读取的属性,你现在返回的是这个方法本身,所以日志里才会输出[Function],而非预期的HTML字符串。

具体错误点

你的dynamicScraper函数里,这一行是核心问题:

.then(() => {return page.content});

这里的page.content没有加括号调用,返回的只是函数引用,不是执行后得到的HTML内容。

修正方案

方案1:修正原Promise链

只需要给page.content加上括号,同时因为它是异步方法,要确保等待其执行完成:

dynamicScraper: function() {
  return puppeteer
    .launch()
    .then(browser => {
      return browser.newPage();
    })
    .then(page => {
      return page.goto(url2)
        .then(() => page.content()); // 加上括号调用异步方法
    })
    .then(html => {
      console.log(html);
      return html;
    })
    .catch(err => console.log(err));
}

方案2:改用async/await(更推荐,可读性更强)

Promise链嵌套多了容易混乱,换成async/await写法会清晰很多,同时别忘了关闭浏览器实例(避免残留后台进程):

dynamicScraper: async function() {
  try {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto(url2);
    // 可选:等待页面关键元素加载完成,确保拿到完整HTML
    // await page.waitForSelector('div#siteTable');
    const html = await page.content(); // 正确调用异步方法
    await browser.close(); // 记得关闭浏览器释放资源
    console.log(html);
    return html;
  } catch (err) {
    console.log(err);
    throw err; // 抛出错误让上层catch捕获处理
  }
}

额外注意事项

  • 关闭浏览器实例:如果不调用browser.close(),Puppeteer启动的Chrome进程会一直留在后台,长期运行会占用大量系统资源。
  • 页面加载完整性:部分动态页面需要等待元素渲染完成,建议加上page.waitForSelector()或page.waitForNavigation(),避免拿到不完整的页面内容。
  • 错误传递:在async/await写法里抛出错误,能让server.js里的.catch块捕获到问题,方便后续排查。

内容的提问来源于stack exchange,提问作者Kaleidics

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:50:17