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

如何使用Puppeteer将所有API请求保存到JSON文件

解决Puppeteer保存所有API请求URL到JSON文件的问题

你当前代码用fs.writeFile每次写入都会覆盖整个文件,而且只写入单个URL的JSON字符串,导致最终文件只剩最后一条请求。以下是两种可行的解决方案:

方案一:收集所有URL后统一写入(推荐)

先把符合条件的API URL存入数组,等页面请求基本完成后,一次性写入JSON文件,这种方式性能更好,格式也更规范:

const fs = require('fs');
const puppeteer = require('puppeteer');

(async () => {
    const browser = await puppeteer.launch();
    const apiUrls = []; // 存储所有API URL的数组
    let page = await browser.newPage();

    page.on("request", (request) => {
        const url = request.url(); // request.url()是同步方法,无需await
        if (url.includes("/api")) {
            apiUrls.push(url);
            console.log(url);
        }
    });

    // 等待页面加载完成,networkidle2表示网络连接数≤2时认为加载完成
    await page.goto('http://www.twitter.com', { waitUntil: 'networkidle2' });

    // 将数组转为格式化的JSON写入文件
    fs.writeFile('./data.json', JSON.stringify(apiUrls, null, 2), err => {
        if (err) console.error('写入文件失败:', err);
        else console.log('所有API URL已成功保存到data.json');
    });

    await browser.close();
})();

方案二:实时追加到JSON文件(适合持续请求的场景)

如果页面会持续产生API请求,需要实时保存,可以每次读取现有文件的数组,添加新URL后再写回:

const fs = require('fs').promises;
const puppeteer = require('puppeteer');

(async () => {
    const browser = await puppeteer.launch();
    let page = await browser.newPage();

    page.on("request", async (request) => {
        const url = request.url();
        if (url.includes("/api")) {
            console.log(url);
            let apiUrls = [];

            try {
                // 读取现有文件的内容
                const fileContent = await fs.readFile('./data.json', 'utf8');
                apiUrls = JSON.parse(fileContent);
            } catch (err) {
                // 文件不存在时初始化空数组
                if (err.code === 'ENOENT') {
                    apiUrls = [];
                } else {
                    console.error('读取文件失败:', err);
                    return;
                }
            }

            // 可选:避免重复保存相同URL
            if (!apiUrls.includes(url)) {
                apiUrls.push(url);
                // 写入更新后的数组
                await fs.writeFile('./data.json', JSON.stringify(apiUrls, null, 2));
            }
        }
    });

    await page.goto('http://www.twitter.com');
    // 这里可以根据需求添加等待逻辑,比如等待用户操作或定时关闭
    // await page.waitForTimeout(10000);
    // await browser.close();
})();

注意事项

  • request.url()是同步方法,不需要用await,你之前的代码里的await是多余的。
  • 方案二更适合页面持续产生请求的场景,但频繁读写文件会有性能损耗,优先推荐方案一。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 07:15:51