如何将Selenium返回的Cookie字典列表转换为CookieJar对象?
我明白你的需求——Selenium的get_cookies()返回的是字典列表,而你想把它转换成和requests.session里一样的CookieJar对象,这样就能方便使用cookie.expires、cookie.name这类属性了。下面是具体的实现方法:
步骤1:导入必要的模块
我们需要用到requests库中的RequestsCookieJar和Cookie类(RequestsCookieJar是标准CookieJar的子类,和requests生态完美兼容):
from requests.cookies import RequestsCookieJar, Cookie import time from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.service import Service
步骤2:修改你的代码,添加转换逻辑
在获取到current_cookies之后,我们遍历每个cookie字典,将其转换为Cookie对象并添加到RequestsCookieJar实例中:
options = webdriver.ChromeOptions() options.add_argument('headless') s = Service('/Users/almeco/Downloads/projects/research/refs/seo_tools_ref/sdf/chromedriver') driver = webdriver.Chrome(service=s, options=options) driver.get('https://my.adcombo.com/login') time.sleep(2) driver.find_element(By.XPATH, '/html/body/div[2]/div/div/div[2]/div/loginform/form/input[1]').send_keys( 'email_address') driver.find_element(By.XPATH, '/html/body/div[2]/div/div/div[2]/div/loginform/form/input[2]').send_keys( 'pass') driver.find_element(By.XPATH, '/html/body/div[2]/div/div/div[2]/div/loginform/form/button').click() time.sleep(3) current_cookies = driver.get_cookies() # 开始转换为CookieJar cookie_jar = RequestsCookieJar() for cookie_dict in current_cookies: # 构造Cookie对象,映射Selenium返回的字典属性到Cookie类参数 cookie = Cookie( version=0, name=cookie_dict['name'], value=cookie_dict['value'], port=None, port_specified=False, domain=cookie_dict['domain'], domain_specified=True, domain_initial_dot=cookie_dict['domain'].startswith('.'), # 处理带前缀点的域名 path=cookie_dict['path'], path_specified=True, secure=cookie_dict.get('secure', False), expires=cookie_dict.get('expiry', None), # expiry可能不存在,默认None discard=False, comment=None, comment_url=None, rest={'HttpOnly': cookie_dict.get('httpOnly', False)}, # HttpOnly放在rest字典中 rfc2109=False ) cookie_jar.set_cookie(cookie)
步骤3:使用CookieJar对象
现在cookie_jar就是标准的CookieJar对象了,你可以像操作requests.session.cookies一样使用它:
# 遍历所有cookie并访问属性 for cookie in cookie_jar: print(f"Cookie名称: {cookie.name}") print(f"过期时间戳: {cookie.expires}") print(f"是否为HttpOnly: {cookie.get('HttpOnly')}") print(f"是否启用secure: {cookie.secure}") print("---") # 直接通过键名获取指定cookie if '_ym_uid' in cookie_jar: print(f"_ym_uid的值: {cookie_jar['_ym_uid'].value}")
关键细节说明
- Selenium返回的cookie字典中,
httpOnly是驼峰式命名,而Cookie类需要将这类非标准属性放在rest参数中传递。 domain_initial_dot参数用来标识域名是否以.开头(比如.domain.com),这有助于CookieJar后续正确匹配请求域名。- 如果某个cookie没有
expiry字段(会话型cookie),我们用get('expiry', None)设置默认值,避免抛出KeyError。
内容的提问来源于stack exchange,提问作者Michal
相关产品推荐
相关产品推荐

