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

Puppeteer请求拦截无法显示完整请求头的问题求助

问题分析与解决方案:Puppeteer拦截请求头不全 & 「Provisional headers are shown」含义

先把你困惑的「Provisional headers are shown」提示讲透:

这个提示本质是Chrome在告诉你:当前展示的请求头是「临时准备版」,不是最终发送给服务器的完整版本。
出现它的常见场景包括:请求被浏览器取消(比如页面跳转、资源加载中途中止)、请求还在等待服务器响应、或者请求触发了重定向——此时Chrome还没拿到最终确认的请求头,只能先展示已经准备好的部分。

回到你用Puppeteer遇到的问题:为什么拦截到的请求头和Network面板里的不一样?
这是因为Puppeteer默认在请求刚发起、还没完全发送到服务器的时候就触发request事件,此时拿到的request.headers()就是Chrome的临时头;而Network面板是在请求完成/响应返回后才记录完整的请求头,所以两边会有差异。

下面给你几个实用的解决办法,帮你拿到完整的请求头:

1. 等待请求完成后再获取头

通过request.waitForResponse()等待服务器返回响应,此时请求生命周期已经走完,拿到的就是最终完整的请求头:

await page.setRequestInterception(true);
page.on('request', async (request) => {
  try {
    // 等待对应请求的响应返回
    const response = await request.waitForResponse();
    // 此时打印的就是完整请求头
    console.log('完整请求头:', request.headers());
  } catch (error) {
    // 处理请求被取消、超时等异常情况
    console.log('请求未完成,临时请求头:', request.headers());
  }
  // 一定要继续请求,不然页面会卡住
  request.continue();
});

2. 处理重定向场景

如果你的请求存在重定向,第一个请求的头大概率是临时的,需要通过request.redirectChain()获取所有跳转环节的请求头:

page.on('request', async (request) => {
  if (request.redirectChain().length > 0) {
    // 这是重定向后的请求,请求头更完整
    console.log('重定向后请求头:', request.headers());
  }
  request.continue();
});

3. 检查Puppeteer启动参数

确保你启动Chrome时没有添加可能干扰请求头的参数,比如--disable-web-security、--no-proxy-server这类可能修改请求发送逻辑的配置,尽量用原生Chrome的启动参数:

const browser = await puppeteer.launch({
  executablePath: '你的chrome.exe完整路径',
  headless: false, // 方便和Network面板做对比
  args: [] // 尽量不要加特殊参数
});

最后补充一句:如果某些请求确实被浏览器取消了(比如页面加载时主动取消了旧资源请求),那Puppeteer确实拿不到完整头,这种情况属于正常现象,对应Network面板里的请求也会带有「Provisional headers are shown」提示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 21:57:28