直接用seleniumwire捕获XHR请求可行但需注意:默认只记录已响应完成的请求,动态XHR易因时序问题未被捕获;需确保response非None、禁用编码过滤、正确解码响应体、手动遍历筛选URL,并验证代理服务是否正常启动。

直接用 seleniumwire 捕获 XHR 请求是可行的,但默认配置下多数 XHR 会被忽略——关键在于它默认不拦截所有请求,且对动态加载的请求存在时序陷阱。
为什么 driver.requests 里看不到 XHR?
因为 seleniumwire 默认只记录已响应完成的请求(即 status != 0),而页面 JS 发起的 XHR 往往在你读取 driver.requests 时还没返回;另外,它默认过滤掉 data:、blob:、about: 等协议,XHR 若走 fetch + blob 响应也可能被跳过。
- 确保目标 XHR 已完成:用
time.sleep()或显式等待len(driver.requests) > N不可靠,推荐轮询检查request.response是否非 None - 禁用自动过滤:初始化时加参数
disable_encoding=True,避免 gzip 响应体被跳过解析 - 确认请求协议:XHR 多数是
http://或https://,但若页面用localhost:3000且 driver 访问的是file://,CORS 或协议不匹配会导致请求根本发不出
如何正确获取某个 XHR 的响应体?
不能直接访问 request.response.body,它可能是 bytes 且未解码;更常见的是 response 为 None(请求还在 pending)或 body 是压缩内容。
- 先确认响应存在:
if req.response and req.response.body: - 用
req.response.body.decode(req.response.headers.get('encoding', 'utf-8'))不安全——应优先查Content-Type中的 charset,如text/plain; charset=utf-8 - 更稳妥做法:
req.response.body.decode('utf-8', errors='ignore'),尤其对 JSON 接口 - 若需结构化数据,建议用
json.loads()包一层 try/except,因为部分 XHR 返回空响应或 HTML 片段
如何按 URL 或方法筛选 XHR 请求?
driver.requests 是普通 list,没有内置过滤方法,必须手动遍历。注意 URL 是完整请求地址(含 query string),不是前端路由路径。
立即学习“Python免费学习笔记(深入)”;
- 匹配 GET 请求:
[r for r in driver.requests if r.method == 'GET' and 'api/user' in r.url] - 匹配 POST 并提取 JSON body:
if r.method == 'POST' and r.response and r.response.headers.get('content-type', '').startswith('application/json'): - 避免用
in r.url匹配子路径,比如/api/v1/会误中/api/v123/,改用r.url.startswith('https://example.com/api/v1/') - 注意重定向:原始 XHR 可能 302 到新地址,
r.url是最终地址,r.path才是初始路径(需启用record_path=True初始化选项)
最常被忽略的一点:seleniumwire 启动时若没传 options 或 backend='mitmproxy',在某些系统(尤其是 macOS + Python 3.11+)下会静默降级为无拦截模式,driver.requests 始终为空——务必检查日志里有没有 Starting proxy server on 这类输出。


















