news 2026/9/19 8:05:21

网页Cookie获取全攻略:从原理到脚本模拟登录实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
网页Cookie获取全攻略:从原理到脚本模拟登录实战

做爬虫、写自动化脚本、搞接口调试的朋友,十有八九都卡在过“登录状态”这道坎上。明明浏览器里能正常访问的页面,用脚本一请求就被重定向到登录页,或者直接返回一堆乱码 JSON。问题基本都出在同一个地方:没有把网页的 cookie 带上。cookie 就是服务端发给客户端的“通行证”,你带着它去请求,服务器才认你是那个已经登录过的用户。这篇保姆级教程,就是把“获取网页 cookie”这件事从头到尾掰开揉碎讲清楚,看完你就能自己上手。

这篇文章适合这几类人:刚入门的爬虫初学者、写自动化测试脚本的测试工程师、经常需要模拟登录调接口的后端开发,以及那些只想快速抓点数据、不想研究复杂登录协议的普通玩家。我会从原理层面讲清楚 cookie 到底是什么,再给出手动获取、插件批量导出、脚本自动模拟登录三种实操路径,最后把高频踩坑点列出来。全程以 Chrome 浏览器和最常见的 Web 技术栈为例,照着操作就行。

1. 为什么需要网页 Cookie:先把原理讲透

1.1 HTTP 是“失忆”的,cookie 就是小纸条

HTTP 协议本身是无状态的,服务器处理完一个请求就“忘掉”你了,下一次请求它根本不知道你是谁。但现实业务里几乎所有的网站都需要记住用户的登录状态、购物车内容、浏览偏好。解决办法就是服务器在响应里塞一个小纸条给你,浏览器把它存下来,后续每次请求都自动带上——这个小纸条就是 cookie,专业一点叫“会话标识”。

这个机制用生活里的场景来类比特别直观:你进一家健身房,前台验证完会员卡后,往你手腕上贴一个防水手环。接下来你在健身房里跑步、游泳、用器械,教练看到手环就知道你是会员,不用每次都掏卡验证。cookie 就是那个手环,服务端就是教练,浏览器就是帮你保管手环的储物柜。

搞清楚这个逻辑,你就会明白一个关键结论:获取 cookie 的本质,是替你的脚本程序完成一次“身份认证过程”。手动复制 cookie 是借现有浏览器的手环用,脚本模拟登录则是让程序自己办一张新手环,两条路最终目的相同。

1.2 获取 cookie 到底解决什么问题

获取 cookie 这件事在真实开发中主要解决四大类问题,我按遇到的频率排个序:

第一类是绕过登录态重复认证。很多内部管理系统、数据中台,登录一次有效期几小时,脚本每跑一次都要重新扫码登录的话,既浪费时间又容易被风控盯上。把登录后的 cookie 固化到一个文件里,脚本启动时读出来直接携带,能省掉大量重复劳动。

第二类是数据采集与接口调试。网站很多敏感数据接口都需要登录权限,浏览器里能打开是因为有 cookie,脱离了浏览器环境就得自己把 cookie 管理中带上。接口测试工具 Postman、JMeter、Apifox 里都有专门的 Cookie 管理模块,原理完全一样。

第三类是网页自动化测试的状态保持。Selenium、Playwright 这类自动化工具虽然能操作完整浏览器,但每次启动都是一副“全新面孔”,所有登录状态清零。提前注入 cookie 可以让自动化脚本保持登录状态,跳过每次都要处理的验证码。

第四类比较复杂,是第三方平台的数据迁移与同步。有些平台没有开放 API,只提供网页版操作入口,这时候想把自己名下的数据备份出来,唯一的方式就是获取网页 cookie 后模拟请求去拉数据。注意做这类操作前一定要确认平台条款是否允许,技术能力是中性工具,合法合规使用是底线。

2. 拿到 cookie 前必须懂的几个字段

2.1 从 DevTools 里第一次看清 cookie 的“内脏”

打开 Chrome 浏览器,访问任意一个需要登录的网站,按 F12 打开开发者工具,切到 Network(网络)面板,刷新页面,随便点一个请求,往下拉找到 Request Headers(请求标头)区域,你能看到一长串类似这样的东西:

Cookie: _ga=GA1.2.1234567890.1612345678; Hm_lvt_123456=abcdefg; sessionid=abcdefghijklmnopqrstuvwxyz1234; csrftoken=QWERTYUIOPASDFGHJKLZXCVBNM

这一整行以分号分隔的键值对,就是当前请求携带的全部 cookie。每个key=value就是一个独立的 cookie,一个网站通常会同时存在好几个 cookie,分别承担不同职责。

结合我实际看过的上百个站点的抓包数据,cookie 里的字段大致可以分成三类:

会话管理类,典型标识是sessionidSESSIONJSESSIONIDPHPSESSID,这类是服务端会话的唯一凭证,拿到它基本等于拿到了登录身份。用户身份类,常见的有uiduser_idusername,用于服务器快速识别用户。追踪统计类,最常见的是_ga_gidHm_lvt_*Hm_lpvt_*,这类主要给统计分析工具用,对爬虫来说没有实际价值,但服务器一般也不校验,留着无妨。

2.2 关键属性:理解“过期时间”和“作用范围”

除了键值对,cookie 在设置时还带着一组属性,这些属性在 DevTools 的 Application(应用)面板里能看得清清楚楚。平时最需要关注的四个属性是 Domain、Path、Expires/Max-Age 以及 HttpOnly。

Domain决定这个 cookie 在哪些域名下生效。登录a.com产生的 cookie,默认不会发给b.com,这是浏览器的同源策略在起作用。Path进一步缩小范围,Path=/表示整站都生效,Path=/user则只在访问/user下的路径时发送。

ExpiresMax-Age管的是有效期。Session 类型的 cookie 不在本地存过期时间,浏览器一关就没了;固定过期的 cookie 会一直存放在本地存储里,到期之后浏览器自动丢弃。做脚本持久化时,优先选择有效期长的,能大幅降低频率。

HttpOnly是个安全属性,标记了它的 cookie 无法被 JavaScript 的document.cookie读取。设了这个标志的 cookie,用纯浏览器脚本无法获取,但 DevTools 里能看到,抓包软件也能看到。很多登录态的 session cookie 都带着 HttpOnly 标志,这是很多纯前端方案拿不到完整 cookie 的根本原因。

SameSite是近几年新增的属性,控制跨站请求时是否携带 cookie,Lax(默认值)、Strict、None 三种取值,对做第三方登录对接时有影响,不过单纯获取 cookie 的阶段暂时不用太关注它。

3. 最实用的三种获取方式,从手动到全自动

3.1 方式一:DevTools 手动复制,五步搞定

手动复制是门槛最低的方式,适合不经常更新 cookie 的场景。完整步骤如下:

第一步,用 Chrome 打开目标网站,正常完成登录操作,保证当前浏览器处于登录状态。

第二步,按 F12 进入开发者工具,切到 Application(应用)面板,左侧菜单展开 Cookies 选项,点击当前网站的域名,右侧会列出全部 cookie。这个视图中每个字段都是一行一行分开的,方便查看,但不方便直接复制成请求头格式。

第三步,切回 Network(网络)面板,刷新一下页面,点击任意一个同域名的请求。注意最好选 XHR 类型的请求,也就是 Fetch/XHR 过滤下的那些接口请求,这类请求往往带的就是服务端比较关键的那部分 cookie。

第四步,在 Headers 子面板里找到 Request Headers,找到Cookie:那一行,右键选择 Copy Value 或者手动选中复制。

第五步,粘贴到你的脚本、Postman 或者任何需要的地方,大功告成。

我建议大家养成一个习惯:拿到 cookie 后顺手把获取时间记录下来。cookie 本身就是有时效的,很多网站登录态只保留 24 到 72 小时,记下时间可以帮助判断“失效了是重新获取还是自身代码有 bug”。另外,复制完整 Cookie 头时要细心,我以前见过不少把引号也一起复制进去导致签名字符串对不上的,反复检查没意义,细心就好。

3.2 方式二:浏览器插件批量导出,效率翻倍

手动复制适合一两个 cookie 的情况,但现实里经常遇到巨型 cookie 集合。一个电商网站的登录状态可能同时包含十几个键值对,手动复制容易漏项或复制错值。这种场景用浏览器插件效率高得多。

Chrome 插件商店搜“Cookie-Editor”或“EditThisCookie”,装好之后,在目标网站的页面上点击插件的图标,一个带搜索、增删改查功能的完整 cookie 列表就弹出来了。你能直接看到每个 cookie 的 Domain、Expires、HttpOnly、SameSite 这些完整属性。Cookie-Editor 支持一键导出成 JSON、Netscape 格式、以及请求头字符串,特别是导出成 JSON 后可以直接用于 Playwright 的add_cookies接口,非常方便。

有一个细节值得注意:插件导出的 cookie 列表是包含 HttpOnly 标志的 cookie 的,这一点比纯浏览器控制台执行document.cookie更完整。如果你想做网页自动化,建议用插件导出完整 JSON,然后用自动化框架的接口注入,而不是靠执行 JS 代码去设置,后者没法处理 HttpOnly。

3.3 方式三:直接复制 cURL 命令,交给工具自动解析

Chrome DevTools 里有个隐藏的高效操作——右键点击任意网络请求,选择“复制”→“以 cURL 格式复制”,剪贴板里就会生成一条完整的命令行请求。里面包含了 URL、全部请求头(包括 Cookie)、POST 数据、User-Agent 等所有信息。把这条命令粘到终端里直接执行,就能完美复现一次浏览器请求。

这个功能最大的价值在于:不用手动拆 cookie 字段,直接把整个请求上下文交给工具去解析。Postman 的 Import 功能可以直接粘贴 cURL 命令,自动生成接口和请求头;Python 爬虫圈常用的curl_cffi库也有现成的命令行解析模块;JMeter 同样支持导入 cURL 生成 HTTP 采样器。

复制 cURL 时我建议顺手把 User-Agent、Referer、Origin 这些都一并保存下来。实践中很多接口只校验 Cookie 里关键的几个值,但有些严格的服务端会同时校验 UA 和 Referer 是否匹配,缺一个就拒绝请求或者返回异常数据。用 DevTools 复制 cURL 的方式,天然保留全部请求上下文,能避开这类问题。

4. 实操:脚本模拟登录自动获取 Cookie

4.1 环境准备和思路

手动获取 cookie 虽然简单,但通用性差,cookie 一过期就得重新操作一遍,不适合长期稳定运行的定时任务。要真正解决自动化问题,就该上脚本模拟登录的路线。核心思路是:程序带着正确的账号密码和登录参数,请求登录接口,服务端校验通过后会在响应头里返回Set-Cookie,程序把 Set-Cookie 解析保存,下次请求自动带上,循环往复。

环境准备上,我用 Python 的requests库举例子。用虚拟环境安装依赖:

python -m venv .venv source .venv/bin/activate # Windows 用 .venv\Scripts\activate pip install requests

核心原理是requests.Session()这个对象。用 Session 发请求时,response 返回的 Set-Cookie 会自动被保存到 Session 里,后续所有请求会自动带上,不需要手工拼接 Cookie 头部。

4.2 处理登录与 Cookie 保存流程

不同网站的登录接口参数各不相同,但处理流程是通用的,按这四步走基本能覆盖七八成以上的场景。

第一步,找到登录接口。打开浏览器 F12,Network 面板勾选 Preserve log(保留日志),在页面里完成一次登录,找到提交用户名密码的那个 XHR 请求,记下请求的 URL、请求方法(POST 居多)和请求参数格式。判断哪个是登录接口有个技巧:点击请求后看 Payload(负载)区域,如果参数里有usernamepasswordcaptcha这类字段,那就没跑了。

第二步,构造请求参数。多数网站登录接口收的是 JSON 或表单格式,密码大多会经过一次前端加密。要是遇到未知加密算法,先在 Sources 面板里搜password加密相关关键词,看清具体实现后直接用 Python 的同策略算法处理。这一步往往是工作量占比最大的,需要耐心。

第三步,发起请求并检查登录结果。拿到响应后打印状态码和响应内容,一般登录成功会返回 token 或者跳转地址。如果返回 4xx,优先检查参数是否缺少、加密逻辑是否正确、是否有验证码未处理。

第四步,验证、保存和复用 Cookie。登录成功后访问一个需要登录态才能看的页面,确认返回里包含正常的用户信息。务必确认这一步。然后从 Session 里把 cookie 导出,序列化成 JSON 存到本地文件,下次脚本启动直接加载,时间没超过有效期就能复用,减少不必要的登录请求。

4.3 Python 完整示例代码

下面给出一份可以直接修改使用的完整示例,以模拟一个普通网站登录为例:

import json import time import requests class LoginClient: def __init__(self, login_url, profile_url, headers=None): self.session = requests.Session() self.login_url = login_url self.profile_url = profile_url if headers: self.session.headers.update(headers) def login(self, username, password): payload = { "username": username, "password": password, "remember_me": "true", } try: resp = self.session.post(self.login_url, json=payload, timeout=10) if resp.status_code == 200: result = resp.json() if result.get("code") == 0: print("登录成功") return True print(f"登录失败: {resp.status_code}, {resp.text[:200]}") return False except requests.RequestException as exc: print(f"请求异常: {exc}") return False def verify_login(self): resp = self.session.get(self.profile_url, timeout=10) return resp.status_code == 200 and "用户中心" in resp.text def save_cookies(self, filepath): cookies = self.session.cookies.get_dict() cookies_data = { "created_at": int(time.time()), "cookies": cookies, } with open(filepath, "w", encoding="utf-8") as fp: json.dump(cookies_data, fp, ensure_ascii=False, indent=2) print(f"Cookie 已保存到 {filepath}") def load_cookies(self, filepath, max_age_hours=24): try: with open(filepath, "r", encoding="utf-8") as fp: data = json.load(fp) created = data.get("created_at", 0) age_hours = (int(time.time()) - created) / 3600 if age_hours > max_age_hours: print("Cookie 已过期,请重新登录") return False self.session.cookies.update(data["cookies"]) print(f"Cookie 加载成功,已使用 {age_hours:.1f} 小时") return True except FileNotFoundError: return False

这段代码有几处值得说明。requests.Session内置了完整的 cookie 管理,登录成功后无需手工处理 Set-Cookie。登录状态的验证放在verify_login里,通过访问用户中心类页面确认 cookie 是否真实有效。save_cookiesload_cookies实现了本地持久化,拿到一次登录态后能复用一段时间,注意时间戳逻辑。

4.4 Java 版本:HttpClient 的 Cookie 处理方式

后端工程师如果用 Java 写调用逻辑,核心思路一致,但 API 风格不同。原生 Java 可以用HttpClient配合CookieManager来管理:

import java.net.CookieManager; import java.net.CookiePolicy; import java.net.CookieStore; import java.net.HttpCookie; import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.time.Duration; public class CookieDemo { private final CookieManager cookieManager; private final HttpClient client; public CookieDemo() { this.cookieManager = new CookieManager(); this.cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL); this.client = HttpClient.newBuilder() .cookieHandler(cookieManager) .connectTimeout(Duration.ofSeconds(10)) .build(); } public void login(String url, String username, String password) throws Exception { String payload = String.format("{\"username\":\"%s\",\"password\":\"%s\"}", username, password); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create(url)) .header("Content-Type", "application/json") .POST(HttpRequest.BodyPublishers.ofString(payload)) .build(); HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); System.out.println("登录响应: " + response.body()); CookieStore store = cookieManager.getCookieStore(); for (HttpCookie cookie : store.getCookies()) { System.out.println("Cookie name=" + cookie.getName() + ", value=" + cookie.getValue()); } } }

Java 的CookieManager默认不会自动把 Set-Cookie 关联到后续请求的域名上,显式调用setCookiePolicy设置接受策略是必要的。用 OkHttp 的话也有CookieJar接口可以实现相同效果,具体实现方式各有不同,但思路一样:拦截响应里的 Set-Cookie,存储,拼到后续请求上。

5. 高频问题和避坑指南

5.1 cookie 总是失效,怎么回事

cookie 失效的高频原因主要有四种,对照排查基本能找到症结:

过期时间太短。很多网站在 Set-Cookie 里把有效期写死为 30 分钟或 1 小时,属于正常的服务端策略。解决思路是抓包看 Expires 值,如果确实很短,脚本就得增加自动重新登录的重试机制。

登录态被服务端主动踢掉。服务端安全策略检测到同一账号多地登录或频繁切换 IP,会把旧的会话标记为失效。这在不支持多端同时在线的平台上尤其常见,B 站就是一个典型例子,手机端、客户端、网页端登录时会互相顶掉。

请求频率过高触发风控。如果之前在短时间内发了几百次请求,服务端会临时把当前 cookie 拉黑。这种情况会看到 IP 被限流、接口返回验证码等信号,需要降低频率,加随机延迟,或者给请求加代理。

脚本里漏带了关键 cookie。浏览器自动带上全部 cookie,但脚本只取了其中一部分,漏掉某个关键值导致服务端不认。解决方法是调试时完整对比浏览器请求头和脚本请求头,一个字段一个字段看。

5.2 登录时有验证码/滑块验证,怎么自动处理

模拟登录最大的拦路虎往往是验证码,尤其滑块类,不少开发同学会直接卡死在这。我的处理思路按成本从低到高给几条参考:

优先看有没有绕过路径。验证码大多数在密码登录流程里出现,切换成手机验证码登录后只需要处理短信而已。有扫码登录的站点优先考虑扫码登录,有些人机验证只保护密码登录接口。

支持离线识别的用 OCR。图形验证码这种静态图片,用 tesseract 或者云服务商的 OCR 接口识别,成功率在 60% 到 80% 浮动。纯数字、纯字母的识别成功率最高,扭曲严重的会明显下降。

滑块类用「行为轨迹模拟」思路处理。这类验证的核心是拖动轨迹是否符合人类习惯,用 Playwright 配合模拟拖动操作,轨迹加入加速、减速、停顿、微调,有意制造拟真轨迹,成功率明显提升。

如果甲方允许,直接降低风控由人工辅助。每两个小时登录一次,登录时人工过一下验证码,其他时间脚本自动跑,成本反而最低。不必死磕全自动,稳定运行比技术炫技更重要。

5.3 HttpOnly cookie 为什么脚本提取不到

很多做浏览器自动化的朋友遇到过诡异现象:控制台执行document.cookie拿到的 cookie 只有一部分,登录态相关的 session cookie 永远不在里面。原因就是服务端给关键的会话 cookie 打上了HttpOnly标志,这个标志禁止 JavaScript 访问,只能通过 HTTP 请求头发送。

这属于浏览器的安全设计,不是 bug。想拿到 HttpOnly cookie,两条路可走:用 DevTools Application 面板手动复制;请求响应阶段直接从 Set-Cookie 头里提取。脚本里通过 requests 或 HttpClient 发起请求时,Response Headers 里的 Set-Cookie 是完整可见的,HttpOnly 标志不妨碍提取。

如果要写 Playwright 自动化脚本注入 cookie,务必要从插件导出 JSON 或者抓包拿完整列表,不要从document.cookie去拼,那样拿到的 cookie 不全,注入后会发现登录态依旧丢失。

5.4 安全提醒:别有用心的人也在“获取”你的 cookie

文章最后必须说一句:cookie 就是账号身份的凭证,cookies 列表甚至可以等价于“临时密码”。拿到别人的 cookie,在某些站点上完全等同于拿到登录权限。网络攻击里专门有 XSS 攻击窃取 cookie 的经典手法,恶意脚本通过执行document.cookie偷偷把凭证上传到攻击者服务器。

所以平时使用中,要注意不要在公共电脑上保存登录态,不要把 cookie 明文分享给任何人,更不要随意执行来源不明的 JavaScript 代码。自己写脚本时,cookie 文件建议加到.gitignore,不要提交到公开仓库,之前见过不少惨痛案例,登录凭证直接跟着代码一起公开。

另外提醒一点,获取 cookie 后只用于个人学习、接口调试、数据备份等合法场景,滥用他人账号、抓取需要权限的个人隐私数据都属于越界行为,技术上能做到不代表就可以做。

写在最后

Cookie 这个技术看似基础,但理解透它的工作机制,很多 Web 自动化问题都会迎刃而解。手动复制适合一次性需求,插件批量导出适合搞定完整 cookie 场景,脚本模拟登录则适合长期运行的自动化任务,三者之间按需选择就好。我个人最常用的组合是:DevTools 查看接口结构,Python Session 管理 cookie 生命周期,配合本地文件持久化,每过一段时间重新登录一次。在做任何脚本开发前,先花十分钟打开开发者工具对照文章里的字段信息自己找一遍,比直接复制能学到更多,我一开始就是这样摸索出来的。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/19 8:04:54

低成本隔离4-20mA输出:PWM+光耦+滤波的完整设计指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/19 8:04:18

医学图像分割评价指标全解析:从Dice到MSD的实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/19 8:03:11

零售业AI应用:从供应链到智能门店的全面变革

1. 零售行业AI应用全景解析2026年的零售行业正在经历一场由AI驱动的深度变革。作为一名长期观察零售科技发展的从业者&#xff0c;我亲眼见证了AI技术如何从单点突破走向全链路重构。现在的零售企业不再满足于零散的AI应用&#xff0c;而是追求从供应链到终端销售的全流程智能化…

作者头像 李华
网站建设 2026/9/19 8:02:54

open-code-review 实践:从自觉到流程化的代码审查自动化

代码审查这件事&#xff0c;在团队里待过的人应该都有体会——它重要、必需&#xff0c;但往往很难坚持做好。PR一多&#xff0c;review就变成了“看一眼有没有冲突&#xff0c;点个approve”&#xff1b;代码越堆越多&#xff0c;新人的命名规范、老代码里的重复逻辑、被忽略的…

作者头像 李华
网站建设 2026/9/19 7:56:15

玻璃纤维网布石膏板检测标准JC/T 2847-2024详解

1. 玻璃纤维网布石膏板检测标准解读JC/T 2847-2024是我国最新发布的建材行业标准&#xff0c;专门针对玻璃纤维网布增强石膏板产品的质量检测方法和技术要求。作为建筑内隔墙和吊顶系统的关键材料&#xff0c;这类复合板材的性能直接关系到建筑物的安全性和使用寿命。在实际工程…

作者头像 李华
网站建设 2026/9/19 7:55:22

Flutter记账本App开发:核心组件与状态管理实践

1. 记账本App首页设计思路解析记账本作为个人财务管理工具的核心模块&#xff0c;其首页设计需要兼顾信息展示的完整性和操作的便捷性。经过多次用户调研和产品迭代&#xff0c;我总结出优秀记账本首页的三个黄金法则&#xff1a;一眼看清&#xff1a;关键财务数据&#xff08;…

作者头像 李华