如何将requests.session会话转移至selenium.webdriver复用
需求可行性结论
两种诉求均可以实现,无技术阻断。
方案1:迁移requests.Session会话到Selenium浏览器
requests维护的会话核心是服务端下发的Cookie,少量业务会额外在localStorage/sessionStorage写入鉴权标记,只要把这些状态全量同步到Selenium启动的浏览器上下文,即可完全复用之前的会话状态。
操作步骤:
- 跑完所有
requests.Session的POST提交逻辑,从session对象中提取全量Cookie及对应属性(domain、path、secure、httponly等) - 启动Selenium驱动,先访问目标站点的根域名(未访问对应域名时,浏览器会拒绝写入跨域Cookie)
- 遍历从requests中提取的Cookie,调用Selenium的
add_cookie方法逐个写入浏览器 - 若业务存在本地存储的鉴权字段,通过Selenium执行JS脚本写入对应存储即可
示例代码:
import requests from selenium import webdriver # 原有requests提交逻辑 req_session = requests.Session() req_session.post("https://your-target-domain.com/api/submit", data={"param": "test"}) # 启动Selenium driver = webdriver.Chrome() # 必须先访问目标域名,否则Cookie写入会报错 driver.get("https://your-target-domain.com") # 同步requests的Cookie到Selenium for cookie in req_session.cookies: cookie_dict = { "name": cookie.name, "value": cookie.value, "domain": cookie.domain, "path": cookie.path, "secure": cookie.secure, "httpOnly": cookie.has_nonstandard_attr("HttpOnly") } driver.add_cookie(cookie_dict) # 如需同步localStorage/sessionStorage,执行对应JS即可 # driver.execute_script("window.localStorage.setItem('auth_flag', 'xxxx');") # 刷新页面即可生效,直接复用会话操作 driver.refresh()
方案2:先启动Selenium,在浏览器环境内发POST请求后继续操作
该方案兼容性更好,请求从浏览器真实环境发出,不会出现Cookie属性不匹配、环境指纹校验不通过的问题,优先推荐。
常见两种实现路径:
- 路径1:通过Selenium注入JS脚本,调用浏览器原生
fetch/XMLHttpRequest发送POST请求,请求自动携带当前浏览器的全量会话凭证,发送完成后可直接操作页面 - 路径2:从Selenium中提取当前浏览器的全量Cookie,传入requests发送POST请求,请求完成后如果有Cookie更新,再同步回Selenium即可
JS注入发POST请求示例代码:
from selenium import webdriver driver = webdriver.Chrome() driver.get("https://your-target-domain.com") # 注入JS在浏览器上下文发POST请求 post_js = """ return fetch("https://your-target-domain.com/api/submit", { method: "POST", credentials: "include", // 自动携带跨域Cookie headers: { "Content-Type": "application/x-www-form-urlencoded" // 根据接口实际类型调整 }, body: "param=test&other_param=123" // JSON格式参数用JSON.stringify转换即可 }).then(resp => resp.text()) """ # 执行脚本获取接口返回 api_resp = driver.execute_script(post_js) # 请求发送完成,会话状态自动保留,可直接操作浏览器 driver.find_element("id", "target-button").click()
注意事项
- 同步Cookie时如果遇到写入失败,优先检查是否已经提前访问了目标域名
- 若站点存在严格的反爬校验,优先选择方案2的JS注入发请求逻辑,避免被识别为爬虫
- 带SameSite、Secure属性的Cookie,写入时要把对应属性补全到
add_cookie的参数字典中,否则会被浏览器拦截
内容的提问来源于stack exchange,提问作者Segev Solomon
相关产品推荐
相关产品推荐

