使用Python Selenium为csfloat.com添加Cookie后页面刷新仍无法保持登录,及添加Authorization header的技术咨询
问题背景
我是Python新手,目前在做网站认证相关的工作。我遇到一个问题:通过Selenium添加Cookie后(已经确认浏览器中能看到这些Cookie),页面刷新后网站不会保持登录状态。我用requests包使用相同的Cookie时,认证完全正常,但这里我不能用requests,因为这个网站严重依赖JavaScript渲染的内容,requests处理不了。
我的代码如下:
import json import time from selenium import webdriver driver = webdriver.Chrome() # 2. Download cookies from file def load_cookies(filename): try: with open(filename, "r", encoding="utf-8") as file: return json.load(file) except Exception as e: print(f"❌ Error for download cookies: {e}") return [] # add cookie def add_cookies(driver, cookies): driver.get("https://csfloat.com") time.sleep(25) for cookie in cookies: selenium_cookie = { 'name': cookie['name'], 'value': cookie['value'] } try: driver.add_cookie(selenium_cookie) print(selenium_cookie) except Exception as e: print(f"⚠️ Can not to add cookie {cookie['name']}: {str(e)}") finally: print('Cookies loaded') time.sleep(25) # refresh site for post cookies driver.get("https://csfloat.com") time.sleep(60) driver.save_screenshot("auth_check.png") # 4. Using cookies = load_cookies("cookie.json") if cookies: add_cookies(driver, cookies) print("Site content:", driver.page_source) driver.quit()
另外,这个网站支持通过Authorization header登录,但我还没找到在Selenium中添加这个请求头的方法。
我的问题:
- 为什么在Selenium中刷新页面后网站不保留认证状态,即使Cookie已经存在?
- 如何在Selenium中添加Authorization header来直接认证?
要是我遗漏了什么细节或者需要澄清的地方,请告诉我——这是我第一次在这里发帖,感谢你的耐心!
问题解答
问题1:添加Cookie后刷新仍无法保持登录的原因及解决
导致这个问题的核心原因大多和Cookie参数不完整、添加时机错误有关,结合csfloat.com的特性,具体分析和修改建议如下:
常见原因
- Cookie关键参数缺失:你当前只传递了
name和value,但csfloat.com的Cookie需要domain、path、secure、sameSite这些参数才能被浏览器识别为有效Cookie。比如缺失domain=.csfloat.com的话,浏览器会认为这个Cookie不属于当前站点,刷新后自动失效。 - 添加时机错误:你先打开网站再等待25秒加Cookie,此时网站可能已经完成了初始认证检查,或者生成了冲突的本地Cookie,导致你添加的Cookie无法覆盖原有逻辑。
- 网站额外认证机制:csfloat.com可能依赖
localStorage/sessionStorage中的令牌、浏览器指纹匹配(比如特定User-Agent),仅靠Cookie无法完成完整认证。
代码修改建议
完善Cookie参数、调整添加时机,修改后的add_cookies函数如下:
def add_cookies(driver, cookies): # 先打开空白页,避免页面提前加载触发认证检查 driver.get("about:blank") # 先访问一次目标站,获取站点的Cookie上下文 driver.get("https://csfloat.com") time.sleep(3) # 清空现有Cookie,避免冲突 driver.delete_all_cookies() for cookie in cookies: # 从原Cookie中提取所有必要参数,适配Selenium格式 selenium_cookie = { 'name': cookie['name'], 'value': cookie['value'], 'domain': cookie.get('domain', '.csfloat.com'), 'path': cookie.get('path', '/'), 'secure': cookie.get('secure', True), 'sameSite': cookie.get('sameSite', 'Lax') } # 处理expiry参数,需转为整数格式 if 'expiry' in cookie: selenium_cookie['expiry'] = int(cookie['expiry']) try: driver.add_cookie(selenium_cookie) print(f"✅ 成功添加Cookie: {selenium_cookie['name']}") except Exception as e: print(f"⚠️ 无法添加Cookie {cookie['name']}: {str(e)}") print('所有Cookie处理完成') time.sleep(2) # 用refresh而非重新get,避免触发站点的初始检查 driver.refresh() time.sleep(5) driver.save_screenshot("auth_check.png")
问题2:在Selenium中添加Authorization header的方法
Selenium本身没有直接修改请求头的API,但可以通过Chrome DevTools Protocol (CDP) 实现,这是目前最稳定的方案:
def add_authorization_header(driver, auth_token): # 先打开空白页初始化CDP driver.get("about:blank") # 通过CDP设置全局Authorization请求头 driver.execute_cdp_cmd( "Network.setExtraHTTPHeaders", {"headers": {"Authorization": f"Bearer {auth_token}"}} ) # 再访问目标站点,所有请求都会携带这个header driver.get("https://csfloat.com") time.sleep(5) driver.save_screenshot("auth_header_check.png")
注意事项
- 确认csfloat.com的Authorization格式:通常是
Bearer <token>,你可以从之前能用的requests请求中复制完整的header值。 - 这个方法会给所有后续请求添加header,如果需要针对特定请求设置,可以结合CDP的
Network.requestWillBeSent事件做更精细的控制。
备注:内容来源于stack exchange,提问作者Tw1lighT
相关产品推荐
相关产品推荐

