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

使用Puppeteer JS分页抓取网页数据时list未定义报错如何解决

问题成因
  • Puppeteer 中 page.evaluate() 内的代码运行在浏览器独立沙箱上下文,和你的 Node.js 脚本上下文完全隔离,两者作用域不互通
  • 你在 Node.js 层声明的 list 变量在浏览器上下文不存在,执行list.push()自然会抛出未定义报错
  • 额外隐性问题:你在page.evaluate()内对外层nextButton的赋值也是无效的,浏览器上下文的变量无法直接同步到 Node.js 层,后续分页判断逻辑也会失效
修复方案

调整逻辑,将浏览器侧需要返回的当前页表格数据、下一页跳转地址作为page.evaluate()的返回值传递到 Node.js 层,在 Node.js 侧完成数据存储、分页判断、页面跳转的逻辑。修正后的代码如下:

const puppeteer = require('puppeteer');
const fs = require('fs');
(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto(`https://data.anbima.com.br/debentures/AGRU12/agenda`);
  await page.waitForSelector('.normal-text');
  const list = [];
  while (true) {
    // 从浏览器上下文返回所需数据到Node层
    const { pageData, nextHref } = await page.evaluate(() => {
      const nodeList = document.querySelectorAll('.anbima-ui-table > tbody > tr');
      const nodeArray = [...nodeList];
      const nextButton = document.querySelector('.anbima-ui-pagination__next-button');

      const pageData = nodeArray
        .map(tbody => [...tbody.children].map(td => [...td.children]))
        .map(tr => tr.map(span => 
          span[0].innerHTML
            .replace('<label class="flag__children">', '')
            .replace('</label>', '')
        ));
      return {
        pageData,
        nextHref: nextButton ? nextButton.href : null
      };
    });

    // Node层处理数据存储
    list.push(...pageData);

    // 分页判断
    if (!nextHref) break;
    await page.goto(nextHref);
    // 跳转后等待表格加载完成再执行下一轮爬取
    await page.waitForSelector('.anbima-ui-table > tbody > tr');
  }

  // 写入全量聚合数据
  fs.writeFile('eventDates.json', JSON.stringify(list, null, 2), err => {
    if (err) throw new Error('Something went wrong');
    console.log('well done you got the dates');
  });
  await browser.close();
})();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 03:27:02