如何配置Python/Selenium使用认证Cookie复用已登录会话?
可复用认证状态的Selenium实现方案
默认Selenium启动时会加载独立的临时浏览器用户目录,没有日常使用积累的认证Cookie、本地存储数据,会被站点识别为匿名会话触发二次验证。可以通过以下两种稳定方案实现状态复用:
方案1:全量复用日常Chrome用户配置(稳定性最高)
这种方案会直接加载日常使用的Chrome完整用户数据,所有积累的认证状态、站点设置、本地存储会完全同步,和手动打开浏览器的状态没有差异,从根源上减少验证触发概率。
实现代码
from selenium import webdriver from selenium.webdriver.chrome.options import Options def test(self): chrome_options = Options() # 替换为本地Chrome实际的用户数据目录路径 chrome_options.add_argument("--user-data-dir=/Users/myname/Library/Application Support/Google/Chrome") # 指定日常使用的Chrome Profile,默认登录账号对应目录为Default chrome_options.add_argument("--profile-directory=Default") # 禁用自动化特征标识,降低风控识别概率 chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"]) chrome_options.add_experimental_option("useAutomationExtension", False) driver = webdriver.Chrome( executable_path="/Users/myname/dev/python/drivers/chromedriver", options=chrome_options ) # 加载完用户配置后,直接打开目标站点就是已登录的认证状态 driver.get("https://example.com") # 新版Selenium替换了旧版的find_element_by_xpath写法 search_field = driver.find_element('xpath', '//input[@id="search-white-labels-table"]') search_field.send_keys('my_search_string')
注意事项
- 启动脚本前必须完全关闭所有正在运行的Chrome进程,否则用户配置目录会被系统锁定,导致Selenium启动失败
- 不需要手动额外导入Cookie,配置加载完成后所有认证状态会自动生效
方案2:单独导出目标站点Cookie注入会话(轻量化实现)
如果不想挂载全量用户目录,可以单独导出日常浏览器中目标站点的有效Cookie,在Selenium会话中注入后完成认证状态同步。
操作步骤
- 先在日常使用的Chrome中打开目标站点,正常完成登录、二次验证流程,确认账号处于稳定的已登录状态
- 通过浏览器开发者工具复制该站点下所有有效Cookie,整理为Selenium可识别的字典格式
- 必须先在Selenium中打开目标站点的域名根路径,再执行Cookie注入操作,否则会因域名不匹配报错
实现代码
# 先访问目标域名根路径,满足Cookie注入的域名校验要求 driver.get("https://example.com") # 替换为实际导出的Cookie列表,需包含name、value、domain三个必填字段 cookie_list = [ {"name": "session_cookie", "value": "你的Cookie值", "domain": ".example.com"}, {"name": "auth_token", "value": "你的认证Token值", "domain": ".example.com"} ] # 逐个注入Cookie for cookie in cookie_list: driver.add_cookie(cookie) # 刷新页面使认证状态生效 driver.refresh()
方案局限性
- 对于依赖localStorage、IndexedDB等本地存储做认证校验的站点,仅注入Cookie会缺失关键状态,仍可能触发二次验证,稳定性弱于方案1
关键避坑提示
- 不要随意修改导出Cookie的domain、path字段,否则会因匹配规则失效导致Cookie不生效
- 旧版Selenium的
find_element_by_xpath系列方法已被废弃,替换为find_element(by=By.XPATH, value="定位表达式")的标准写法即可兼容所有新版本 - 若仍触发验证,可以在Chrome配置中增加参数禁用自动化特征的暴露,进一步降低被站点风控识别为脚本会话的概率
内容的提问来源于stack exchange,提问作者Eugene Goldberg
相关产品推荐
相关产品推荐

