跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

Python Requests 中正确使用 Cookie 实现登录的完整指南

本文系统讲解如何在 Python 中通过 requests 库可靠地复用浏览器导出的 Cookie 登录网站,涵盖常见报错(如 TypeError: expected string or bytes-like object)的根源与修复、三种主流 Cookie 传递方式对比,并强调仅靠 Cookie 不足以保证登录成功的现实约束。 本文系统讲解如何在 python 中通过 requests 库可靠地复用浏览器导出的 cookie 登录网站,涵盖常见报错(如 `typeerror: expected string or bytes-like object`)的根源与修复、三种主流 cookie 传递方式对比,并强调仅靠 cookie 不足以保证登录成功的现实约束。 在自动化访问需登录的网站时,许多开发者会尝试“偷懒式登录”:用 Chrome 插件导出已登录状态下的 Cookie(如 JSON 格式),再直接传给 requests.get(cookies=...)。但正如你遇到的错误所示——TypeError: expected string or bytes-like object——这种做法极易失败。根本原因在于: requests 的 cookies 参数只接受标准字典({key: value}),而浏览器导出的 Cookie JSON 往往嵌套了 domain/path/expires 等元信息(即 RequestsCookieJar 或扩展格式),直接解包后 value 可能是 None、int、dict 或其他非字符串类型,触发底层 http.cookiejar 的类型校验异常。 ✅ 正确做法:三类 Cookie 传递方式及适用场景 1. 【推荐】使用 Session + 字典化 Cookie(兼顾健壮性与可读性)
import requests import json # 从 cookies.json 安全提取纯 key-value 字典(过滤非法值) with open('cookies.json', 'r') as f: raw_cookies = json.load(f) # 假设 cookies.json 是数组,取第一个对象;确保所有 value 转为字符串 cookies_dict = {} for item in raw_cookies[0] if isinstance(raw_cookies, list) else [raw_cookies]: name = item.get('name') or item.get('Name') value = item.get('value') or item.get('Value') if name and isinstance(value, (str, int, float)): cookies_dict[str(name)] = str(value) # 强制转为字符串 # 使用 Session 自动处理重定向、后续请求自动携带 session = requests.Session() session.headers.update({ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36' }) # 首次请求(带 Cookie 访问受保护页面) resp = session.get('https://www.example.com/myServices?t_page=1', cookies=cookies_dict) print(f"Status: {resp.status_code}, URL: {resp.url}")
⚠️ 注意:若目标网站依赖 Referer、Origin 或 X-Requested-With 等头字段,需一并补全;否则可能返回 403 或跳转至登录页。 2. 【兼容性最强】拼接为 Cookie 请求头字符串
# 将字典转为标准 Cookie 字符串(key=value; key2=value2;) cookie_str = '; '.join([f"{k}={v}" for k, v in cookies_dict.items()]) headers = { 'Cookie': cookie_str, 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36', 'Referer': 'https://www.example.com/login' # 关键!模拟真实浏览路径 } resp = requests.get('https://www.example.com/myServices?t_page=1', headers=headers)
3. 【进阶控制】使用 RequestsCookieJar 精确设置域与路径
from requests.cookies import RequestsCookieJar jar = RequestsCookieJar() for name, value in cookies_dict.items(): # 显式指定 domain 和 path(需根据浏览器开发者工具 Network → Cookies 栏确认) jar.set(name, value, domain='.example.com', path='/') resp = requests.get('https://www.example.com/myServices?t_page=1', cookies=jar)
❗ 关键提醒:Cookie ≠ 登录成功(为什么你仍可能被拒?) 仅复用 Cookie 无法保证稳定登录 ,原因如下: CSRF Token / Anti-CSRF Header :现代网站常要求每次请求携带动态 token(如 X-CSRF-Token),该值通常在 HTML 标签或响应头中生成,Cookie 本身不含此信息; JavaScript 挑战 :部分站点通过前端 JS 计算指纹(Canvas/WebGL/字体哈希)、执行加密逻辑或验证 navigator.webdriver,纯 requests 无法执行 JS; Cookie 时效性与 Secure/HttpOnly 属性 :导出的 Cookie 可能已过期,或标记为 Secure(仅 HTTPS 传输)、HttpOnly(不可被 JS 读取,但不影响 requests 使用); 会话绑定(IP/User-Agent/Fingerprint) :服务器可能将 Cookie 与登录时的 IP、UA、TLS 指纹强绑定,服务端环境变更即失效。 ✅ 最佳实践建议 : Python 3.14.3 微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。 下载 立即学习 “ Python免费学习笔记(深入) ”; 优先使用 requests.Session() 替代单次 requests.get(),它能自动处理重定向、维持会话上下文; 登录流程应完整模拟:先 GET 登录页 → 解析并提取 CSRF token → POST 凭证 + token → 检查重定向链和最终响应内容(而非仅看 status_code); 对于复杂鉴权站点(如 Jira、内部 OA),建议结合 Selenium 或 Playwright 执行真实浏览器流程,再导出 session.cookies 供 requests 复用。 总结:Cookie 是登录的必要条件,但绝非充分条件。理解其工作原理、规避类型陷阱、补充缺失头字段,并正视前端验证的复杂性,才是实现稳定自动化访问的核心。

相关文章