Selenium Python测试代理设置失效:如何使WebDriver通过代理正常工作?
解决Selenium Chrome代理超时问题
你的问题核心在于Chrome已不再支持直接在--proxy-server参数中嵌入用户名和密码,这也是CURL可用但Selenium脚本超时的关键原因。以下是几种可行的解决方法:
方法1:用Chrome扩展自动完成代理认证
创建一个轻量Chrome扩展,自动处理代理的用户名密码认证:
在本地新建文件夹(比如
proxy_auth_extension),放入两个文件:manifest.json:{ "version": "1.0.0", "manifest_version": 3, "name": "Proxy Auth Helper", "permissions": ["proxy", "storage", "webRequest", "webRequestBlocking", "<all_urls>"], "background": { "service_worker": "background.js" }, "minimum_chrome_version": "100.0.0.0" }background.js(替换占位符为你的代理信息):const PROXY_HOST = "{MYIP}"; const PROXY_PORT = 11200; const PROXY_USERNAME = "{UNAME}"; const PROXY_PASSWORD = "{PW}"; // 设置代理服务器 chrome.proxy.settings.set({ value: { mode: "fixed_servers", rules: { singleProxy: { scheme: "http", host: PROXY_HOST, port: PROXY_PORT }, bypassList: ["localhost", "127.0.0.1"] } }, scope: "regular" }, () => {}); // 自动注入认证凭据 chrome.webRequest.onAuthRequired.addListener( (details, callback) => { callback({ authCredentials: { username: PROXY_USERNAME, password: PROXY_PASSWORD } }); }, { urls: ["<all_urls>"] }, ["blocking"] );
修改Selenium脚本加载该扩展:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC chrome_options = webdriver.ChromeOptions() # 加载代理认证扩展(替换为你的文件夹路径) chrome_options.add_argument(r'--load-extension=./proxy_auth_extension') chrome_options.add_argument("ignore-certificate-errors") chrome = webdriver.Chrome(options=chrome_options) chrome.get("https://www.ipchicken.com/") wait = WebDriverWait(chrome, 30) wait.until(EC.presence_of_element_located((By.TAG_NAME, "table"))) print(chrome.page_source) chrome.quit()
方法2:验证代理的HTTPS支持
确保你的代理支持HTTPS流量转发,因为你访问的是HTTPS站点。用CURL测试:
curl -x http://{UNAME}:{PW}@{MYIP}:11200 https://www.ipchicken.com/
如果CURL返回正常,说明代理支持HTTPS;若失败,需调整代理配置或更换支持HTTPS的代理。
方法3:匹配Chrome与ChromeDriver版本
Chrome和ChromeDriver版本不匹配可能导致代理逻辑异常,用webdriver-manager自动同步版本:
from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager chrome_options = webdriver.ChromeOptions() chrome_options.add_argument(r'--load-extension=./proxy_auth_extension') chrome = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options)
额外排查点
- 部分代理会拦截非标准UA,可手动添加浏览器标识:
chrome_options.add_argument('user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36') - 检查本地防火墙、杀毒软件是否拦截Chrome的代理连接。
内容的提问来源于stack exchange,提问作者user1584043
相关产品推荐
相关产品推荐

