Python快速入门专业版(五十六)——爬虫会话管理:Cookie与Session原理及实战(保持登录状态)

张开发
2026/6/7 17:39:15 15 分钟阅读
Python快速入门专业版(五十六)——爬虫会话管理:Cookie与Session原理及实战(保持登录状态)
目录前言一、Cookie 与 Session 核心原理1.1 HTTP 协议的无状态特性1.2 Cookie 原理与特点1.2.1 什么是 Cookie1.2.2 Cookie 核心特点1.2.3 Cookie 常见属性1.3 Session 原理与特点1.3.1 什么是 Session1.3.2 Session 核心特点1.4 Cookie 与 Session 核心区别1.5 会话完整工作流程二、爬虫中 Cookie 的作用三、Requests 库 Cookie 操作基础3.1 安装 Requests3.2 方式一自动获取与携带 Cookie3.3 方式二手动构造 Cookie 字典3.4 方式三CookieJar 转字典3.5 从响应头解析 Set-Cookie四、Session 对象自动维持连续会话4.1 Session 作用4.2 Session 基础用法4.3 Session 优势对比五、实战一模拟登录并爬取会员页面5.1 场景说明5.2 完整代码5.3 关键说明六、实战二Session 连续操作登录→个人中心→退出6.1 场景6.2 代码实现七、实战三手动解析 Set-Cookie 并设置过期时间7.1 场景7.2 代码八、常见问题与解决方案8.1 携带 Cookie 仍登录失效8.2 Set-Cookie 有多个值无法解析8.3 登录需要验证码8.4 服务器禁用 Cookie8.5 Cookie 过期太快九、配图说明HTML 结构示意9.1 Cookie 与 Session 流程图 HTML9.2 Requests Session 对比图 HTML十、总结前言在爬虫开发中保持登录状态是爬取会员内容、个人数据、动态交互页面的核心前提。绝大多数网站通过 Cookie 与 Session 实现用户身份识别与会话保持若爬虫无法正确处理会话会频繁出现登录失效、权限不足、页面跳转回登录页等问题。本文将从原理、区别、实战三个维度系统讲解 Cookie 与 Session 的工作机制结合 Python Requests 库实现自动/手动管理 Cookie、使用 Session 对象维持连续会话并通过完整可运行代码演示登录爬取、连续操作、手动解析与设置 Cookie 等场景帮助开发者彻底掌握爬虫会话管理。一、Cookie 与 Session 核心原理1.1 HTTP 协议的无状态特性HTTP 是无状态协议服务器不会主动记忆上一次请求的用户身份。每一次请求对服务器而言都是全新的无法区分“已登录用户”和“未登录用户”。为了解决这一问题Web 系统引入了会话机制通过 Cookie Session 组合实现用户状态持久化。1.2 Cookie 原理与特点1.2.1 什么是 CookieCookie 是服务器通过 HTTP 响应头Set-Cookie发送给浏览器的小型文本数据由浏览器存储在客户端电脑/手机本地后续每次请求同一域名时浏览器会自动通过请求头Cookie带回给服务器。1.2.2 Cookie 核心特点存储位置客户端浏览器/本地文件存储大小单域名一般限制 4KB 左右可设置属性过期时间、域名、路径、安全标志、HttpOnly 等传输方式随 HTTP 请求头自动发送安全性明文存储易被窃取、篡改1.2.3 Cookie 常见属性属性作用NameValueCookie 名称与值核心内容Expires/Max-Age过期时间超时自动失效Domain生效域名仅该域名可发送此 CookiePath生效路径如/user仅用户页生效HttpOnly禁止 JS 读取防 XSS 窃取Secure仅 HTTPS 传输1.3 Session 原理与特点1.3.1 什么是 SessionSession 是服务器端存储的用户会话数据服务器为每个用户创建唯一的SessionID并通过 Cookie 将SessionID发送给客户端。客户端后续请求携带SessionID服务器根据 ID 查找对应会话数据识别用户身份。1.3.2 Session 核心特点存储位置服务器内存、文件、数据库、Redis安全性数据不暴露给客户端安全性更高依赖关系必须依赖 Cookie 传递 SessionID生命周期默认会话结束关闭浏览器失效可设置超时存储容量远大于 Cookie可存储复杂用户信息1.4 Cookie 与 Session 核心区别对比维度CookieSession存储位置客户端服务器端存储大小小约4KB大无严格限制安全性低明文可篡改高数据不外露服务器压力无客户端存储有占用服务器资源依赖关系独立存在依赖 Cookie 传递 SessionID生命周期可长期保存设置过期默认临时可配置超时跨端支持支持 APP、小程序、爬虫依赖客户端携带 ID1.5 会话完整工作流程用户首次访问网站服务器创建 Session生成唯一SessionID服务器通过Set-Cookie响应头将SessionID发送给客户端客户端存储 Cookie后续请求自动携带服务器根据SessionID找到对应会话识别用户身份登录成功后服务器在 Session 中标记用户为已登录用户退出或超时服务器销毁 SessionCookie 失效二、爬虫中 Cookie 的作用在爬虫场景下Cookie 是维持身份的核心凭证主要作用包括保持登录状态登录接口验证成功后服务器返回登录 Cookie后续请求携带该 Cookie 即可访问会员页面、个人中心、订单数据等需要权限的内容。绕过简单反爬部分网站校验请求头中是否存在 Cookie无 Cookie 直接返回 403/跳转首页。记录用户偏好如主题模式、语言设置、分页数量、地域信息等。维持动态会话验证码、表单令牌、csrf_token 等常与 Cookie 绑定。避免重复登录批量爬取时无需每次重新登录复用有效 Cookie 提升效率。三、Requests 库 Cookie 操作基础Pythonrequests库内置完善的 Cookie 管理机制支持自动保存、手动携带、格式转换、查看等操作。3.1 安装 Requestspipinstallrequests3.2 方式一自动获取与携带 Cookierequests.get()/post()会自动保存响应中的 Cookie并在后续同域名请求中自动携带。importrequests# 第一次请求服务器返回 Set-Cookieurlhttps://www.baidu.comresp1requests.get(url)# 查看响应中的 Cookieprint(响应 Cookie:,resp1.cookies)# 第二次请求自动携带上一次的 Cookieresp2requests.get(url)3.3 方式二手动构造 Cookie 字典适用于已知有效 Cookie直接携带访问。importrequests# 手动构造 Cookiecookies{username:test,token:abc123xyz,sessionid:sess_98765}urlhttps://example.com/user/profileresprequests.get(url,cookiescookies)print(resp.status_code)print(resp.text[:500])3.4 方式三CookieJar 转字典resp.cookies是RequestsCookieJar对象不方便查看与修改可通过工具函数转为字典。importrequests urlhttps://www.baidu.comresprequests.get(url)# 转为字典cookie_dictrequests.utils.dict_from_cookiejar(resp.cookies)print(Cookie 字典:,cookie_dict)# 字典转回 CookieJarcookie_jarrequests.utils.cookiejar_from_dict(cookie_dict)3.5 从响应头解析 Set-Cookie服务器通过Set-Cookie头设置 Cookie可直接从响应头提取。importrequests urlhttps://example.com/logindata{username:user,password:123456}resprequests.post(url,datadata)# 获取所有 Set-Cookieset_cookieresp.headers.get(Set-Cookie)print(Set-Cookie:,set_cookie)四、Session 对象自动维持连续会话4.1 Session 作用requests.Session()创建一个会话对象该对象会自动管理 Cookie所有通过该对象发送的请求共享同一套 Cookie模拟浏览器连续操作。4.2 Session 基础用法importrequests# 创建会话srequests.Session()# 登录请求获取 Cookielogin_urlhttps://example.com/loginlogin_data{username:test_user,password:test_pwd}s.post(login_data,datalogin_data)# 后续请求自动携带登录 Cookieprofile_urlhttps://example.com/user/inforesps.get(profile_url)print(resp.text)4.3 Session 优势对比不使用 Session每次请求独立Cookie 不共享登录后立即失效。使用 SessionCookie 自动持久化模拟真实浏览器行为支持连续操作登录→浏览→退出。五、实战一模拟登录并爬取会员页面5.1 场景说明目标登录某测试网站 → 获取登录 Cookie → 访问个人中心页面 → 提取用户信息。5.2 完整代码importrequestsfromfake_useragentimportUserAgentdeflogin_and_crawl():# 初始化会话srequests.Session()uaUserAgent()headers{User-Agent:ua.random,Referer:https://example.com/login}# 1. 登录接口login_urlhttps://example.com/api/loginlogin_form{account:your_username,password:your_password,remember:1}# 发送登录请求login_resps.post(login_url,datalogin_form,headersheaders)print(登录状态码:,login_resp.status_code)print(登录返回:,login_resp.json())# 2. 访问需要登录的个人中心profile_urlhttps://example.com/user/profileprofile_resps.get(profile_url,headersheaders)ifprofile_resp.status_code200:print(成功访问个人中心)print(页面内容预览:,profile_resp.text[:1000])else:print(访问失败可能未登录)if__name____main__:login_and_crawl()5.3 关键说明使用Session确保登录 Cookie 被保存带上User-Agent、Referer模拟浏览器登录成功后再请求权限页面若网站使用 JSON 接口可使用resp.json()解析六、实战二Session 连续操作登录→个人中心→退出6.1 场景模拟完整用户行为登录 → 获取个人信息 → 查看订单 → 退出登录 → 验证是否退出成功6.2 代码实现importrequestsdefsession_flow():srequests.Session()headers{User-Agent:Mozilla/5.0}# 1. 登录login_urlhttps://example.com/logins.post(login_url,data{username:user1,pwd:123456},headersheaders)# 2. 个人中心infos.get(https://example.com/user/info,headersheaders)print(个人中心状态:,info.status_code)# 3. 订单页orders.get(https://example.com/user/order,headersheaders)print(订单页状态:,order.status_code)# 4. 退出登录logouts.get(https://example.com/logout,headersheaders)print(退出状态:,logout.status_code)# 5. 验证是否已退出checks.get(https://example.com/user/info,headersheaders)if登录incheck.text:print(已成功退出会话失效)if__name____main__:session_flow()七、实战三手动解析 Set-Cookie 并设置过期时间7.1 场景从响应头提取Set-Cookie解析名称、值、过期时间手动构造 Cookie 并设置自定义过期时间。7.2 代码importrequestsfromhttp.cookiesimportSimpleCookiedefparse_set_cookie():urlhttps://example.comresprequests.get(url)# 获取 Set-Cookieset_cookie_strresp.headers.get(Set-Cookie,)print(原始 Set-Cookie:,set_cookie_str)# 解析 CookiecookieSimpleCookie()cookie.load(set_cookie_str)# 遍历解析结果cookies{}forkey,morselincookie.items():cookies[key]morsel.valueprint(fKey:{key}, Value:{morsel.value}, Expires:{morsel[expires]})# 手动设置过期时间延长1天custom_cookiescookiesprint(手动构造带过期的 Cookie:,custom_cookies)# 携带访问resp2requests.get(url,cookiescustom_cookies)print(resp2.status_code)if__name____main__:parse_set_cookie()八、常见问题与解决方案8.1 携带 Cookie 仍登录失效原因Cookie 错误、过期、域名不匹配、缺少 HttpOnly Cookie、CSRF 校验解决抓包获取完整 Cookie、使用 Session、带上 Referer、处理 token8.2 Set-Cookie 有多个值无法解析解决使用SimpleCookie或requests.utils.dict_from_cookiejar8.3 登录需要验证码解决对接打码平台、OCR 识别、模拟滑动验证8.4 服务器禁用 Cookie解决URL 重写携带 SessionID、Token 放请求头/参数8.5 Cookie 过期太快解决登录时勾选“记住我”延长 Cookie 有效期定时刷新登录九、配图说明HTML 结构示意9.1 Cookie 与 Session 流程图 HTML9.2 Requests Session 对比图 HTML十、总结Cookie 存客户端轻量不安全Session 存服务器安全但依赖 Cookie爬虫维持登录核心正确携带有效 Cookierequests三种 Cookie 用法自动保存、手动传参、CookieJar 转换Session 对象是爬虫维持连续会话的最佳方案实战场景登录爬取、连续操作、解析 Set-Cookie、设置过期时间遇到登录失效优先检查Cookie 完整性、请求头、Session 使用、CSRF/Token掌握本文内容后可应对绝大多数需要登录的网站爬取需求同时为后续处理复杂反爬JS 加密 Cookie、Token 刷新、多账号会话池打下基础。

更多文章