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

