You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python版Playwright配置代理时出现net::ERR_TUNNEL_CONNECTION_FAILED错误

解决Playwright代理ERR_TUNNEL_CONNECTION_FAILED错误及最优代理配置方案

错误原因排查

  • 代理服务器不支持HTTPS隧道(CONNECT方法):访问HTTPS站点时,代理需要建立TCP隧道,若代理禁用CONNECT请求或不支持HTTPS转发,会触发该错误
  • 代理配置参数错误:包括主机/端口填写错误、账号密码含未编码的特殊字符(如@、:)、代理协议类型不匹配(比如用http协议配置socks5代理)
  • 网络层面拦截:代理服务器防火墙限制你的IP访问、本地网络屏蔽代理端口,或代理需要额外白名单授权

针对性解决步骤

1. 先验证代理本身可用性

用curl命令直接测试代理是否能处理HTTPS请求:

curl -x http://[username]:[password]@[host]:[port] -I https://www.google.com

如果返回HTTP/1.1 200 Connection established或类似成功响应,说明代理支持HTTPS隧道;否则联系代理服务商确认权限。

2. 修正Playwright代理配置

  • 处理特殊字符:若用户名/密码包含@、:等URL敏感字符,需先URL编码:
    import urllib.parse
    username = urllib.parse.quote(proxy_info['username'])
    password = urllib.parse.quote(proxy_info['password'])
    
  • 匹配代理协议:如果是SOCKS5代理,server字段要写成socks5://host:port,而非http
  • 添加本地旁路:避免本地请求走代理,减少不必要的错误:
    proxy = {
        "server": f"http://{username}:{password}@{proxy_info['host']}:{proxy_info['port']}",
        "bypass": "localhost,127.0.0.1,*.local"
    }
    

3. 调整浏览器启动参数

开启ignore_https_errors跳过代理自签证书问题,同时用上下文(Context)而非全局浏览器配置代理,灵活性更高:

from playwright.sync_api import sync_playwright
import urllib.parse

# 处理代理账号密码的URL编码
username = urllib.parse.quote(proxy_info['username'])
password = urllib.parse.quote(proxy_info['password'])

proxy_config = {
    "server": f"http://{username}:{password}@{proxy_info['host']}:{proxy_info['port']}",
    "bypass": "localhost,127.0.0.1"
}

with sync_playwright() as p:
    # 启动浏览器(开发阶段建议关闭无头模式调试)
    browser = p.chromium.launch(headless=False)
    # 创建带代理配置的上下文
    context = browser.new_context(
        proxy=proxy_config,
        ignore_https_errors=True  # 跳过代理证书验证
    )
    page = context.new_page()
    
    # 先验证代理IP是否生效
    page.goto("http://httpbin.org/ip", timeout=30000)
    print("当前代理IP:", page.locator("pre").inner_text())
    
    # 再访问目标站点
    page.goto("https://www.google.com", timeout=60000)
    
    # 后续业务代码...
    
    # 关闭资源
    context.close()
    browser.close()

更优的浏览器代理自动化方案

  • 上下文级代理配置:用browser.new_context(proxy=...)替代全局浏览器代理,支持多页面/多上下文使用不同代理,适合批量任务
  • 代理预热与错误捕获:在访问目标页面前先访问httpbin这类检测站点,验证代理可用性;通过page.on("requestfailed")捕获请求错误,便于排查
  • 动态代理切换:集成代理池,每次创建上下文时从池内获取新代理,避免单代理被封禁
  • 代理认证 fallback:若基础配置仍失败,可尝试通过page.authenticate()手动设置代理认证(针对部分特殊代理场景)

内容的提问来源于stack exchange,提问作者miahela

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 06:07:06