如何将Puppeteer解析器下载的文件存入JS Buffer并在代码中使用
用Puppeteer将下载文件存入Buffer并使用
要把下载的文件存入JS Buffer,你需要拦截页面的下载请求,直接获取响应的二进制数据,而非让浏览器自动保存到本地。下面是修改后的代码和操作说明:
修改后的完整代码
(async () => { const puppeteer = require('puppeteer'); const browser = await puppeteer.launch({ headless: false, defaultViewport: false, args: ['--start-maximized'] }); const page = await browser.newPage(); await page.setViewport({ width: 1920, height: 1080 }); // 初始化Buffer变量,用于存储文件数据 let fileBuffer = null; // 开启请求拦截 await page.setRequestInterception(true); page.on('request', (request) => { // 放行非下载类请求,可根据实际文件后缀调整判断条件 if (!request.url().match(/\.(pdf|xlsx|docx|zip)$/)) { request.continue(); return; } // 处理下载请求,直接获取响应体 request.continue().then(async (response) => { if (response.ok()) { // 将响应二进制数据转为Buffer fileBuffer = await response.buffer(); console.log('文件已成功存入Buffer'); } }); }); // 执行登录及下载操作 await page.goto('你的目标网址'); await page.type('#username', '你的用户名'); await page.type('#password', '你的密码'); await page.click('#loginbtn'); await page.click('.aalink.stretched-link'); // 等待Buffer获取完成(可根据文件大小调整等待时长,或用更精准的监听逻辑) await new Promise(resolve => setTimeout(resolve, 3000)); // 使用Buffer进行后续操作 if (fileBuffer) { // 示例1:将Buffer写入本地文件 const fs = require('fs'); fs.writeFileSync('下载文件.pdf', fileBuffer); // 示例2:文本类文件(如csv/txt)转为字符串解析 // const textContent = fileBuffer.toString('utf-8'); // console.log(textContent); // 示例3:包装为Blob上传到服务器 // const formData = new FormData(); // formData.append('file', new Blob([fileBuffer]), '自定义文件名.pdf'); // await fetch('后端上传接口', { method: 'POST', body: formData }); } await browser.close(); })();
核心逻辑说明
- 请求拦截:通过
page.setRequestInterception(true)开启拦截,根据URL后缀识别下载请求,跳过普通页面资源请求。 - Buffer获取:调用
response.buffer()直接提取响应的二进制数据,转为JS原生Buffer对象。 - Buffer的典型用法:
- 写入本地文件:借助
fs模块将Buffer写入磁盘。 - 文本解析:对文本格式文件,用
toString()转为字符串后处理内容。 - 网络上传:将Buffer包装成
Blob,通过FormData提交到后端接口。
- 写入本地文件:借助
注意事项
- 需根据实际下载文件的后缀,调整请求拦截的判断规则。
- 等待Buffer获取的时长可根据文件大小、网络速度灵活调整,也可以用
waitForFunction监听fileBuffer是否非空,替代固定时长等待,提升可靠性。
内容的提问来源于stack exchange,提问作者Rudee Sayuki
相关产品推荐
相关产品推荐

