Network.responseReceived是监听响应的核心事件,需先调用Network.enable启用网络域,再在回调中通过Network.getResponseBody(传入requestId)安全获取响应体,并检查status、mimeType及encodedDataLength以避免异常。

Network.responseReceived 是你要监听的核心事件,它能拿到完整的响应体、状态码、头信息和时间戳。直接用 Selenium 的 execute_cdp_cmd 注册该事件即可,但必须配合 Network.enable 和手动抓取响应体(因为默认不返回 body)。
必须先启用 Network 域并设置捕获策略
CDP 的 Network 域默认是关闭的,不调用 Network.enable 就完全收不到任何网络事件。而且从 Chrome 95+ 开始,responseReceived 默认不带响应体(body),需要额外调用 Network.getResponseBody 才能获取。
- 务必在监听前执行
driver.execute_cdp_cmd("Network.enable", {}) - 若需响应体,得在
responseReceived回调里再发一次Network.getResponseBody请求,并传入 event 中的requestId - 注意:某些重定向响应或空响应可能抛
Network.getResponseBody异常,需 try/catch 包裹
responseReceived 回调里怎么安全提取响应内容?
事件参数结构固定,但字段存在性不保证——比如 response 可能为 null(如失败请求),response.bodySize 可能为 -1(流式响应未结束)。不能无脑取 response.body。
图片提示词生成器?不止如此。 马甲系统 —— 把脑海中的画面,翻译成AI能理解的专业表达。 用得越多,它越懂你:首次需要多问几句确认方向,用久了几乎一说就懂。 用得越多,它越快:缓存机制让后续对话越来越省。 RAG进化:成功案例持续入库,越跑越聪明。 输入「新手指南」查看完整功能介绍
- 优先检查
event["params"]["response"]["status"]确认 HTTP 状态码是否有效 - 用
event["params"]["response"]["mimeType"]过滤掉图片、字体等非结构化资源(如只关心"application/json"或"text/html") - 调用
Network.getResponseBody前,先确认event["params"]["response"]["encodedDataLength"] > 0,避免对空响应重复请求
为什么用 CDP 而不用 Selenium-Wire 或代理?
CDP 监听走的是浏览器原生通道,不经过外部代理进程,没有额外延迟或连接中断风险;也不依赖 selenium-wire 的中间人证书机制,在 HTTPS 站点或企业内网环境下更稳定。
- CDP 事件是实时推送的,毫秒级触发;而代理方式通常有缓冲和队列,响应有几十到几百毫秒延迟
- CDP 不修改请求链路,不会被网站通过
self.location.protocol或证书链异常检测出来;代理容易暴露mitmproxy特征 - CDP 支持细粒度控制:可单独监听
requestWillBeSent、responseReceived、loadingFinished,甚至拦截并改写请求头
getResponseBody 必须严格按 requestId 配对调用,且不能并发乱序。实际写回调时,建议用字典缓存待取 body 的 requestId,并加锁或用 asyncio.Queue 控制并发量。

















