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

如何在Puppeteer中获取attachment类型HTTP响应的Body内容

解决Puppeteer无法获取Attachment类型CSV响应体的问题

问题原因

当响应头包含content-disposition: attachment时,浏览器会自动触发下载流程,Puppeteer默认不会保留这类响应的body,导致调用response.buffer()或response.text()时出现TypeError。

解决方案1:拦截请求并阻止自动下载

通过开启请求拦截,阻止浏览器的默认下载行为,强制保留响应体以便读取:

const puppeteer = require('puppeteer');

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

  // 开启请求拦截
  await page.setRequestInterception(true);

  page.on('request', (request) => {
    // 放行所有请求
    request.continue();
  });

  page.on('response', async (response) => {
    // 筛选目标CSV响应
    const contentDisposition = response.headers()['content-disposition'];
    if (contentDisposition && contentDisposition.includes('attachment') && response.url().includes('your-download-url-keyword')) {
      try {
        if (response.ok()) {
          // 读取响应体
          const csvText = await response.text();
          console.log('CSV内容:', csvText);
          // 此处可添加CSV解析逻辑(如使用csv-parser库)
        }
      } catch (err) {
        console.error('读取响应体失败:', err);
      }
    }
  });

  // 模拟页面操作:导航到目标页,点击提交按钮
  await page.goto('your-target-page-url');
  await page.click('#submit-button'); // 替换为实际提交按钮的选择器

  // 等待响应返回
  await page.waitForTimeout(3000);

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

解决方案2:用Fetch发起请求绕过浏览器下载

如果拦截方式无效,可在页面上下文内用fetch直接请求下载接口,避免触发浏览器自动下载:

const puppeteer = require('puppeteer');

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

  await page.goto('your-target-page-url');

  // 在页面上下文执行Fetch请求
  const csvText = await page.evaluate(async () => {
    const response = await fetch('your-download-api-url', {
      method: 'POST', // 根据实际请求方法调整
      credentials: 'include', // 携带Cookie维持登录状态
      headers: {
        'Content-Type': 'application/x-www-form-urlencoded', // 匹配原请求头
      },
      body: 'your-form-data-here' // POST请求需传入对应表单数据
    });

    if (!response.ok) {
      throw new Error(`请求失败: ${response.status}`);
    }
    return response.text();
  });

  console.log('CSV内容:', csvText);
  // 处理CSV数据

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

注意事项

  • 确保目标请求的URL匹配准确,避免误拦截其他响应
  • 若页面需要登录,需保证Puppeteer上下文携带正确的Cookie
  • 使用Fetch方法时,需完整复现原请求的方法、请求头和请求体,否则可能请求失败

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 23:07:14