使用undetected chromedriver配置代理时遇ERR_TUNNEL_CONNECTION_FAILED的解决方法
解决方案:在undetected-chromedriver中配置通用代理
方案1:修正--proxy-server参数配置(针对无需认证的代理)
直接使用--proxy-server出现隧道错误,大概率是参数格式或代理协议匹配问题,明确指定代理协议即可解决大部分场景的适配问题。
修改后的代码示例:
import random import time from undetected_chromedriver import Chrome, ChromeOptions # 读取随机用户代理 with open("user-agents.txt", "r") as file: user_agents = file.readlines() random_user_agent = random.choice(user_agents).strip() # 生成代理配置 random_number = random.randint(0, 9) proxy_host = "gate.smartproxy.com" proxy_port = 10000 + random_number # 明确指定代理协议,避免Chrome自动判断出错 proxy = f"http://{proxy_host}:{proxy_port}" options = ChromeOptions() options.add_argument(f"user-agent={random_user_agent}") options.add_argument(f'--proxy-server={proxy}') options.add_argument("--disable-blink-features=AutomationControlled") driver = Chrome(options=options) driver.get("https://www.whatismyip.com/") time.sleep(10) time.sleep(3000000)
方案2:使用Chrome扩展配置带认证的代理(通用适配所有网站)
如果代理需要用户名密码认证,直接用--proxy-server会触发认证弹窗导致隧道连接失败,此时用Chrome代理扩展是最稳定的适配方案。
步骤1:动态生成代理扩展文件
无需手动创建静态文件,在Python中动态生成临时扩展目录:
import random import time import os from undetected_chromedriver import Chrome, ChromeOptions # 读取随机用户代理 with open("user-agents.txt", "r") as file: user_agents = file.readlines() random_user_agent = random.choice(user_agents).strip() # 生成代理参数 random_number = random.randint(0, 9) proxy_host = "gate.smartproxy.com" proxy_port = 10000 + random_number proxy_username = "你的代理用户名" proxy_password = "你的代理密码" # 创建临时扩展目录 temp_ext_dir = "./temp_proxy_ext" os.makedirs(temp_ext_dir, exist_ok=True) # 写入manifest.json with open(os.path.join(temp_ext_dir, "manifest.json"), "w") as f: f.write('''{ "version": "1.0.0", "manifest_version": 3, "name": "Dynamic Proxy", "permissions": ["proxy", "storage", "activeTab", "scripting", "webRequest", "webRequestBlocking"], "background": { "service_worker": "background.js" }, "minimum_chrome_version": "100.0.0.0" }''') # 写入background.js(动态填充代理信息) background_js = f""" const proxyHost = "{proxy_host}"; const proxyPort = {proxy_port}; const username = "{proxy_username}"; const password = "{proxy_password}"; // 设置代理规则 chrome.proxy.settings.set({{ value: {{ mode: "fixed_servers", rules: {{ singleProxy: {{ scheme: "http", host: proxyHost, port: proxyPort }}, bypassList: ["<local>"] }} }}, scope: "regular" }}, () => {{}}); // 自动处理代理认证 chrome.webRequest.onAuthRequired.addListener( (details, callback) => {{ callback({{ authCredentials: {{ username: username, password: password }} }}); }}, {{ urls: ["<all_urls>"] }}, ["blocking"] ); """ with open(os.path.join(temp_ext_dir, "background.js"), "w") as f: f.write(background_js) # 配置Chrome选项 options = ChromeOptions() options.add_argument(f"user-agent={random_user_agent}") options.add_argument("--disable-blink-features=AutomationControlled") # 加载临时代理扩展 options.add_argument(f"--load-extension={os.path.abspath(temp_ext_dir)}") # 启动浏览器 driver = Chrome(options=options) driver.get("https://www.whatismyip.com/") time.sleep(10) time.sleep(3000000)
方案3:排查代理本身的问题
- 验证代理是否支持HTTPS隧道:用
curl -x http://gate.smartproxy.com:10000 https://www.whatismyip.com测试,如果curl也报错,说明代理不支持HTTPS CONNECT方法,需更换代理。 - 检查代理的地区/网站限制:部分代理服务商对特定网站有访问限制,导致连接失败,可联系服务商确认权限。
- 确认代理端口有效性:你随机生成的10000-10009端口,需确保服务商开放了这些端口的代理服务。
内容的提问来源于stack exchange,提问作者user3362334
相关产品推荐
相关产品推荐

