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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 20:36:03