定义
Selenium Wire是对Selenium的Python绑定所做的一层扩展,目标是让使用者在保留原有Selenium编程方式的同时,能够访问浏览器底层实际发出的请求。按项目自身的描述,代码仍按Selenium的写法编写,但会额外获得用于查看请求与响应、并在其通过时加以更改的接口。[5]
它属于网络流量观测与中介工具的范畴。普通的Selenium只能操作页面DOM,无法直接说明页面背后发生了哪些请求;Selenium Wire补上了这一层,把请求的URL、方法、请求头、请求体、响应状态码、响应头和响应体等内容暴露为Python对象。[6][7]
原理
Selenium Wire的工作方式是:在后台启动一个内部代理服务器,把浏览器的流量重定向到该代理,请求在流过代理时被读取并保存下来。[8] 由于HTTPS流量需要解密,它会为站点动态生成证书,并可通过ca_cert、ca_key等选项使用自定义的根证书与私钥。[7]
被捕获的数据以请求对象和响应对象的形式提供给使用者。请求对象带有method、url、host、path、querystring、headers、body、params、response、ws_messages等属性,响应对象带有status_code、reason、headers、body、date等属性;请求头与响应头均为大小写不敏感且允许重名。[9] 可以通过driver.requests按时间顺序取得请求列表,用driver.last_request取最近一条,用driver.wait_for_request()等待匹配某模式的请求,用driver.iter_requests()迭代大量请求,还可用driver.har取得HAR格式的事务记录。[1]
在捕获之外,Selenium Wire允许通过拦截器在请求和响应经过时对其作出修改。请求拦截器接收一个参数,响应拦截器接收请求与响应两个参数,可用来增删请求头、改写查询参数、修改JSON请求体,或者用create_response()直接伪造响应、用abort()提前中断某个请求。[1][9] 捕获到的请求默认存放在磁盘上,也可通过request_storage设置为仅存于内存并用request_storage_max_size限制条数。[8]
发展历程
项目由Will Keeling开发并维护。[10] 早期版本以自带的代理实现为后端;2020年7月发布的2.0.0版本引入以mitmproxy为后端的方案,同版本还调整了API,使request.path返回路径而非完整URL,空请求体与响应体改以空字节串表示。[11]
2021年1月发布的3.0.0版本引入请求拦截器与响应拦截器,并改为在线程中运行mitmproxy后端,同时放弃对Python 3.4与3.5的支持。[11] 2021年7月的4.4.0版本加入内存存储方式,并把默认存储位置改到系统临时目录,同时移除了独立的mitmproxy后端。[7] 2022年9月的5.0.0版本增加对Microsoft Edge的支持并放弃对Python 3.6的支持;同年10月发布的5.1.0版本放弃对Selenium 4.0.0以下版本的支持。[12]
该项目仓库于2024年1月被作者归档,转为只读状态,最后一个版本5.1.0发布于2022年10月,项目已不再维护。[3][4] 归档后出现了若干社区分支,例如针对blinker依赖问题的selenium-wire-roadtx、由LunarWatcher维护的selenium-wire-lw,以及将mitmproxy改为从pip导入的Selenium Wire v11等。[13][14][15]
应用
在网络爬虫场景中,Selenium Wire常被用来直接读取页面发出的异步请求与响应,从而提取其中的数据,而不必解析渲染后的页面。[2] 它还支持在同一个浏览器会话中动态更换代理,并通过driver.proxy属性在运行期间调整代理设置,这一点是普通Selenium的启动参数难以做到的。[16]
在自动化测试与调试中,它可用于查看表单提交、验证码脚本加载、登录接口返回等环节的实际流量,从而判断某个资源是否被请求、某个接口是否返回预期状态。[6] 由于可以改写请求头与请求体、模拟响应,它也常用于构造测试所需的网络条件。[17]
局限
原项目已停止维护,这是使用上最直接的约束。仓库归档后不再有新的版本发布,在新版Python与新版本依赖下容易出现安装或导入失败,例如blinker更新后缺少相关模块导致的导入错误,以及Selenium 4.x中的兼容问题。[4][13]
捕获全部流量会带来额外开销,因此项目提供了include_urls、exclude_urls、disable_capture等选项来限定范围;需要说明的是,即使某个请求不在捕获范围内,它仍然会经过Selenium Wire,只有设置exclude_hosts才会完全绕过。[8] 在使用内存存储并限制条数时,较早的请求会随着新请求到达而被丢弃,可能导致之后通过driver.requests取不到。[8]
它依赖Selenium与浏览器驱动,因此能捕获的范围限于受该驱动控制的浏览器会话,且默认会忽略OPTIONS请求,需要把ignore_http_methods置为空列表才会一并捕获。[1] 捕获内容包括请求头、Cookie与请求体,其中可能含有个人信息,在真实用户数据上使用时需要加以考虑。[6]
参见
参考资料
- **Selenium Wire is no longer being maintained [引用日期2026-10-14]
- selenium-wire-web-scraping [引用日期2026-10-14]
- github.com 上的网页 [引用日期2026-10-14]
- How to Use Selenium Wire in Python (2026 Guide) [引用日期2026-10-14]
- freshports.org 上的网页 [引用日期2026-10-14]
- Selenium Wire + CaptchaAI für Netzwerkdiagnose in eigener QA [引用日期2026-10-14]
- HISTORY [引用日期2026-10-14]
- selenium-wire [引用日期2026-10-14]
- selenium-wire-lw - Selenium Wire [引用日期2026-10-14]
- setup [引用日期2026-10-14]
- selenium-wire - 3.0.4 (2021-01-07) [引用日期2026-10-14]
- Selenium-wire [引用日期2026-10-14]
- github.com 上的网页 [引用日期2026-10-14]
- Releases · LunarWatcher/selenium-wire - Skip to content [引用日期2026-10-14]
- selenium-wire [引用日期2026-10-14]
- web-scraping-with-selenium-wire [引用日期2026-10-14]
- Using Selenium Wire Proxy in Python | BrowserStack [引用日期2026-10-14]