如何在Headless模式下使用带代理认证的Selenium(Chrome)
在Chrome Headless模式下使用带账号密码认证的代理(Python实现)
以下是几个可行的解决方案,针对你提到的扩展方法仅在非无头模式生效的问题:
方案1:使用PAC脚本注入代理认证
PAC(Proxy Auto-Configuration)脚本可直接嵌入代理认证信息,Chrome无头模式支持加载本地PAC文件。
- 创建本地PAC脚本(命名为
proxy_auth.pac):
function FindProxyForURL(url, host) { // 替换为实际代理地址和端口 var proxy = "PROXY your-proxy-host:port"; // 替换为实际代理账号密码 var auth = "Basic " + btoa("your-username:your-password"); header("Proxy-Authorization", auth); return proxy; }
- 在Selenium中配置Chrome选项:
import os from selenium import webdriver from selenium.webdriver.chrome.options import Options chrome_options = Options() chrome_options.add_argument("--headless=new") # 指定PAC文件的本地绝对路径(需用file://协议) chrome_options.add_argument(f"--proxy-pac-url=file://{os.path.abspath('proxy_auth.pac')}") driver = webdriver.Chrome(options=chrome_options) driver.get("https://example.com")
方案2:使用Pyppeteer直接设置代理认证
Pyppeteer是Chrome DevTools协议的Python封装,原生支持无头模式下设置代理认证,无需依赖扩展。
import asyncio from pyppeteer import launch async def main(): browser = await launch({ 'headless': True, 'args': [ # 替换为实际代理地址和端口 '--proxy-server=your-proxy-host:port' ] }) page = await browser.newPage() # 设置代理账号密码 await page.authenticate({ 'username': 'your-username', 'password': 'your-password' }) await page.goto('https://example.com') print(await page.title()) await browser.close() asyncio.get_event_loop().run_until_complete(main())
方案3:通过Selenium调用Chrome DevTools协议注入认证
如果坚持使用Selenium,可通过Chrome DevTools协议(CDP)直接发送认证指令,绕过扩展限制。
import base64 from selenium import webdriver from selenium.webdriver.chrome.options import Options chrome_options = Options() chrome_options.add_argument("--headless=new") # 指定代理地址和端口 chrome_options.add_argument("--proxy-server=your-proxy-host:port") driver = webdriver.Chrome(options=chrome_options) # 方式1:通过设置HTTP头注入认证 driver.execute_cdp_cmd('Network.setExtraHTTPHeaders', { 'headers': { 'Proxy-Authorization': 'Basic ' + base64.b64encode(b"your-username:your-password").decode('utf-8') } }) # 方式2:直接调用认证命令(部分代理场景更稳定) # driver.execute_cdp_cmd('Network.authenticate', { # 'username': 'your-username', # 'password': 'your-password' # }) driver.get("https://example.com")
注意事项
- 替换所有示例中的
your-proxy-host:port、your-username、your-password为实际信息 - 方案1需确保Chrome能正常访问本地PAC文件,避免路径权限问题
- 方案3使用
Network.setExtraHTTPHeaders时,需导入base64模块
内容的提问来源于stack exchange,提问作者innocent98
相关产品推荐
相关产品推荐

