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

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

目录

前言

在爬虫开发中,保持登录状态是爬取会员内容、个人数据、动态交互页面的核心前提。绝大多数网站通过 Cookie 与 Session 实现用户身份识别与会话保持,若爬虫无法正确处理会话,会频繁出现登录失效、权限不足、页面跳转回登录页等问题。

本文将从原理、区别、实战三个维度,系统讲解 Cookie 与 Session 的工作机制,结合 Python Requests 库实现自动/手动管理 Cookie、使用 Session 对象维持连续会话,并通过完整可运行代码演示登录爬取、连续操作、手动解析与设置 Cookie 等场景,帮助开发者彻底掌握爬虫会话管理。

一、Cookie 与 Session 核心原理

1.1 HTTP 协议的无状态特性

HTTP 是无状态协议,服务器不会主动记忆上一次请求的用户身份。每一次请求对服务器而言都是全新的,无法区分“已登录用户”和“未登录用户”。

为了解决这一问题,Web 系统引入了会话机制,通过 Cookie + Session 组合实现用户状态持久化。

Cookie 是服务器通过 HTTP 响应头 Set-Cookie 发送给浏览器的小型文本数据,由浏览器存储在客户端(电脑/手机本地),后续每次请求同一域名时,浏览器会自动通过请求头 Cookie 带回给服务器。

  1. 存储位置:客户端(浏览器/本地文件)
  2. 存储大小:单域名一般限制 4KB 左右
  3. 可设置属性:过期时间、域名、路径、安全标志、HttpOnly 等
  4. 传输方式:随 HTTP 请求头自动发送
  5. 安全性:明文存储,易被窃取、篡改
属性作用
Name=ValueCookie 名称与值,核心内容
Expires/Max-Age过期时间,超时自动失效
Domain生效域名,仅该域名可发送此 Cookie
Path生效路径,如 /user 仅用户页生效
HttpOnly禁止 JS 读取,防 XSS 窃取
Secure仅 HTTPS 传输

1.3 Session 原理与特点

1.3.1 什么是 Session

Session 是服务器端存储的用户会话数据,服务器为每个用户创建唯一的 SessionID,并通过 Cookie 将 SessionID 发送给客户端。

客户端后续请求携带 SessionID,服务器根据 ID 查找对应会话数据,识别用户身份。

1.3.2 Session 核心特点

  1. 存储位置:服务器内存、文件、数据库、Redis
  2. 安全性:数据不暴露给客户端,安全性更高
  3. 依赖关系必须依赖 Cookie 传递 SessionID
  4. 生命周期:默认会话结束(关闭浏览器)失效,可设置超时
  5. 存储容量:远大于 Cookie,可存储复杂用户信息
对比维度CookieSession
存储位置客户端服务器端
存储大小小(约4KB)大,无严格限制
安全性低,明文可篡改高,数据不外露
服务器压力无,客户端存储有,占用服务器资源
依赖关系独立存在依赖 Cookie 传递 SessionID
生命周期可长期保存(设置过期)默认临时,可配置超时
跨端支持支持 APP、小程序、爬虫依赖客户端携带 ID

1.5 会话完整工作流程

  1. 用户首次访问网站,服务器创建 Session,生成唯一 SessionID
  2. 服务器通过 Set-Cookie 响应头将 SessionID 发送给客户端
  3. 客户端存储 Cookie,后续请求自动携带
  4. 服务器根据 SessionID 找到对应会话,识别用户身份
  5. 登录成功后,服务器在 Session 中标记用户为已登录
  6. 用户退出或超时,服务器销毁 Session,Cookie 失效

在爬虫场景下,Cookie 是维持身份的核心凭证,主要作用包括:

  1. 保持登录状态
    登录接口验证成功后,服务器返回登录 Cookie,后续请求携带该 Cookie 即可访问会员页面、个人中心、订单数据等需要权限的内容。
  2. 绕过简单反爬
    部分网站校验请求头中是否存在 Cookie,无 Cookie 直接返回 403/跳转首页。
  3. 记录用户偏好
    如主题模式、语言设置、分页数量、地域信息等。
  4. 维持动态会话
    验证码、表单令牌、csrf_token 等常与 Cookie 绑定。
  5. 避免重复登录
    批量爬取时无需每次重新登录,复用有效 Cookie 提升效率。

Python requests 库内置完善的 Cookie 管理机制,支持自动保存、手动携带、格式转换、查看等操作。

3.1 安装 Requests

pip install requests 

requests.get()/post()自动保存响应中的 Cookie,并在后续同域名请求中自动携带。

import requests # 第一次请求:服务器返回 Set-Cookie url ="https://www.baidu.com" resp1 = requests.get(url)# 查看响应中的 Cookieprint("响应 Cookie:", resp1.cookies)# 第二次请求:自动携带上一次的 Cookie resp2 = requests.get(url)

适用于已知有效 Cookie,直接携带访问。

import requests # 手动构造 Cookie cookies ={"username":"test","token":"abc123xyz","sessionid":"sess_98765"} url ="https://example.com/user/profile" resp = requests.get(url, cookies=cookies)print(resp.status_code)print(resp.text[:500])

3.4 方式三:CookieJar 转字典

resp.cookiesRequestsCookieJar 对象,不方便查看与修改,可通过工具函数转为字典。

import requests url ="https://www.baidu.com" resp = requests.get(url)# 转为字典 cookie_dict = requests.utils.dict_from_cookiejar(resp.cookies)print("Cookie 字典:", cookie_dict)# 字典转回 CookieJar cookie_jar = requests.utils.cookiejar_from_dict(cookie_dict)

服务器通过 Set-Cookie 头设置 Cookie,可直接从响应头提取。

import requests url ="https://example.com/login" data ={"username":"user","password":"123456"} resp = requests.post(url, data=data)# 获取所有 Set-Cookie set_cookie = resp.headers.get("Set-Cookie")print("Set-Cookie:", set_cookie)
在这里插入图片描述

四、Session 对象:自动维持连续会话

4.1 Session 作用

requests.Session() 创建一个会话对象,该对象会自动管理 Cookie,所有通过该对象发送的请求共享同一套 Cookie,模拟浏览器连续操作。

4.2 Session 基础用法

import requests # 创建会话 s = requests.Session()# 登录请求:获取 Cookie login_url ="https://example.com/login" login_data ={"username":"test_user","password":"test_pwd"} s.post(login_data, data=login_data)# 后续请求自动携带登录 Cookie profile_url ="https://example.com/user/info" resp = s.get(profile_url)print(resp.text)

4.3 Session 优势对比

  • 不使用 Session:每次请求独立,Cookie 不共享,登录后立即失效。
  • 使用 Session:Cookie 自动持久化,模拟真实浏览器行为,支持连续操作(登录→浏览→退出)。

五、实战一:模拟登录并爬取会员页面

5.1 场景说明

目标:登录某测试网站 → 获取登录 Cookie → 访问个人中心页面 → 提取用户信息。

5.2 完整代码

import requests from fake_useragent import UserAgent deflogin_and_crawl():# 初始化会话 s = requests.Session() ua = UserAgent() headers ={"User-Agent": ua.random,"Referer":"https://example.com/login"}# 1. 登录接口 login_url ="https://example.com/api/login" login_form ={"account":"your_username","password":"your_password","remember":"1"}# 发送登录请求 login_resp = s.post(login_url, data=login_form, headers=headers)print("登录状态码:", login_resp.status_code)print("登录返回:", login_resp.json())# 2. 访问需要登录的个人中心 profile_url ="https://example.com/user/profile" profile_resp = s.get(profile_url, headers=headers)if profile_resp.status_code ==200:print("成功访问个人中心")print("页面内容预览:", profile_resp.text[:1000])else:print("访问失败,可能未登录")if __name__ =="__main__": login_and_crawl()

5.3 关键说明

  1. 使用 Session 确保登录 Cookie 被保存
  2. 带上 User-AgentReferer 模拟浏览器
  3. 登录成功后再请求权限页面
  4. 若网站使用 JSON 接口,可使用 resp.json() 解析

六、实战二:Session 连续操作(登录→个人中心→退出)

6.1 场景

模拟完整用户行为:
登录 → 获取个人信息 → 查看订单 → 退出登录 → 验证是否退出成功

6.2 代码实现

import requests defsession_flow(): s = requests.Session() headers ={"User-Agent":"Mozilla/5.0"}# 1. 登录 login_url ="https://example.com/login" s.post(login_url, data={"username":"user1","pwd":"123456"}, headers=headers)# 2. 个人中心 info = s.get("https://example.com/user/info", headers=headers)print("个人中心状态:", info.status_code)# 3. 订单页 order = s.get("https://example.com/user/order", headers=headers)print("订单页状态:", order.status_code)# 4. 退出登录 logout = s.get("https://example.com/logout", headers=headers)print("退出状态:", logout.status_code)# 5. 验证是否已退出 check = s.get("https://example.com/user/info", headers=headers)if"登录"in check.text:print("已成功退出,会话失效")if __name__ =="__main__": session_flow()

7.1 场景

从响应头提取 Set-Cookie,解析名称、值、过期时间,手动构造 Cookie 并设置自定义过期时间。

7.2 代码

import requests from http.cookies import SimpleCookie defparse_set_cookie(): url ="https://example.com" resp = requests.get(url)# 获取 Set-Cookie set_cookie_str = resp.headers.get("Set-Cookie","")print("原始 Set-Cookie:", set_cookie_str)# 解析 Cookie cookie = SimpleCookie() cookie.load(set_cookie_str)# 遍历解析结果 cookies ={}for key, morsel in cookie.items(): cookies[key]= morsel.value print(f"Key: {key}, Value: {morsel.value}, Expires: {morsel['expires']}")# 手动设置过期时间(延长1天) custom_cookies = cookies print("手动构造带过期的 Cookie:", custom_cookies)# 携带访问 resp2 = requests.get(url, cookies=custom_cookies)print(resp2.status_code)if __name__ =="__main__": parse_set_cookie()

八、常见问题与解决方案

  • 原因:Cookie 错误、过期、域名不匹配、缺少 HttpOnly Cookie、CSRF 校验
  • 解决:抓包获取完整 Cookie、使用 Session、带上 Referer、处理 token
  • 解决:使用 SimpleCookierequests.utils.dict_from_cookiejar

8.3 登录需要验证码

  • 解决:对接打码平台、OCR 识别、模拟滑动验证
  • 解决:URL 重写携带 SessionID、Token 放请求头/参数
  • 解决:登录时勾选“记住我”,延长 Cookie 有效期;定时刷新登录

九、配图说明(HTML 结构示意)

在这里插入图片描述

9.2 Requests Session 对比图 HTML

在这里插入图片描述

十、总结

  1. Cookie 存客户端,轻量不安全;Session 存服务器,安全但依赖 Cookie
  2. 爬虫维持登录核心:正确携带有效 Cookie
  3. requests 三种 Cookie 用法:自动保存、手动传参、CookieJar 转换
  4. Session 对象是爬虫维持连续会话的最佳方案
  5. 实战场景:登录爬取、连续操作、解析 Set-Cookie、设置过期时间
  6. 遇到登录失效优先检查:Cookie 完整性、请求头、Session 使用、CSRF/Token

掌握本文内容后,可应对绝大多数需要登录的网站爬取需求,同时为后续处理复杂反爬(JS 加密 Cookie、Token 刷新、多账号会话池)打下基础。

Read more

2026年高校论文AI率新规解读:哪些学校已明确AIGC检测要求

2026年高校论文AI率新规解读:哪些学校已明确AIGC检测要求

2026年高校论文AI率新规解读:哪些学校已明确AIGC检测要求 引言:AI率检测成为毕业"新门槛" 2026年毕业季,一个让无数毕业生焦虑的新词频繁出现在各大高校的通知文件中——AIGC检测。和传统的查重率不同,AIGC检测针对的是论文中由人工智能生成内容的占比,也就是我们常说的"AI率"。 从2024年下半年开始,教育部就多次发文要求高校加强对学术不端行为的管理,其中明确将"使用AI工具代写论文"纳入学术不端范畴。进入2026年,越来越多的高校不再只是口头警示,而是将AIGC检测正式写入毕业论文管理办法,成为论文答辩前必须通过的一道硬性关卡。 那么,目前到底有哪些学校已经明确了AIGC检测要求?各校的AI率标准又是多少?这篇文章将为你全面梳理和解读2026年的高校论文AI率新规。 一、政策背景:为什么高校越来越重视AI率检测 1.1 AI写作工具的普及倒逼政策升级 ChatGPT在2022年底横空出世后,以其为代表的大语言模型迅速普及。国内如文心一言、通义千问、讯飞星火等AI工具相继上线,AI写作的门槛被大幅降低。据不完全统计,2025年有超过60%的在校大学生使

AI绘画教学新方案:Z-Image-Turbo镜像快速搭建指南

AI绘画教学新方案:Z-Image-Turbo镜像快速搭建指南 在高校数字艺术、新媒体技术或AI通识课的教学实践中,教师常面临一个现实困境:学生笔记本显卡型号五花八门,RTX 3050、MX450甚至核显比比皆是,而主流文生图模型动辄需要16GB显存和复杂环境配置。一堂45分钟的AI绘画实操课,往往有20分钟耗在“pip install失败”“CUDA版本不匹配”“模型下载中断”上。Z-Image-Turbo镜像正是为解决这一痛点而生——它不是又一个需要手动折腾的开源项目,而是一台“插电即亮”的AI画板。本文将手把手带你完成从零到生成第一张高清图像的全过程,全程无需下载模型、无需编译依赖、无需修改配置,真正实现“打开就能教,运行就能出图”。 1. 为什么Z-Image-Turbo是教学场景的理想选择 Z-Image-Turbo并非普通优化版扩散模型,而是阿里通义实验室专为高吞吐、低延迟、强鲁棒性场景设计的DiT架构轻量化实现。对教学而言,它的价值不在于参数有多炫酷,而在于三个“刚刚好”: * 显存占用刚刚好:在RTX 4090D(24GB显存)上实测,加载后仅占用约13.2

1000多万次播放背后的AIGC方法论:从爆款视频《牌子》开始思考

这篇深度分析文章,基于《牌子》(SIGN)这部现象级AIGC短片的全面拆解,构建一套完整的AIGC内容创作方法论。将分章节系统性地展开,涵盖技术解析、创作方法论、产业影响和未来展望等多个维度。 引言:一个内容事件的诞生 2026年初,中国视频平台Bilibili上出现了一条名为《牌子》(SIGN)的7分钟短片。这部由独立创作者使用AI工具制作的奇幻短片,在一周内获得了超过1000万次播放、80多万点赞、30多万投币,被著名导演郭帆转发点赞,在YouTube上引发国际观众的热议,甚至专业影视后期团队都在上班时间逐帧分析其制作技术。 这不是一次简单的"技术展示",而是一个内容事件的诞生——它标志着AIGC(人工智能生成内容)从"实验室玩具"正式迈入"大众审美"的领域。更重要的是,它证明了一件事:在正确的创作方法论指导下,单个创作者借助AI工具,可以产出媲美专业团队的内容。 本文将从《牌子》的逐帧技术解析出发,深入探讨其背后的创作逻辑,提炼出一套可复用的AIGC内容创作方法论,

Ops-CV库介绍:赋能AIGC多模态视觉生成的加速利器

Ops-CV库介绍:赋能AIGC多模态视觉生成的加速利器

前言 Ops-CV是昇腾CANN生态专属的视觉算子库,核心定位是为视觉处理任务提供高效、轻量化的昇腾NPU原生加速能力,其不仅覆盖传统计算机视觉全流程,更深度适配当前AIGC多模态生成场景(图像生成、图文联动生成、AIGC内容优化等),成为连接AIGC模型与昇腾硬件的核心桥梁,解决AIGC视觉生成中“耗时高、适配难、算力利用率低”的核心痛点,助力AIGC多模态应用快速落地。 在AIGC多模态技术快速迭代的当下,图像生成(如Stable Diffusion等潜在扩散模型)、图文联动生成已成为主流应用方向,但这类场景的视觉处理环节(生成图像预处理、特征对齐、内容优化、端侧适配)往往面临瓶颈——AIGC模型生成的图像需经过一系列视觉优化才能适配下游场景,常规视觉库无法高效利用昇腾NPU算力,导致生成-优化全流程延迟偏高,且难以适配边缘端低功耗、低内存的部署需求,而ops-cv的出现恰好填补了这一空白。 一、Ops-CV核心定位与AIGC适配基础 Ops-CV并非通用视觉库,而是深度绑定昇腾CANN生态、专为硬件加速设计的视觉算子集合,其核心能力围绕“视觉处理全流程加速”展开,涵盖图