如何通过Selenium获取重定向过程中中间页面设置的Cookie
实现方案
有两种常用的实现方案,适配不同的重定向场景:
场景1:b.com返回服务端3xx重定向(跳转由浏览器内核直接处理,不会渲染b.com页面)
这种场景下页面不会停留在b.com,需要通过Chrome DevTools Protocol(CDP)监听网络响应,直接提取b.com返回的Cookie:
- 实现逻辑:开启Selenium的网络监听,匹配b.com的响应,提取响应头中的
Set-Cookie字段,无需暂停跳转即可直接获取Cookie - 代码示例(Python + Selenium 4+):
from selenium import webdriver from selenium.webdriver.chrome.options import Options chrome_options = Options() driver = webdriver.Chrome(options=chrome_options) # 开启网络域监听 driver.execute_cdp_cmd("Network.enable", {}) b_cookies = [] def intercept_response(event): # 匹配b.com域名的响应 if "b.com" in event["response"]["url"]: # 提取响应头中的Set-Cookie set_cookies = event["response"].get("headers", {}).get("Set-Cookie", []) if isinstance(set_cookies, str): set_cookies = [set_cookies] b_cookies.extend(set_cookies) # 注册响应接收回调 driver.add_cdp_listener("Network.responseReceived", intercept_response) # 执行登录请求 driver.get("https://a.com/login") # 此时b_cookies已经存储了b.com返回的所有Cookie print(b_cookies)
场景2:b.com返回200状态码,通过前端JS定时器实现毫秒级跳转
这种场景可以通过提前拦截页面加载,在JS跳转执行前获取Cookie:
- 实现逻辑:将页面加载策略设置为
eager,DOM加载完成后立刻返回控制,不需要等待JS执行,此时轮询检测当前URL,匹配到b.com时直接调用get_cookies()即可拿到对应域名的Cookie - 代码示例:
from selenium import webdriver from selenium.webdriver.chrome.options import Options import time chrome_options = Options() # 页面加载策略设为eager,DOM加载完成就停止等待,不用等资源和JS执行 chrome_options.page_load_strategy = 'eager' driver = webdriver.Chrome(options=chrome_options) driver.get("https://a.com/login") # 轮询当前URL,100ms查一次,最多轮询1秒 for _ in range(10): current_url = driver.current_url if "b.com" in current_url: # 此时获取到的就是b.com域名下的Cookie b_cookies = driver.get_cookies() print(b_cookies) break time.sleep(0.1)
注意事项
- 若后续需要使用b.com的Cookie,注入时需要先导航到b.com的任意路径(只要域名匹配即可),再调用
add_cookie()方法注入 - 如果使用的是Selenium 3版本,无法原生支持CDP调用,可以安装
selenium-wire库替代原生driver,直接通过driver.requests属性获取所有历史请求的响应头提取Cookie
内容的提问来源于stack exchange,提问作者Pedro
相关产品推荐
相关产品推荐

