本文详解 puppeteer 爬虫中将结构化表格数据写入本地 json 文件的关键步骤,重点解决因未序列化导致文件内容为空或报错的问题,并提供完整可运行代码与注意事项。
本文详解 puppeteer 爬虫中将结构化表格数据写入本地 json 文件的关键步骤,重点解决因未序列化导致文件内容为空或报错的问题,并提供完整可运行代码与注意事项。
在使用 Puppeteer 进行网页数据抓取时,常会遇到 console.log(JSON.stringify(data)) 能正常输出,但 fs.writeFile() 却无法生成有效 JSON 文件的情况。根本原因在于:Node.js 的 fs.writeFile()(及异步写入方法)仅接受字符串或 Buffer 类型作为数据参数,而 data 是一个 JavaScript 对象数组,必须先通过 JSON.stringify() 序列化为字符串才能写入磁盘。
你当前代码中的这一行:
fs.writeFile('data.json', data);
会导致 Node.js 尝试将对象直接转换为字符串(等价于 data.toString()),结果通常是 [object Object] 或抛出 TypeError: Converting circular structure to JSON 错误(尤其当数据含 DOM 元素引用时)。正确做法是显式序列化:
✅ 推荐使用同步写入(开发调试更直观、避免竞态):
fs.writeFileSync('data.json', JSON.stringify(data, null, 2));
✅ 若需异步写入(适合生产环境或大文件),请正确处理 Promise 和错误:
await fs.promises.writeFile('data.json', JSON.stringify(data, null, 2));
? JSON.stringify(data, null, 2) 中的 null, 2 参数用于美化输出(添加缩进),提升 JSON 可读性;生产环境可省略以减小体积。
此外,还需注意以下关键点:
- 确保 fs 模块权限:Node.js 默认支持 fs,但若在受限环境(如某些容器或沙箱)中运行,需确认写入目录有写权限;
- 路径安全性:'data.json' 为相对路径,将写入当前工作目录(process.cwd()),建议使用绝对路径或 path.join(__dirname, 'data.json') 明确位置;
-
错误捕获:强烈建议包裹写入操作以防止崩溃:
try { fs.writeFileSync('data.json', JSON.stringify(data, null, 2)); console.log('✅ JSON saved successfully to data.json'); } catch (err) { console.error('❌ Failed to write JSON file:', err.message); }
最后,整合进你的主函数后,完整写入部分应如下所示(替换原 fs.writeFile(...) 行):
// ...(前面的爬取逻辑保持不变)
console.log(JSON.stringify(data));
try {
fs.writeFileSync('data.json', JSON.stringify(data, null, 2));
console.log('✅ Data successfully written to data.json');
} catch (err) {
console.error('❌ Error writing file:', err);
}
await browser.close();
至此,你的表格数据将准确、可读地持久化为标准 JSON 文件,便于后续分析、API 提供或前端消费。











