解决undetected_chromedriver设置代理地址池需要用户和密码,用传统的add_argument(f’–proxy-server={proxy}'),proxy包含用户和密码会报错的一系列问题。
问题背景
在使用undetected_chromedriver进行自动化测试时,当需要配置带用户密码的代理池时,传统方法直接使用add_argument(f'--proxy-server={proxy}')会遇到以下问题
# 传统错误写法示例
proxy = "user:password@proxy.domain.com:8888"
driver.execute_cdp_cmd('Network.setExtraHTTPHeaders', {'headers': {'Proxy-Authorization': 'Basic' + auth}})
1.Chrome浏览器会弹出认证弹窗阻断自动化流程
2.代理凭证拼接在URL中会导致连接失败
3.CDP协议直接设置认证头存在兼容性问题
核心解决方案
通过创建Chrome扩展程序实现代理认证,绕过浏览器原生认证机制。该方案具有以下优势:
✅ 完全模拟人工代理配置行为
✅ 支持动态轮换代理池
✅ 避免认证信息暴露在命令行参数中
✅ 兼容最新版uc.Chrome驱动
实现步骤详解
1.在你项目代码同文件夹下新建一个文件夹Proxies/s585.kdltps.com(自己代理域名)
your_project/
├── Proxies/
│ └── s585.kdltps.com/ # 代理服务商域名
└── extension.py
2.复制extension.py到自己代码同文件夹下
#extension.py名字和我一样哦
import os
def proxies(username, password, endpoint, port,path):
try:
os.mkdir(path)
except FileExistsError:
pass
manifest_json = """
{
"version": "1.0.0",
"manifest_version": 2,
"name": "Proxies",
"permissions": [
"proxy",
"tabs",
"unlimitedStorage",
"storage",
"<all_urls>",
"webRequest",
"webRequestBlocking"
],
"background": {
"scripts": ["background.js"]
},
"minimum_chrome_version":"22.0.0"
}
"""
background_js = """
var config = {
mode: "fixed_servers",
rules: {
singleProxy: {
scheme: "http",
host: "%s",
port: parseInt(%s)
},
bypassList: ["localhost"]
}
};
chrome.proxy.settings.set({value: config, scope: "regular"}, function() {});
function callbackFn(details) {
return {
authCredentials: {
username: "%s",
password: "%s"
}
};
}
chrome.webRequest.onAuthRequired.addListener(
callbackFn,
{urls: ["<all_urls>"]},
['blocking']
);
""" % (endpoint, port, username, password)
with open(path+"\\manifest.json", 'w') as m_file:
m_file.write(manifest_json)
with open(path+"\\background.js", 'w') as b_file:
b_file.write(background_js)
print(path+"\\manifest.json")
3.将自己代码undetected_chromedrive使用代理代码修改为:
import undetected_chromedriver as uc
from extension import proxies
from webdriver_manager.chrome import ChromeDriverManager
ip = "s585.kdltps.com"# 代理地址
port = "15818"# 端口
username = "t140455071...." #用户名字
password = "6u...." #密码
proxies(username, password, ip, int(port), script_address + '\\Proxies\\' + ip)
options.add_argument('--load-extension=' + script_address + '\\Proxies\\' + ip)
driver = uc.Chrome(executable_path=ChromeDriverManager().install(), options=options)
login_url = 'http://httpbin.org/ip'#查看代理ip
driver.get(login_url)
方案优势总结
1.完全认证隔离
每个代理配置生成独立扩展目录,避免凭证串用问题
2.动态代理池支持
通过扩展生成器实现代理配置热加载
3.完美兼容uc.Chrome
遵循undetected_chromedriver的最佳实践方案
4.零侵入式改造
保持原有代码结构,仅增加扩展加载逻辑
关键词说明
(1)undetected_chromedriver:使用最新v3.5.5以上版本确保扩展兼容性
(2)代理池:建议配合Redis实现动态IP轮换机制
(3)uc.Chrome:注意保持浏览器版本与驱动匹配
(4)Chrome扩展程序:需启用开发者模式加载本地扩展
@本本熊