如何在Selenium脚本中实现Cookie永久有效,解决存储Cookie失效问题
很多人照着网上旧教程写的Cookie复用逻辑本来就有硬伤,跑出来就是Cookie存不住、隔一天就失效的问题,核心问题点有四个:
- 站点本身的登录态Cookie服务端有效期就是1天,这是站点的规则,不是本地存储的问题
- 脚本里写的
del cookie['expiry']是典型的错误操作:Selenium加Cookie的时候遇到没有expiry字段的Cookie,会直接把它当成临时会话Cookie,关闭浏览器就从存储里删掉,根本没法长期复用 - 完全没做滑动续期的逻辑:绝大多数站点的登录态都是滑动过期机制——只要你带着有效Cookie正常访问,服务端就会下发一个延长了有效期的新Cookie替换旧的。原来的脚本加完旧Cookie刷新完就关浏览器,根本没把新的续期Cookie存下来,等旧Cookie过了1天的有效期自然就登不上
- 每次跑脚本都用Chrome的临时用户配置,和最初手动登录的浏览器环境完全不一样,风控严的站点会直接把陌生环境的登录态判为异常,强制踢下线
具体代码调整
1. 修正Cookie导出脚本(cookies.py)
替换原有粗糙的导出逻辑,保证存储的Cookie完整、和原登录环境一致:
import time import json from selenium import webdriver from selenium.webdriver.chrome.options import Options # 固定Chrome用户配置目录,避免每次都是全新环境 chrome_options = Options() # 把路径改成你本地固定的存储目录,不要用默认临时目录 chrome_options.add_argument("--user-data-dir=/your/local/fixed/chrome/path") driver = webdriver.Chrome(options=chrome_options) target = "xxx.yyy" driver.get(target) # 留足时间完成手动登录,等页面加载完、所有Cookie全部下发 time.sleep(90) # 导出Cookie时过滤无效字段 valid_cookies = [] for cookie in driver.get_cookies(): # 把浮点数的过期时间转成整数,不要直接删掉 if 'expiry' in cookie: cookie['expiry'] = int(cookie['expiry']) # 只保留目标域的Cookie,过滤第三方域的无效Cookie if target.split("//")[-1] in cookie['domain']: valid_cookies.append(cookie) with open('cookies.txt', 'w') as cookief: cookief.write(json.dumps(valid_cookies)) driver.close()
2. 修正自动复登脚本(relogin.py)
核心补上续期逻辑,每次复登完把最新的Cookie覆盖存储:
import json import time from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.support.wait import WebDriverWait # 用和导出时完全一致的Chrome固定配置 chrome_options = Options() chrome_options.add_argument("--user-data-dir=/your/local/fixed/chrome/path") driver = webdriver.Chrome(options=chrome_options) wait = WebDriverWait(driver, 10) target = "xxx.yyy" # 必须先打开目标域,不然加Cookie会被浏览器拦截 driver.get(target) driver.delete_all_cookies() # 读取本地存的旧Cookie with open('cookies.txt', 'r') as cookief: cookieslist = json.load(cookief) for cookie in cookieslist: # 仅做浮点数转整数处理,绝对不要删除expiry字段 if 'expiry' in cookie: cookie['expiry'] = int(cookie['expiry']) driver.add_cookie(cookie) # 带着旧Cookie刷新页面 driver.refresh() # 等页面完全加载,给站点时间下发续期的新Cookie wait.until(lambda d: d.execute_script("return document.readyState") == "complete") time.sleep(5) # 核心续期步骤:把当前最新的、已经续了期的Cookie覆盖存到本地 # 下次运行的时候就可以用这个新的Cookie,不用重新手动登录 valid_cookies = [] for cookie in driver.get_cookies(): if 'expiry' in cookie: cookie['expiry'] = int(cookie['expiry']) if target.split("//")[-1] in cookie['domain']: valid_cookies.append(cookie) with open('cookies.txt', 'w') as cookief: cookief.write(json.dumps(valid_cookies)) driver.close()
必须注意的细节
- 不存在真正“永久不失效”的Cookie,所有站点的登录态Cookie都有服务端设定的最长有效期。上面的方案本质是在每次Cookie过期前,通过一次复登操作拿到服务端续期的新Cookie,一直把有效期往前顺延。只要你在每次Cookie失效的间隔期(通常是1-7天)跑一次复登脚本,这个登录态就能一直保持,不需要反复手动登录。
- 绝对不要用无痕模式跑Selenium,无痕模式下Cookie是存在内存里的,不会被持久化存储,很容易出现加Cookie失败的问题。
- 固定Chrome的User-Agent、浏览器指纹配置,不要每次运行脚本都换UA,不然站点的风控系统会认为是陌生设备登录,直接把Cookie判为无效。
- 如果站点开了设备绑定校验,就不要频繁切换运行脚本的IP地址,IP波动太大也会触发强制登出。
内容的提问来源于stack exchange,提问作者showkey
相关产品推荐
相关产品推荐

