很多人尝试直接把浏览器开发者工具里复制的 Cookie 字符串拼进请求里,结果大概率会翻车。为什么?因为现在的网站没那么好糊弄,它们会校验 SameSite、HttpOnly 这些标志位,甚至还会比对请求头里的 user-agent 和 TLS 指纹。所以,更靠谱的思路其实不是“手动复制”,而是让 Python 直接去用浏览器当前会话的 Cookie 缓存——这才是正解。
核心思路很简单:让 Python 的 requests 用和浏览器一模一样的 Cookie 存储路径。比如 Chrome 的 Default/Cookies 这个 SQLite 文件,里面就存着已经登录好的、加密过的 Cookie。你需要做的,就是把它读出来,再解密。
- 对于 Chrome / Edge 用户,Cookie 文件的位置很固定:Windows 上在
%LOCALAPPDATA%\Google\Chrome\User Data\Default\Cookies,macOS 上则在~/Library/Application Support/Google/Chrome/Default/Cookies。 - 但有个前提:得先把浏览器进程关掉,否则 SQLite 文件被锁着,根本读不了。
- 这里还有个麻烦事:Cookie 的值是加密的。Windows 用 DPAPI,macOS 用 Keychain,Linux 用 libsecret,你没法直接看明文,必须调用系统 API 才能解开。
- 好在有现成的轮子——
browsercookie3这个库,它已经帮你把这些平台适配的逻辑全封装好了,省心不少。
用 browsercookie3 自动提取已登录 Cookie
browsercookie3 是目前最省力的方案。它不依赖 Selenium,也不用抓包,就是纯读取本地 Cookie 数据库再解密。安装完后,一行代码就能拿到一个带着登录态的 requests.Session,非常直接。
实际操作步骤:
- 先跑一句
pip install browsercookie3 - 确保目标网站已经在 Chrome(或 Firefox、Edge)里登录好了,而且还没退出
- 把所有 Chrome 窗口都关干净,记得去任务管理器里确认
chrome.exe后台进程也结束了 - 然后在 Python 里这样写:
import requests
import browsercookie3
# 自动读取 Chrome 的登录 Cookie(Firefox/Edge 则用对应的函数名)
cj = browsercookie3.chrome() # 或 browsercookie3.firefox()
session = requests.Session()
session.cookies.update(cj)
# 现在发请求,就带着有效的登录态了
resp = session.get("https://www.php.cn/link/fad68ee497f1cf9108b630e7ce630e6c")
print(resp.status_code) # 200 表示一切顺利
为什么 requests.Session 比 requests.get 更关键
不少新手习惯在每个 requests.get(url, cookies=...) 里单独传 Cookie,但这其实是个大坑。因为登录态并不是一成不变的,它依赖服务端在多轮响应里通过 Set-Cookie 动态更新字段,比如 _xsrf、sessionid 这些都可能变。
requests.Session()会自动打理好 Cookie jar,每次收到服务端返回的Set-Cookie都会老老实实合并进来,后续请求自然也就用上了最新版。- 反过来,手动传
cookies=参数是“只读”的,它不会更新,下一次请求用的还是旧值,很多问题就是这么来的。 - 尤其要注意的是:有些网站登录成功后会有个 302 跳转,再返回来一个新的 Cookie。如果你不用 Session,这个关键更新根本抓不到。
常见失败原因和绕过技巧
哪怕 Cookie 看起来完全正确,有时还是会返回 403,或者直接跳回登录页。这不一定是 Cookie 无效,很可能是服务端还做了别的校验。
- 检查请求头里有没有
User-Agent。Chrome 默认的和requests自带的差异很大,建议加一句session.headers.update({"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36..."})。 - 有些网站还会校验
Referer。比如从/login跳转到/dashboard,第一次请求最好带上Referer: https://example.com/login。 - 如果是 Ja vaScript 渲染的 Token(像
__RequestVerificationToken),光靠 Cookie 拿不到,得先 GET 一下登录页,用BeautifulSoup提取隐藏字段,再 POST 回去。 - 遇到用了 Cloudflare 或 Akamai 的网站,只有 Cookie 根本不够,还得模拟完整的浏览器指纹。到这一步,就得请出
playwright或undetected-chromedriver了。
说到底,真正难的不是“怎么传 Cookie”,而是搞清楚哪些字段是静态缓存的,哪些是每次请求动态生成的,还有哪些校验根本绕不过去。别光盯着登录按钮点一下就完事,多看看响应头,多翻翻 Network 面板里的真实请求链路,才是正经事。