如何用Pickle和Selenium在特定域名跨会话存储Cookie?
我懂你这事儿有多棘手——这网站的重定向逻辑太绝了,把所有请求都逼去两个极端页面,连个能稳定操作Cookie的中间页面都不给。不过咱们可以换个思路:用网站的静态资源当临时“锚点”,这类资源一般不会触发登录状态重定向,但又和目标站同域名,完美适配Selenium添加Cookie时的域名匹配要求。
核心方案:借助静态资源建立统一Cookie操作上下文
网站的favicon.ico(站点小图标)几乎是所有网站都有的静态资源,而且基本不会被重定向到登录/登录后页面。我们就用它来作为加载和保存Cookie的统一页面,确保所有Cookie操作都在同一个域名环境下完成。
修改后的代码
import os import pickle def save_cookies(self): # 先访问静态资源锚点,确保域名上下文正确 self.browser.get("http://www.website.com/favicon.ico") # 跳转到登录后页面,确保Cookie已完全加载 self.browser.get("http://www.website.com/afterlogin") # 保存当前所有Cookie到文件 pickle.dump(self.browser.get_cookies(), open("cookies.pkl", "wb")) def load_cookies(self): if not os.path.isfile("cookies.pkl"): return False # 先访问静态资源锚点,建立正确的域名上下文 self.browser.get("http://www.website.com/favicon.ico") # 加载本地Cookie文件 cookies = pickle.load(open("cookies.pkl", "rb")) print("loading cookies") for cookie in cookies: # 修正Cookie域名(避免泛域名导致的无效报错) if 'domain' in cookie and cookie['domain'].startswith('.'): cookie['domain'] = 'www.website.com' print("Adding cookies") self.browser.add_cookie(cookie) # 加载完成后访问主站,此时会带着Cookie自动重定向到登录后页面 self.browser.get("http://www.website.com") return True
关键细节解释
- 为什么选favicon.ico? 它属于目标域名,且几乎不会被网站的重定向规则拦截,能稳定提供一个无跳转的同域名页面,让Selenium顺利完成Cookie添加操作。
- 域名修正的必要性:有些网站保存的Cookie会用泛域名格式(比如
.website.com),直接添加到www.website.com页面可能触发InvalidCookieDomainException,手动修正为具体域名就能避免这个问题。 - 加载后跳转主站:Cookie添加完成后,再访问主站,浏览器会带着已加载的Cookie发起请求,网站会自动识别登录状态并跳转到
afterlogin页面,完美实现自动登录。
备用方案:如果favicon.ico不可用
要是这个网站连站点图标都做了重定向,你可以试试其他静态资源:
/robots.txt:搜索引擎爬取规则文件,绝大多数网站都不会对它做重定向- 任意你能找到的静态资源路径(比如网站的公共CSS/JS文件,只要确认不会被重定向就行)
内容的提问来源于stack exchange,提问作者questioning
相关产品推荐
相关产品推荐

