ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

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

网页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: _gaGA1.2.1234567890.1612345678; Hm_lvt_123456abcdefg; sessionidabcdefghijklmnopqrstuvwxyz1234; csrftokenQWERTYUIOPASDFGHJKLZXCVBNM这一整行以分号分隔的键值对就是当前请求携带的全部 cookie。每个keyvalue就是一个独立的 cookie一个网站通常会同时存在好几个 cookie分别承担不同职责。结合我实际看过的上百个站点的抓包数据cookie 里的字段大致可以分成三类会话管理类典型标识是sessionid、SESSION、JSESSIONID、PHPSESSID这类是服务端会话的唯一凭证拿到它基本等于拿到了登录身份。用户身份类常见的有uid、user_id、username用于服务器快速识别用户。追踪统计类最常见的是_ga、_gid、Hm_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下的路径时发送。Expires或Max-Age管的是有效期。Session 类型的 cookie 不在本地存过期时间浏览器一关就没了固定过期的 cookie 会一直存放在本地存储里到期之后浏览器自动丢弃。做脚本持久化时优先选择有效期长的能大幅降低频率。HttpOnly是个安全属性标记了它的 cookie 无法被 JavaScript 的document.cookie读取。设了这个标志的 cookie用纯浏览器脚本无法获取但 DevTools 里能看到抓包软件也能看到。很多登录态的 session cookie 都带着 HttpOnly 标志这是很多纯前端方案拿不到完整 cookie 的根本原因。SameSite是近几年新增的属性控制跨站请求时是否携带 cookieLax默认值、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. 实操脚本模拟登录自动获取 Cookie4.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 保存流程不同网站的登录接口参数各不相同但处理流程是通用的按这四步走基本能覆盖七八成以上的场景。第一步找到登录接口。打开浏览器 F12Network 面板勾选 Preserve log保留日志在页面里完成一次登录找到提交用户名密码的那个 XHR 请求记下请求的 URL、请求方法POST 居多和请求参数格式。判断哪个是登录接口有个技巧点击请求后看 Payload负载区域如果参数里有username、password、captcha这类字段那就没跑了。第二步构造请求参数。多数网站登录接口收的是 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, headersNone): 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, jsonpayload, timeout10) 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, timeout10) 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, encodingutf-8) as fp: json.dump(cookies_data, fp, ensure_asciiFalse, indent2) print(fCookie 已保存到 {filepath}) def load_cookies(self, filepath, max_age_hours24): try: with open(filepath, r, encodingutf-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(fCookie 加载成功已使用 {age_hours:.1f} 小时) return True except FileNotFoundError: return False这段代码有几处值得说明。requests.Session内置了完整的 cookie 管理登录成功后无需手工处理 Set-Cookie。登录状态的验证放在verify_login里通过访问用户中心类页面确认 cookie 是否真实有效。save_cookies和load_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(); HttpResponseString 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 生命周期配合本地文件持久化每过一段时间重新登录一次。在做任何脚本开发前先花十分钟打开开发者工具对照文章里的字段信息自己找一遍比直接复制能学到更多我一开始就是这样摸索出来的。
返回列表