Javascript 在Chrome中加载页面时,如何捕获所有网络请求和完整响应数据?

Javascript 在Chrome中加载页面时,如何捕获所有网络请求和完整响应数据?,javascript,google-chrome,puppeteer,Javascript,Google Chrome,Puppeteer,使用Puppeter,我想在Chrome中加载一个URL并捕获以下信息: 请求URL 请求头 请求发布数据 响应标题文本(包括重复标题,如设置cookie) 传输响应大小(即压缩大小) 全响应体 捕获完整的响应体是我遇到问题的原因 我尝试过的事情: 使用获取响应内容-如果在任何时候都有重定向,这将不起作用,因为 拦截请求并使用getResponseBodyForInterception-这意味着我可以,而且在某些情况下,我在获取正确的请求和响应头时也遇到了问题 使用本地代理是可行的,但这大

使用Puppeter,我想在Chrome中加载一个URL并捕获以下信息:

  • 请求URL
  • 请求头
  • 请求发布数据
  • 响应标题文本(包括重复标题,如
    设置cookie
  • 传输响应大小(即压缩大小)
  • 全响应体
捕获完整的响应体是我遇到问题的原因

我尝试过的事情:

  • 使用获取响应内容-如果在任何时候都有重定向,这将不起作用,因为
  • 拦截请求并使用
    getResponseBodyForInterception
    -这意味着我可以,而且在某些情况下,我在获取正确的请求和响应头时也遇到了问题
  • 使用本地代理是可行的,但这大大降低了页面加载时间(还改变了某些行为,例如证书错误)

理想情况下,该解决方案对性能的影响较小,并且与正常加载页面没有功能上的差异。我还希望避免使用Chrome浏览器。

我建议您搜索一个快速代理服务器,它允许将请求日志与实际内容一起写入

目标设置是允许代理服务器只写一个日志文件,然后分析日志,搜索您需要的信息

代理运行时不拦截请求(这将导致速度减慢)

您可能遇到的性能问题(使用代理作为记录器设置)主要与TLS支持有关,请注意允许在代理设置中使用快速TLS握手、HTTP2协议


例如,显示它能够处理数百个RPS,这对于测试目的应该足够了

您可以为每个请求启用请求拦截,然后在内部,您可以使用模块充当中间人,在继续使用Puppeter请求之前收集响应数据

这里有一个完整的工作示例:

'use strict';

const puppeteer = require('puppeteer');
const request_client = require('request-promise-native');

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

  await page.setRequestInterception(true);

  page.on('request', request => {
    request_client({
      uri: request.url(),
      resolveWithFullResponse: true,
    }).then(response => {
      const request_url = request.url();
      const request_headers = request.headers();
      const request_post_data = request.postData();
      const response_headers = response.headers;
      const response_size = response_headers['content-length'];
      const response_body = response.body;

      result.push({
        request_url,
        request_headers,
        request_post_data,
        response_headers,
        response_size,
        response_body,
      });

      console.log(result);
      request.continue();
    }).catch(error => {
      console.error(error);
      request.abort();
    });
  });

  await page.goto('https://example.com/', {
    waitUntil: 'networkidle0',
  });

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

进入Chrome按F12,然后进入“网络”选项卡,您可以在那里看到网站发送的所有http请求,您可以看到您提到的详细信息。

我建议使用一个工具,即“”。它将捕获您在加载URL时提到的所有信息。

Puppeter only解决方案 这可以单独用木偶演员来完成。您描述的
响应.buffer
在导航时被清除的问题可以通过逐个处理每个请求来解决

工作原理 下面的代码用于拦截所有请求。如果当前有一个请求正在处理/等待,则会将新请求放入队列。然后,可以使用,而不会出现其他请求可能异步擦除缓冲区的问题,因为没有并行请求。处理当前处理的请求/响应后,将立即处理下一个请求

代码
const puppeter=require('puppeter');
(异步()=>{
const browser=wait puppeter.launch();
const[page]=wait browser.pages();
const results=[];//收集所有结果
让暂停=假;
让pausedRequests=[];
const nextRequest=()=>{//继续下一个请求或“取消暂停”
如果(pausedRequests.length==0){
暂停=错误;
}否则{
//继续“队列”中的第一个请求
(pausedRequests.shift())();//调用request.continue函数
}
};
等待页面。setRequestInterception(true);
第页('request',request=>{
如果(暂停){
pausedRequests.push(()=>request.continue());
}否则{
paused=true;//暂停,因为我们正在处理请求
请求。继续();
}
});
page.on('requestfinished',异步(请求)=>{
const response=wait request.response();
const responseHeaders=response.headers();
让我们一起来回应;
if(request.redirectChain().length==0){
//正文只能是非重定向响应的访问权限
responseBody=wait response.buffer();
}
常数信息={
url:request.url(),
requestHeaders:request.headers(),
requestPostData:request.postData(),
负责人:负责人,
responseSize:responseHeaders['content-length'],
回应本,
};
结果:推送(信息);
nextRequest();//继续执行下一个请求
});
page.on('requestfailed',(请求)=>{
//处理失败的请求
nextRequest();
});
wait page.goto(“…”,{waitUntil:'networkidle0'});
控制台日志(结果);
等待浏览器关闭();
})();

以下是我的解决方法,希望能帮助他人

我遇到了
wait页面问题。setRequestInterception(True)
命令阻塞了流,使页面挂起直到超时

所以我添加了这个函数

async def request_拦截(req):
“”“等待页面。setRequestInterception(True)将阻止流,拦截是单独启用的”“”
#启用拦截
要求设置属性(“AllowentException”,真)
如果req.url.startswith('http'):
打印(f“\nreq.url:{req.url}”)
打印(f“req.resourceType:{req.resourceType}”)
打印(f“请求方法:{req.method}”)
打印(f“req.postData:{req.postData}”)
打印(f“req.headers:{req.headers}”)
打印(f“请求响应:{req.response}”)
返回等待请求继续
删除了wait页面。setRequestInterception(True)并用
page.on('request',lambda req:asyncio.确保未来(请求拦截(req))
在我的主要部分()

没有
req.\uuuuu setattr\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu allowentException',True)
语句
...
pyee==8.1.0
pyppeteer==0.2.5
python-dateutil==2.8.1
requests==2.25.1
urllib3==1.26.3
websockets==8.1
...