使用Puppeteer下载需Cookie验证的PDF报错,寻求解决方案
我需要使用Puppeteer从需导入Cookie才能访问的网站下载PDF文件,已尝试以下代码:
const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.goto('http://www.africau.edu/images/default/sample.pdf'); await page.setCookie({ "domain": "africau.edu", "hostOnly": false, "httpOnly": false, "name": "test", "path": "/", "sameSite": "unspecified", "secure": false, "session": true, "value": "testvalue", "id": 1 }); await page.pdf({ path: 'sample.pdf', format: 'A4' }); await browser.close(); })();
但运行时出现如下错误:
C:\Users\Khaniini\project\node_modules\puppeteer\lib\cjs\puppeteer\common\FrameManager.js:194 ? new Error(`${response.errorText} at ${url}`) ^ Error: net::ERR_ABORTED at http://www.africau.edu/images/default/sample.pdf at navigate (C:\Users\Khaniini\project\node_modules\puppeteer\lib\cjs\puppeteer\common\FrameManager.js:194:23) at processTicksAndRejections (node:internal/process/task_queues:96:5) at async FrameManager.navigateFrame (C:\Users\Khaniini\project\node_modules\puppeteer\lib\cjs\puppeteer\common\FrameManager.js:170:21) at async Frame.goto (C:\Users\Khaniini\project\node_modules\puppeteer\lib\cjs\puppeteer\common\FrameManager.js:589:16) at async Page.goto (C:\Users\Khaniini\project\node_modules\puppeteer\lib\cjs\puppeteer\common\Page.js:1089:16) at async C:\Users\Khaniini\project\index.js:15:3
问题原因与解决步骤
1. 错误核心原因
- Cookie设置时机错误:先调用
page.goto再设置Cookie,此时请求已发送,Cookie未被携带,导致请求因权限问题被中止。 - PDF链接直接下载:访问PDF链接时,服务器可能直接返回下载响应而非渲染页面,
page.goto无法完成导航流程,抛出ERR_ABORTED错误。 - Cookie参数无效:Cookie对象中的
id字段是Puppeteer不支持的参数,可能导致Cookie设置失败。
2. 修正后的代码示例
const puppeteer = require('puppeteer'); const fs = require('fs'); (async () => { const browser = await puppeteer.launch(); const page = await browser.newPage(); // 先设置Cookie,确保后续请求携带认证信息 await page.setCookie({ "domain": "africau.edu", "hostOnly": false, "httpOnly": false, "name": "test", "path": "/", "sameSite": "unspecified", "secure": false, "session": true, "value": "testvalue" // 移除无效的id字段 }); try { // 尝试正常导航并生成PDF(适用于PDF可被页面渲染的场景) await page.goto('http://www.africau.edu/images/default/sample.pdf', { waitUntil: 'networkidle0', timeout: 60000 }); await page.pdf({ path: 'sample.pdf', format: 'A4' }); } catch (error) { // 若导航失败(直接下载场景),改用获取响应内容并写入文件 const response = await page.goto('http://www.africau.edu/images/default/sample.pdf', { responseType: 'arraybuffer' }); const pdfBuffer = await response.buffer(); fs.writeFileSync('sample.pdf', pdfBuffer); } await browser.close(); })();
3. 关键优化点
- 调整Cookie设置顺序:先调用
page.setCookie再发起请求,确保Cookie被正确携带。 - 移除无效参数:删除Cookie对象中的
id字段,避免设置失败。 - 兼容两种场景:同时处理PDF可渲染和直接下载的情况,提升代码健壮性。
内容的提问来源于stack exchange,提问作者Khaniini
相关产品推荐
相关产品推荐

