1. 先搞清楚cookie是什么,再动手获取
先说个最常见的场景。你打开某个网站,登录自己的账号,关掉浏览器,第二天再打开,发现居然还是登录状态。这个“记住你”的东西,就是cookie。但如果你以为cookie只是一串“登录凭证”,那就把它想简单了。我见过太多人在项目里栽跟头,就是因为没搞懂cookie的结构,拿到手也不知道哪些字段有用、哪些是干扰项。
1.1 cookie的真实身份,绝不是“一串字符”这么简单
cookie本质上是一小段文本,由服务器在HTTP响应头里通过Set-Cookie字段发给浏览器,浏览器收到后按照域名、路径、过期时间等信息存下来。后续同一个域名下的每一次请求,浏览器都会自动把对应的cookie放进Cookie请求头里,服务器一看这个cookie,就知道“这是之前那个登录过的用户”。
从技术角度拆开看,一条完整的cookie最少包含下面这几块:
name=value:cookie的核心,就像一把钥匙和锁的配对。服务器凭这个值认出你是谁。Domain:这个cookie作用在哪个域名下。比如Domain=.example.com表示所有example.com的子域名都会带上它。Path:限定在哪个路径下生效。默认是/,也就是整个域名下都生效。Expires/Max-Age:过期时间。没有这个字段的就是会话cookie,浏览器一关就没了;有具体时间的则是持久化cookie。HttpOnly:标记了这个属性的cookie不能被JavaScript读取,只能由浏览器在HTTP请求时自动带上,主要用来防XSS窃取。Secure:只允许在HTTPS连接下传输。SameSite:控制跨站请求时是否携带cookie,跟CSRF防护强相关。
你去看浏览器里的cookie,会看到一大堆名称奇怪的字段,比如sessionid、token、_ga、Hm_lvt_xxx、JSESSIONID等等。这里面有的负责登录态,有的负责统计埋点,有的只是广告追踪。真正要抓的时候,先搞清楚哪些是关键值,能省掉后面一大堆麻烦。
1.2 两种主流cookie:会话cookie与持久化cookie
这一块特别容易混淆。简单说:
会话cookie没有Expires或者Max-Age字段,浏览器关闭后自动消失。很多网站的登录态用的是会话cookie,所以你会遇到“关了浏览器就要重新登录”的情况。反过来说,那些“记住我”功能的网站,会把登录信息写进持久化cookie,给你一个很长的有效期,比如7天、30天。
这个区别在做自动化的时候非常关键。用程序去获取cookie,如果只拿到会话cookie,脚本一重启或者环境一换,cookie就失效了。你必须要检查有没有拿到持久化cookie,或者主动模拟“记住我”选项,否则后面写好的采集脚本、签到脚本,第二天早上起来准报错。
1.3 为什么你需要手动获取cookie,而不是代码自动登录
我猜点进来看这篇文章的,多数是被“自动登录”折磨过的人。直接写代码模拟登录,看起来是一条大路,实际走起来遍地坑:验证码、滑块、短信验证、设备指纹、风控策略,哪一个都能卡你半天。
所以更务实的思路是:手动在浏览器里登录一次,拿到登录后的cookie,再把这个cookie喂给脚本或测试工具。这个方案只依赖最终结果,不碰登录过程,稳定性高出好几个级别。
另外还有一些情况,比如目标站点的登录过程涉及扫码、第三方OAuth跳转,代码模拟的成本极高,手动获取cookie几乎是唯一高效的选择。这个思路我就直接说结论:凡是登录流程复杂的站点,优先用手动获取cookie,而不是硬写自动登录。
2. 获取前的准备:域名筛选与工具选择
搞清楚原理之后,别急着打开网页就开抓。先花两分钟想清楚目标,后面能少返工。我的习惯是先把下面几件事定下来,再进入实操。
2.1 先确定要抓哪个域名下的cookie
很多网站会同时加载好几个域名下的cookie,比如主站的example.com、静态资源服务器的static.example.com、第三方统计的google-analytics.com之类。你写脚本请求接口的时候,只需要带上接口所属域名的cookie,其他的带过去反而可能触发风控。
怎么判断要抓哪个域名?最简单的办法:打开浏览器开发者工具(F12),切到Network面板,刷新页面,看你要调用的那个接口请求,然后看这个请求的Cookie请求头,里面出现的就是当前真正传出去的cookie。
这里也要提醒一下,如果你用的工具支持设置cookie的作用域,尽量把Domain限定明确。之前有朋友做网易云音乐网页版的接口调试,他把所有域名的cookie一股脑复制进脚本,结果接口反复报错,排查半天发现是带了别的域下的一个过期cookie干扰了请求头里的字段。
2.2 推荐工具:Chrome DevTools 与专用扩展怎么选
获取cookie的工具,市面上数不清,但我实践下来,主用的就三类:
- 浏览器自带的DevTools(Application和Network面板):最稳、最通用,不依赖任何第三方插件,适合任何场景的精确抓取。
- 浏览器扩展:比如EditThisCookie、Cookie-Editor,适合快速导出当前域名下的全部cookie,格式选择多(JSON、Netscape、Header String)。
- 自动化脚本:比如Python的Selenium、Playwright、DrissionPage,适合批量处理或要把cookie动态注入到脚本里的场景。
我的经验是:**如果只是临时用一次,直接用DevTools就够了;如果是长期采集项目里要维护cookie,建议用扩展导出JSON格式,再配合程序读取;如果cookie会频繁变化,就上自动化方案。**三种工具各有定位,别一个方案用到底。
2.3 准备工作清单
动手之前,确认下面几项都准备好了,能少走不少弯路:
- 一台能稳定联网的电脑,建议用Chrome或者Edge浏览器,内核一样,操作步骤通用。
- 提前注册好目标网站的账号,保证可以完成登录操作。
- 明确你最终要把cookie用在哪:是写在Python脚本里、Postman/JMeter测试工具里,还是浏览器的另一个环境里。用途不同,导出的字段和格式要求就不一样。
- 如果目标网站有反爬策略,建议先用常用IP和习惯的设备操作,别一上来就挂代理或者换乱七八糟的网络环境,容易触发风控。
3. 核心实操:用浏览器开发者工具获取cookie
这一部分是全篇的重点,我会把操作步骤拆到每一步,跟着做就能拿到结果。我自己给很多朋友演示过这个过程,新手最容易踩的坑也会一并标出来。
3.1 第一步:打开DevTools并进入Application面板
用Chrome打开目标网站,先不要登录,直接按F12进入开发者工具,然后顶部菜单栏找到Application(中文版叫“应用”),左侧菜单里找到Cookies,点击展开,底下会列出当前页面涉及的所有域名。
这个面板展示的信息非常全,每条cookie的名称、值、Domain、Path、Expires、Size、HttpOnly、Secure、SameSite,一目了然。这里要记住:你在这个面板里看到的只是当前这个标签页能访问到的cookie。某些安全策略下,跨域iframe里的cookie不会显示在这里,就需要换Network的方法。
第一次进来的朋友,看到一堆cookie名称别慌。它们不会全是登录凭证,很多是统计、埋点类的。先确认你目标接口的域名是哪个,只关心这个域名下的cookie就行。
3.2 第二步:登录目标站点并观察cookie的变化
现在保持Application面板打开,切回页面,开始正常登录。登录完成后,回到Application面板,点一下当前域名,再点一下左下角的刷新按钮(或者直接在当前页面按F5刷新),你就能看到cookie列表发生了变化。
关键点来了:**对比登录前后新增了哪些cookie,这些新增的才是真正的登录凭证。**比如很多网站登录后会多出sessionid、token、remember_me之类的字段。如果你发现登录后cookie没有变化,说明这个站点可能用的是localStorage、sessionStorage或者Authorization头来做登录态管理,cookie这条路就不是主要凭证了。
这里要特别提醒:登录的时候,千万别勾选“记住我”选项前的预期问题。有些站点勾选后,cookie有效期会拉得很长,适合采集;有些站点反而因为勾选了记住我,触发了额外的二次验证流程,导致拿到的cookie状态异常。我的习惯是先不勾,拿到基础会话cookie,如果发现很快失效,再回头试试勾上。
3.3 第三步:从Network面板精准抓取请求头中的Cookie
Application面板适合查看完整的cookie信息,但如果你想把cookie原封不动地用在HTTP请求里,我强烈建议你从Network面板抓。
刷新页面,在Network面板里找到任意一个接口请求,点开它,在Headers标签页里找到Request Headers区域,里面的Cookie字段就是一整串浏览器实际发送的cookie。
这一整串copy下来,可以直接黏贴到请求头里。这也是Postman、JMeter、Python requests里最常见的用法。
用这种方式有个好处:你看到的是浏览器真正发出去的cookie,不会出现“Application面板里明明有,但请求里没带上”的尴尬。比如有些cookie是第三方iframe里的,或者JS里设置了但没生效的,在Network面板里一抓便知。
3.4 第四步:处理httpOnly标志的cookie
很多人会在这里卡住。Application面板里可以看到若干条cookie,但某些关键字段显示HttpOnly勾选着。这意味着JavaScript代码里用document.cookie读不到它,不过这并不妨碍你从Network面板的请求头里拿到完整值。
所以:**如果你要拿的cookie值正好是httpOnly的,别试图用脚本在页面里执行JS去读,直接去Network面板的请求头里搜。**这是一条最实用的经验。
4. 进阶方案:用脚本批量提取与备份cookie
浏览器里手动复制cookie只能解决一次性需求。如果每天都要更新cookie,或者一次性要操作多个账号,就必须上脚本了。我自己在采集项目中用的方案,在这部分完整分享出来。
4.1 Python加Selenium/DrissionPage自动提取
先说我比较推荐的一个组合:Python加DrissionPage。这个库对国内网页的适配比Selenium顺滑很多,而且它内置了读取浏览器cookie的功能,不用自己拼请求头。
核心逻辑分三步:启动浏览器、登录目标站、读取cookie并保存到文件。
from DrissionPage import ChromiumPage page = ChromiumPage() # 访问目标网站 page.get('https://example.com') # 这里手动登录,或者程序里完成登录操作 input('请在弹出的浏览器中完成登录,然后按回车继续...') # 获取当前域名下的所有cookie cookies = page.cookies(as_dict=False) for cookie in cookies: print(cookie) # 保存成Netscape格式,方便curl或脚本使用 with open('cookies.txt', 'w', encoding='utf-8') as f: f.write('# Netscape HTTP Cookie File\n') for c in cookies: domain = c.get('domain', 'example.com') include_sub = 'TRUE' if domain.startswith('.') else 'FALSE' path = c.get('path', '/') secure = 'TRUE' if c.get('secure') else 'FALSE' expires = str(int(c.get('expires', 0))) name = c.get('name', '') value = c.get('value', '') f.write(f'{domain}\t{include_sub}\t{path}\t{secure}\t{expires}\t{name}\t{value}\n') print('cookie已保存')如果你更习惯Selenium,也可以用driver.get_cookies()方法,拿到的是一组字典列表,手动转成Netscape格式或Header格式再保存。区别不大,只是DrissionPage省掉了WebDriver的配置问题。
4.2 浏览器扩展一键导出,配合外部脚本使用
不想写代码的话,就用扩展。以Cookie-Editor为例,装好后打开目标站点,点击扩展图标,能看到当前站点所有cookie。它支持几种导出格式,我最常用的是Header String和JSON。
Header String格式可以直接作为HTTP请求头的Cookie字段值,适合丢进Postman、JMeter或者requests脚本里。JSON格式适合程序化处理,比如把value取出来拼成字典。
这里有几个细节容易踩:
- 扩展导出的cookie包含的是当前站点所有可访问的cookie,可能混合了多个域的。用的时候要过滤。
- 如果导出的cookie里有
SameSite=None,注意确认目标接口是否要求带Secure属性,否则部分环境里请求会异常。 - 扩展在隐身模式下默认禁用,如果你需要在无痕环境里操作,提前到扩展管理里开启“在无痕模式下启用”。
4.3 cookie失效了?先检查这几个地方
很多人的脚本“昨天还能跑,今天突然报错”。cookie失效是必然的,问题的关键是怎么快速定位原因。按我的排查顺序,先看这几点:
- 过期时间到了:cookie里如果有关键字段的Expires已经过期,直接重新登录拿新的。
- IP或UA变了:不少网站会把cookie跟IP、User-Agent绑定。你用家里的IP拿到的cookie,换到服务器上跑,直接失效。
- 登录态被踢:同账号在其他地方登录,旧cookie经常会失效。尤其是视频、社交、电商类站点,单点登录策略很常见。
- 签名参数过期:有些cookie里的值本身就是带时间戳的签名,超过一定时间服务器直接拒绝,跟cookie本身过期与否没关系。
我一个做抖音来客运营的朋友,之前就遇到过cookie持久化失效的问题。后来他把拿cookie的环境(浏览器指纹、UA、IP)固定下来,每次有变化就重新获取,问题就消失了。说白了,cookie不是一劳永逸的东西,它是有生命周期的,把它当作需要定期维护的资源来管理,心态就对了。
5. 常见问题与避坑实录
这个部分我从实际经历里挑了一些典型问题,做成速查表,方便你遇到报错的时候快速对照。
| 现象 | 常见原因 | 解决思路 |
|---|---|---|
| 请求返回未登录提示 | cookie漏了某个关键字段 | 到Network面板里对比浏览器真实请求头,补全字段 |
| 脚本请求被风控拦截 | IP、UA、Cookie不匹配 | 保持获取cookie和使用cookie时的环境一致 |
| 导入cookie后立刻失效 | 登录态被单点登录策略挤出 | 检查是否在其他地方登录过目标账号 |
| Cookie里找不到登录字段 | 站点用的是localStorage/token机制 | 改用Network面板抓Authorization头处理 |
| 同一份cookie,Postman能用但代码不行 | 代码里header格式或编码问题 | 先打印完整请求头对比差异 |
| 用JMeter设置cookie后无效果 | 没配置HTTP Cookie Manager,或cookie作用域不对 | 添加HTTP Cookie Manager,并确认Domain匹配 |
5.1 为什么Cookie里总出现一堆看不懂的字段
很多网站的cookie是多方注入的:有自己服务器种的,有JS脚本种的,还有广告联盟、统计工具种的。比如百度统计、谷歌分析的_ga、_gid,这些字段不影响登录态,复制的时候忽略掉就好。
判断一个cookie字段是否核心,我的经验是看它跟接口请求的关系:把某个字段从请求头里删掉,接口是否返回异常。用这个方式来试错,比靠名字猜靠谱得多。但注意,这种方式只在你自己的账号上、合法合规的测试场景里用。
5.2 换设备、换IP、换浏览器,cookie全变了
这一点我需要单独拿出来说,因为它坑过很多人。不要以为cookie是一串固定的值,拿到就能用一辈子。很多网站会对cookie进行多维度绑定:
- IP地址变了,cookie直接失效
- User-Agent变了,cookie也失效
- 浏览器指纹变了,cookie同样可能失效
- 时区、语言设置变了,部分站点也会做二次校验
所以我在做采集项目时,会固定一个执行环境:固定的VPS或家用宽带出口IP、固定的浏览器UA、固定的语言设置,尽量模拟真实用户访问习惯。这样cookie的存活时间会大幅延长。
5.3 签名算法、双token、滑动验证:光有cookie还不够
聊点更深的东西。现在稍微有点规模的站点,已经不满足于只用cookie管理登录态了。常见做法是cookie配合payload里的动态token一起使用。比如登录后,服务器返回一个access_token放在cookie里,同时前端的每个接口请求,还要在请求体里带一个由页面内JS计算出来的校验参数。
这种情况,单纯复制cookie就不够了。你需要去分析接口的完整请求逻辑,看看除了cookie之外,还有哪些参数是动态生成的。我在一篇讲网易云音乐网页版抓cookie的文章里就提到过,它的某些接口除了要cookie,还要在请求里带加密参数,直接从浏览器copy cookie丢给脚本,大概率还是失败。
正确的姿势是:用Playwright或DrissionPage这类能控制真实浏览器的自动化工具,让浏览器自己去完成JS计算和请求,脚本只负责拿到最终结果。这比自己逆向加密算法快太多了。
5.4 安全红线:cookie泄露与XSS,这些事千万别干
最后说点正经的。cookie是数字身份凭证,尤其登录态的cookie,等于你账号的一把备用钥匙。拿到它的人,可以直接冒充你登录网站。
我从入行第一天起就记住一条底线:自己账号的cookie可以调试、可以测试,但绝不能把别人的cookie拿来干坏事,也绝不要把包含敏感信息的cookie到处乱发、贴截图。
以前很多人中招的XSS攻击,本质就是攻击者在输入框里注入了一段恶意JS,让浏览器把当前站点的cookie(尤其是没设置HttpOnly的)发送到攻击者的服务器上。做测试的时候,我会专门给cookie设置好HttpOnly、Secure、SameSite属性,目的就是降低被窃取风险。
如果你是给公司的项目做脚本,更要注意cookie的存储安全。不要硬编码在代码里,不要提交到公开的Git仓库,建议的做法是:把cookie放到本地配置文件或环境变量里,脚本运行时动态读取。真要放代码里,也要确保代码仓库是私有的,并且定期轮换cookie。安全这件事,前期做得好,后面能省心一万倍。
另外,如果你遇到某个站点频繁要求重新登录,先别急着怪cookie失效,看看是不是自己浏览器的清理策略太激进,或者是站点的单点登录逻辑有变化。用我之前说的排查顺序一步步来,一般10分钟以内就能定位到问题。