Playwright启动时可通过proxy参数配置Socks5代理,仅Chromium和Firefox支持,需指定server(如"socks5://user:pass@ip:port"),带认证时须URL编码特殊字符,bypass建议设为"localhost,127.0.0.1";代理不生效需通过请求https://api.ipify.org验证出口IP,且注意DNS默认本地解析、不支持socks5h及NTLM等企业认证代理。

Playwright 启动时传入 Socks5 代理参数
Playwright 支持在启动浏览器时通过 proxy 参数配置代理,但必须注意:Socks5 代理需显式指定 server 地址(含协议前缀),且仅 Chromium 和 Firefox 支持 Socks5,WebKit 不支持。
常见错误是写成 socks5://127.0.0.1:1080 却漏掉用户名密码(如有),或误用 http:// 前缀。正确格式为:
proxy = {
"server": "socks5://user:pass@192.168.1.100:1080",
"bypass": "localhost,127.0.0.1"
}
- 若代理无需认证,写成
socks5://192.168.1.100:1080即可;带认证时必须 URL 编码用户名/密码中的特殊字符(如@、:) -
bypass字段非必需,但建议加上本地地址,避免代理自身请求被循环转发 - Chromium 和 Firefox 对
socks5的解析行为一致;若用socks5h(DNS 由代理解析),Playwright 当前版本不识别该协议,会静默降级或报错
验证代理是否生效:检查页面实际出口 IP
仅靠启动不报错不代表代理走通——Playwright 不校验代理可用性,连接失败往往延迟到首次页面导航才抛出 TimeoutError 或 net::ERR_PROXY_CONNECTION_FAILED。
最直接的验证方式是在页面中请求一个返回客户端 IP 的公开接口,并比对响应内容:
立即学习“Python免费学习笔记(深入)”;
page.goto("https://api.ipify.org")
ip = page.inner_text("body")
print("Exit IP:", ip.strip())
- 若返回的是你本地公网 IP,说明代理未生效;若返回 Socks5 服务器所在网络的 IP,则基本确认走通
- 不要依赖
page.evaluate("() => window.location.href")这类前端 JS 获取 IP,它拿不到真实出口 IP - 某些代理服务(如部分机场)会拦截非浏览器 UA,可配合
user_agent启动参数模拟真实环境
处理 DNS 解析问题:Socks5 不等于 socks5h
Playwright 的 proxy.server 使用标准 Socks5 协议,域名解析默认仍在本地进行(即“Socks5”,非 “Socks5h”)。这意味着:DNS 查询不经过代理,可能造成 IP 泄露或解析失败(比如目标域名只在代理网络内可达)。
- 目前 Playwright 无原生选项开启远程 DNS 解析;变通方法是先用
socket.gethostbyname()或dns.resolver在 Python 层解析域名,再用 IP + Host header 访问(需禁用 HTTPS 证书校验或手动注入 SNI) - 更稳妥的做法是换用支持
socks5h的底层库(如requests+PySocks)做预检,或改用 mitmproxy 等中间人代理统一接管 DNS 和 HTTP 流量 - Firefox 启动时加
--proxy-server=socks5://...命令行参数也无法启用远程 DNS,这是 Socks5 协议限制,不是 Playwright 的 bug
Windows 下认证代理的特殊坑:NTLM 或 Kerberos 代理不可用
如果你的 Socks5 代理运行在企业内网并依赖 Windows 集成认证(如 NTLM),Playwright 无法自动继承系统凭证。此时 socks5://domain\user:pass@... 中的 pass 若含特殊字符(如 /、\),URL 编码后仍大概率触发 Invalid proxy server URL 错误。
- 这类代理本质上不属于标准 Socks5,而是 HTTP 代理伪装或需额外握手,Playwright 不支持
- 可行路径只有两个:在本地起一个兼容的标准 Socks5 代理(如
3proxy或cntlm转发),或改用系统级代理设置(通过os.environ["HTTP_PROXY"]设置,但 Playwright 默认忽略环境变量,需手动传参) - Chromium 启动参数
--proxy-server也不支持 NTLM,别白费力气试
真正卡住人的地方往往不是语法,而是 Socks5 协议能力边界和 Playwright 对它的有限封装——比如你以为配了 proxy 就万事大吉,结果 DNS 漏了、认证断了、或压根连不上却等到页面超时才报错。


















