使用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
相关产品推荐
相关产品推荐

