在 Python 开发中,Cookie 的应用主要分为两大场景:爬虫(模拟浏览器获取 / 携带 Cookie) 和Web 开发(给客户端设置 Cookie)。
一、爬虫场景:用 requests 库获取 / 携带 Cookie
爬虫中操作 Cookie 的核心需求是:模拟用户登录状态 (如爬取需要登录的网站数据)、维持会话连接。requests 库是 Python 爬虫的首选工具,处理 Cookie 简洁高效。
1. 前置准备
先安装 requests 库(若未安装):
pip install requests
2. 场景 1:获取网站返回的 Cookie
访问网站时,服务器会自动返回 Cookie,用 requests 可直接提取:
import requests
\# 目标网站(以百度为例)
url = "https://www.baidu.com"
\# 发送请求,获取响应
response = requests.get(url)
\# 方式1:直接获取响应中的Cookie(RequestsCookieJar对象,类似字典)
cookies = response.cookies
print("响应Cookie(RequestsCookieJar格式):")
print(cookies)
\# 方式2:转为字典格式(更易读取)
cookie\_dict = requests.utils.dict\_from\_cookiejar(cookies)
print("\nCookie(字典格式):")
for key, value in cookie\_dict.items():
  print(f"{key}: {value}")
\# 方式3:获取响应头中的Set-Cookie(原始格式)
print("\n响应头中的Set-Cookie:")
print(response.headers.get("Set-Cookie"))
3. 场景 2:携带 Cookie 发送请求(模拟登录状态)
很多网站需要登录后才能访问核心数据,此时需先登录获取 Cookie,再携带 Cookie 请求目标页面。
示例:模拟登录某测试网站(以 GitHub 简化示例)
import requests
\# 1. 登录接口(实际开发中替换为目标网站的登录URL)
login\_url = "https://github.com/session"
\# 登录参数(需根据网站表单字段调整,可通过F12抓包获取)
login\_data = {
  "login": "你的GitHub账号",
  "password": "你的GitHub密码",
  "commit": "Sign in"
}
\# 2. 创建会话对象(自动维持Cookie,关键!)
session = requests.Session()
\# 3. 发送登录请求(会话会自动保存登录后的Cookie)
response = session.post(login\_url, data=login\_data)
\# 4. 携带Cookie访问需要登录的页面(如个人主页)
profile\_url = "https://github.com/你的用户名"
profile\_response = session.get(profile\_url)
\# 验证是否登录成功(判断页面是否包含个人信息)
if "你的用户名" in profile\_response.text:
  print("登录成功,已携带Cookie访问个人主页!")
  # 查看会话中保存的Cookie
  print("\n会话中保存的Cookie:")
  for key, value in session.cookies.get\_dict().items():
  print(f"{key}: {value}")
else:
  print("登录失败,请检查账号密码或参数格式!")
4. 场景 3:手动设置 Cookie 发送请求
若已提前获取 Cookie(如浏览器中复制),可手动构造 Cookie 发送请求:
import requests
url = "https://www.baidu.com"
\# 手动构造Cookie(字典格式,从浏览器复制的Cookie需转为键值对)
headers = {
  "Cookie": "BDUSS=xxx; BAIDUID=xxx; BIDUPSID=xxx", # 替换为实际Cookie
  "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0" # 模拟浏览器
}
response = requests.get(url, headers=headers)
print("携带手动设置的Cookie访问成功!")
爬虫操作 Cookie 注意事项:
-
用
requests.Session()自动维持会话,避免重复处理 Cookie; -
登录时的参数(如
login_data)需通过浏览器 F12 抓包获取,确保字段名与表单一致; -
部分网站的 Cookie 有过期时间,长时间爬取需定期重新登录刷新 Cookie;
-
避免频繁请求,添加
time.sleep(1)等延时,防止被封 IP。
二、Web 开发场景:Flask/Django 设置 Cookie
在 Python Web 开发中,服务器需要给客户端(浏览器)设置 Cookie,用于记住用户状态(如登录状态、用户偏好)。以下是 Flask 和 Django 框架的实操示例。
1. Flask 框架:设置 / 读取 / 删除 Cookie
前置准备:安装 Flask
pip install flask
完整示例代码:
from flask import Flask, make\_response, request
app = Flask(\_\_name\_\_)
\# 1. 设置Cookie(给客户端发送Cookie)
@app.route("/set\_cookie")
def set\_cookie():
  # 创建响应对象
  response = make\_response("已为你设置Cookie!")
   
  # 设置Cookie:key=value,max\_age=过期时间(秒),path=作用路径
  response.set\_cookie(
  key="username",
  value="zhangsan",
  max\_age=3600, # 1小时后过期
  path="/", # 整站生效
  secure=False, # 本地开发设为False,HTTPS环境设为True
  httponly=True # 禁止JavaScript读取,提升安全性
  )
   
  # 再设置一个持久Cookie(7天过期)
  response.set\_cookie("theme", "dark", max\_age=7\*24\*3600)
  return response
\# 2. 读取客户端的Cookie
@app.route("/get\_cookie")
def get\_cookie():
  # 读取Cookie:request.cookies.get(key),不存在返回None
  username = request.cookies.get("username")
  theme = request.cookies.get("theme")
   
  if username and theme:
  return f"当前Cookie:用户名={username},主题={theme}"
  else:
  return "未检测到Cookie,请先访问/set\_cookie设置"
\# 3. 删除Cookie
@app.route("/delete\_cookie")
def delete\_cookie():
  response = make\_response("已删除Cookie!")
  # 删除Cookie:key需与设置时一致,path需匹配
  response.delete\_cookie("username", path="/")
  response.delete\_cookie("theme", path="/")
  return response
if \_\_name\_\_ == "\_\_main\_\_":
  app.run(debug=True)
测试步骤:
-
运行代码,访问
http://127.0.0.1:5000/set_cookie设置 Cookie; -
访问
http://127.0.0.1:5000/get_cookie查看 Cookie; -
访问
http://127.0.0.1:5000/delete_cookie删除 Cookie。
2. Django 框架:设置 / 读取 / 删除 Cookie
前置准备:安装 Django 并创建项目
pip install django
django-admin startproject cookie\_demo
cd cookie\_demo
python manage.py startapp user
步骤 1:配置项目(cookie_demo/settings.py)
在INSTALLED_APPS中添加user:
INSTALLED\_APPS = \[
  'django.contrib.admin',
  'django.contrib.auth',
  'django.contrib.contenttypes',
  'django.contrib.sessions',
  'django.contrib.messages',
  'django.contrib.staticfiles',
  'user' # 添加这行
]
步骤 2:编写视图(user/views.py)
from django.http import HttpResponse
\# 1. 设置Cookie
def set\_cookie(request):
  response = HttpResponse("Django已设置Cookie!")
  # 设置Cookie:max\_age=秒,expires=datetime(二选一)
  response.set\_cookie(
  key="user\_id",
  value="1001",
  max\_age=3600, # 1小时过期
  path="/",
  httponly=True
  )
  return response
\# 2. 读取Cookie
def get\_cookie(request):
  # 读取Cookie:request.COOKIES是字典
  user\_id = request.COOKIES.get("user\_id")
  if user\_id:
  return HttpResponse(f"读取到Cookie:user\_id={user\_id}")
  else:
  return HttpResponse("未找到Cookie,请先访问/set\_cookie")
\# 3. 删除Cookie
def delete\_cookie(request):
  response = HttpResponse("Django已删除Cookie!")
  response.delete\_cookie("user\_id", path="/")
  return response
步骤 3:配置 URL(cookie_demo/urls.py)
from django.contrib import admin
from django.urls import path
from user.views import set\_cookie, get\_cookie, delete\_cookie
urlpatterns = \[
  path('admin/', admin.site.urls),
  path('set\_cookie/', set\_cookie),
  path('get\_cookie/', get\_cookie),
  path('delete\_cookie/', delete\_cookie),
]
测试步骤:
-
运行服务器:
python ``manage.py`` runserver; -
访问
http://127.0.0.1:8000/set_cookie设置 Cookie; -
访问
http://127.0.0.1:8000/get_cookie查看 Cookie; -
访问
http://127.0.0.1:8000/delete_cookie删除 Cookie。
Web 开发操作 Cookie 注意事项:
-
安全配置 :敏感 Cookie(如用户 ID、登录凭证)务必设置
httponly=True(防止 XSS 攻击)和secure=True(仅 HTTPS 传输); -
过期时间:避免设置过长的过期时间,敏感操作的 Cookie 建议 1 小时内过期;
-
中文处理 :若需存储中文,需用
urllib.parse.quote()编码,读取时用urllib.parse.unquote()解码:# Flask示例:存储中文Cookie
from urllib.parse import quote, unquote
response.set_cookie("nickname", quote("张三"), max_age=3600)
# 读取中文Cookie
nickname = unquote(request.cookies.get("nickname"))
-
跨域问题 :默认 Cookie 不支持跨域,若需跨域共享 Cookie,需配置
CORS_ALLOW_CREDENTIALS=True(Flask 需安装flask-cors,Django 需配置 CORS)。
三、Python 操作 Cookie 常见问题与避坑
1. 爬虫场景:Cookie 不生效
-
原因:未使用
requests.Session(),每次请求都是独立会话; -
解决:用
session = requests.Session(),所有请求通过 session 发送,自动维持 Cookie。
2. Web 开发:Cookie 设置后无法读取
-
原因 1:
path配置不一致(设置时path=/user,读取时在/路径); -
原因 2:
httponly=True导致前端 JavaScript 无法读取(但后端可正常读取); -
解决:确保设置和读取的
path一致,根据需求调整httponly参数。
3. 中文 Cookie 乱码
-
原因:Cookie 默认不支持中文,直接存储会乱码;
-
解决:用
urllib.parse.quote()编码,读取时用unquote()解码。
4. 爬虫被封 IP
-
原因:频繁请求且未携带真实 User-Agent,被网站识别为爬虫;
-
解决:在请求头中添加
User-Agent(模拟浏览器),并添加合理延时。