如何在Puppeteer中获取完整的请求头信息?
如何用Puppeteer获取完整请求头
嘿,我之前也踩过这个坑!默认的req.headers()确实只能拿到咱们可以手动修改的那部分请求头,像浏览器自动注入的Host、Cookie、Accept-Encoding这类关键头信息,是不会出现在这个方法的返回结果里的。要拿到真正完整的请求头,得借助Chrome DevTools Protocol(CDP)直接监听网络层的事件,这是最靠谱的解决方案。
下面是修改后的代码示例,亲测有效:
const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch({ headless: false }); const page = await browser.newPage(); // 建立和CDP的连接,直接操作浏览器的网络层 const cdpClient = await page.target().createCDPSession(); // 启用Network模块,这样才能监听网络请求事件 await cdpClient.send('Network.enable'); // 监听requestWillBeSent事件,这个事件会在浏览器发送请求前触发,包含完整请求信息 cdpClient.on('Network.requestWillBeSent', (eventParams) => { console.log(`请求URL: ${eventParams.request.url}`); console.log('完整请求头:', eventParams.request.headers); console.log('------------------------'); }); await page.goto('https://reddit.com'); // 记得按需关闭浏览器 // await browser.close(); })();
关键说明:
- CDP是Chrome浏览器提供的底层调试协议,Puppeteer本身也是基于它实现的,但默认的request事件做了封装,隐藏了一些底层细节。
Network.requestWillBeSent事件返回的eventParams.request.headers包含了浏览器发送的所有请求头,不管是自定义的还是自动添加的。- 如果需要过滤特定类型的请求(比如只看文档请求,忽略图片、脚本),可以通过
eventParams.type字段来判断,比如eventParams.type === 'Document'。
内容的提问来源于stack exchange,提问作者iLinked
相关产品推荐
相关产品推荐

