如何在Puppeteer中禁用或取消所有自动下载操作
解决方案
1. 配置浏览器下载行为
在创建页面前,通过CDP命令直接控制浏览器的下载偏好,将自动下载的文件导向系统空设备,避免本地生成下载文件:
const browser = await puppeteer.launch({ headless: "new", defaultViewport: null }); const page = await browser.newPage(); // 根据系统设置空设备路径:Linux/macOS用/dev/null,Windows用NUL const nullDevicePath = process.platform === 'win32' ? 'NUL' : '/dev/null'; await page._client.send('Page.setDownloadBehavior', { behavior: 'allow', downloadPath: nullDevicePath, eventsEnabled: false });
2. 优化文件保存逻辑
你之前的代码通过page.evaluate二次发起fetch请求属于重复操作,直接使用response.buffer()即可获取响应内容,更高效且避免环境限制:
page.on("response", async (response) => { // 可选:过滤不需要保存的资源(比如样式、图片等,按需调整) if (!response.ok() || response.url().match(/\.(css|png|jpg)$/)) { return; } try { const buffer = await response.buffer(); // 替换为你的目标保存路径与文件名 const targetFileName = new URL(response.url()).pathname.split('/').pop(); fs.writeFileSync(`./your-save-dir/${targetFileName}`, buffer); } catch (err) { console.error(`保存文件失败:${response.url()}`, err); } }); await page.goto('https://www.7-zip.org/a/7z2201-x64.exe', { waitUntil: "load", timeout: 120000 });
关键说明
Page.setDownloadBehavior是Puppeteer底层的CDP命令,无需预设MIME类型,就能强制所有自动下载的文件流向空设备,不会占用本地存储。- 用
response.buffer()替代二次fetch,减少网络请求开销,同时避免页面环境的跨域或权限限制导致的请求失败。
内容的提问来源于stack exchange,提问作者SomePerson
相关产品推荐
相关产品推荐

