将Selenium导出Cookie加载到Python Requests会话时的错误及生效问题
我来帮你搞定这个Cookie加载的问题!
问题根源
你碰到的'list' object has no attribute 'extract_cookies'错误,核心原因是Requests会话的cookies属性要求的是RequestsCookieJar对象,而不是Selenium导出的字典列表。直接把列表赋值给它,会覆盖原本的CookieJar实例,导致Requests后续处理请求时找不到必要的方法,自然报错。
你需要把Selenium导出的每个Cookie字典,逐个添加到Session的CookieJar中,而不是直接赋值。下面是修改后的代码:
import requests import pickle def load_cookies(filename, session): with open(filename, 'rb') as f: cookies_list = pickle.load(f) # 遍历Cookie列表,逐个添加到会话的CookieJar里 for cookie in cookies_list: # 处理expiry字段:Selenium导出的是浮点数,转成整数避免类型问题 if 'expiry' in cookie: cookie['expiry'] = int(cookie['expiry']) # 用Session的cookies.set方法添加Cookie,参数对应Selenium导出的字段 session.cookies.set( name=cookie['name'], value=cookie['value'], domain=cookie['domain'], path=cookie['path'], secure=cookie['secure'], httponly=cookie['httpOnly'] ) # 使用示例 initial_state = requests.Session() load_cookies(time_cookie_file, initial_state) # 现在发起请求就会携带正确的Cookie了 search_requests = initial_state.get(search_url)
如果你之前尝试了其他方法“成功加载”但Cookie没生效,大概率是因为没有正确将Cookie注入到RequestsCookieJar中。只有当Cookie被正确添加到这个Jar里,Requests在发起请求时才会自动携带它们,和Selenium的Cookie生效逻辑是一致的。
几个要注意的细节
- 域名匹配:Selenium导出的Cookie可能带有
.前缀(比如.website.com),这表示该Cookie适用于所有子域名,Requests会正确识别这个范围,不用手动修改。 - 参数名对应:Selenium里的
httpOnly字段,在Requests的set方法里要写成httponly(注意是小写的ly结尾)。 - 验证加载结果:可以在加载后打印
print(initial_state.cookies),查看所有已加载的Cookie,确认是否和Selenium导出的一致。
这样修改后,你的Requests会话应该就能正确复用Selenium导出的Cookie,保持会话状态啦!
内容的提问来源于stack exchange,提问作者no nein
相关产品推荐
相关产品推荐

