JavaScript网页爬虫导出数据到Excel csv-stringify参数错误如何解决
问题修复方案
错误原因
- 核心报错来自
csv-stringify库的入参不符合要求:该库只接收二维数组、对象数组这类结构化数据,你直接传入爬取到的纯文本字符串,触发参数校验错误。 - 异步操作未做错误捕获:
stringify和fs.writeFile都是异步操作,你既没有处理回调抛出的错误,也没有在async函数外层加异常捕获,导致出现Promise未捕获的报错。 - 缺少浏览器进程关闭逻辑:代码运行后没有调用
browser.close(),会残留puppeteer启动的Chrome进程,占用系统资源。 - 未处理CSV编码适配:直接导出的UTF-8编码CSV用Excel打开会出现中文乱码,需要添加BOM头适配。
修复后的完整代码
const puppeteer = require('puppeteer'); const fs = require('fs'); const stringify = require('csv-stringify'); async function scrapeProduct(url) { const browser = await puppeteer.launch(); try { const page = await browser.newPage(); await page.goto(url); const [el] = await page.$x('//*[@id="hits"]/div[1]'); const txt = await el.getProperty('textContent'); const rawTxt = await txt.jsonValue(); // 将纯文本包装为符合csv-stringify要求的二维数组,添加表头 const data = [ ['公司描述'], [rawTxt] ]; stringify(data, function(err, output){ if (err) throw err; // 写入时添加UTF-8 BOM头,适配Excel中文显示 fs.writeFile("output.csv", '\ufeff' + output, (writeErr) => { if (writeErr) throw writeErr; console.log('导出成功,文件为output.csv'); // 写入完成后再关闭浏览器 browser.close(); }); }); console.log({rawTxt}); } catch (e) { console.error('运行出错:', e); await browser.close(); } } scrapeProduct('https://www.ibisworld.com/search/default.aspx?st=International%Game%Technology%Plc') .catch(e => console.error('全局捕获错误:', e));
改动说明
- 将爬取到的纯文本
rawTxt包装为二维数组,同时添加表头,符合csv-stringify的入参要求。 - 所有异步操作都添加了错误捕获逻辑,解决Promise未捕获的警告。
- 写入CSV时添加UTF-8 BOM头
\ufeff,Excel打开不会出现乱码。 - 确保写入完成/运行出错后都关闭Chrome浏览器进程,避免资源泄漏。
内容的提问来源于stack exchange,提问作者Ash Woods
相关产品推荐
相关产品推荐

