ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Python3中如何使用Selenium Wire捕获浏览器后台XHR网络请求?

Python3中如何使用Selenium Wire捕获浏览器后台XHR网络请求? 直接用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_encodingTrue避免 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; charsetutf-8更稳妥做法req.response.body.decode(utf-8, errorsignore)尤其对 JSON 接口若需结构化数据建议用json.loads()包一层 try/except因为部分 XHR 返回空响应或 HTML 片段如何按 URL 或方法筛选 XHR 请求driver.requests是普通 list没有内置过滤方法必须手动遍历。注意 URL 是完整请求地址含 query string不是前端路由路径。匹配 GET 请求[r for r in driver.requests if r.method GET and api/user in r.url]匹配 POST 并提取 JSON bodyif 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_pathTrue初始化选项最常被忽略的一点seleniumwire 启动时若没传options或backendmitmproxy在某些系统尤其是 macOS Python 3.11下会静默降级为无拦截模式driver.requests始终为空——务必检查日志里有没有Starting proxy server on这类输出。
返回列表