Python操作Cookie的完全指南

Written by

in

文章目录
  • 爬虫中操作 Cookie 的核心需求是:模拟用户登录状态(如爬取需要登录的网站数据)、维持会话连接。requests 库是 Python 爬虫的首选工具,处理 Cookie 简洁高效。
  • 在 Python Web 开发中,服务器需要给客户端(浏览器)设置 Cookie,用于记住用户状态(如登录状态、用户偏好)。以下是 Flask 和 Django 框架的实操示例。
  • 目录
    • 一、爬虫场景:用 requests 库获取 / 携带 Cookie
      • 1. 前置准备
      • 2. 场景 1:获取网站返回的 Cookie
      • 3. 场景 2:携带 Cookie 发送请求(模拟登录状态)
        • 示例:模拟登录某测试网站(以 GitHub 简化示例)
      • 4. 场景 3:手动设置 Cookie 发送请求
        • 爬虫操作 Cookie 注意事项:
        • 二、Web 开发场景:Flask/Django 设置 Cookie
          • 1. Flask 框架:设置 / 读取 / 删除 Cookie
            • 前置准备:安装 Flask
            • 完整示例代码:
            • 测试步骤:
          • 2. Django 框架:设置 / 读取 / 删除 Cookie
            • 前置准备:安装 Django 并创建项目
            • 步骤 1:配置项目(cookie_demo/settings.py)
            • 步骤 2:编写视图(user/views.py)
            • 步骤 3:配置 URL(cookie_demo/urls.py)
            • 测试步骤:
          • Web 开发操作 Cookie 注意事项:
          • 三、Python 操作 Cookie 常见问题与避坑
            • 1. 爬虫场景:Cookie 不生效
              • 2. Web 开发:Cookie 设置后无法读取
                • 3. 中文 Cookie 乱码
                  • 4. 爬虫被封 IP

                  在 Python 开发中,Cookie 的应用主要分为两大场景:爬虫(模拟浏览器获取 / 携带 Cookie)Web 开发(给客户端设置 Cookie)

                  爬虫中操作 Cookie 的核心需求是:模拟用户登录状态(如爬取需要登录的网站数据)、维持会话连接。requests 库是 Python 爬虫的首选工具,处理 Cookie 简洁高效。

                  先安装 requests 库(若未安装):

                  pip install requests
                  

                  访问网站时,服务器会自动返回 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"))
                  

                  很多网站需要登录后才能访问核心数据,此时需先登录获取 Cookie,再携带 Cookie 请求目标页面。

                  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("登录失败,请检查账号密码或参数格式!")
                  

                  若已提前获取 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访问成功!")
                  

                  • requests.Session()自动维持会话,避免重复处理 Cookie;
                  • 登录时的参数(如login_data)需通过浏览器 F12 抓包获取,确保字段名与表单一致;
                  • 部分网站的 Cookie 有过期时间,长时间爬取需定期重新登录刷新 Cookie;
                  • 避免频繁请求,添加time.sleep(1)等延时,防止被封 IP。

                  在 Python Web 开发中,服务器需要给客户端(浏览器)设置 Cookie,用于记住用户状态(如登录状态、用户偏好)。以下是 Flask 和 Django 框架的实操示例。

                  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)
                  

                  1. 运行代码,访问http://127.0.0.1:5000/set_cookie设置 Cookie;
                  2. 访问http://127.0.0.1:5000/get_cookie查看 Cookie;
                  3. 访问http://127.0.0.1:5000/delete_cookie删除 Cookie。

                  pip install django
                  
                  django-admin startproject cookie_demo
                  
                  cd cookie_demo
                  
                  python manage.py startapp user
                  

                  INSTALLED_APPS中添加user

                  INSTALLED_APPS = [
                  
                      'django.contrib.admin',
                  
                      'django.contrib.auth',
                  
                      'django.contrib.contenttypes',
                  
                      'django.contrib.sessions',
                  
                      'django.contrib.messages',
                  
                      'django.contrib.staticfiles',
                  
                      'user'  # 添加这行
                  
                  ]
                  

                  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
                  

                  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),
                  
                  ]
                  

                  1. 运行服务器:python ``manage.py`` runserver
                  2. 访问http://127.0.0.1:8000/set_cookie设置 Cookie;
                  3. 访问http://127.0.0.1:8000/get_cookie查看 Cookie;
                  4. 访问http://127.0.0.1:8000/delete_cookie删除 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)。

                  • 原因:未使用requests.Session(),每次请求都是独立会话;
                  • 解决:用session = requests.Session(),所有请求通过 session 发送,自动维持 Cookie。

                  • 原因 1:path配置不一致(设置时path=/user,读取时在/路径);
                  • 原因 2:httponly=True导致前端 JavaScript 无法读取(但后端可正常读取);
                  • 解决:确保设置和读取的path一致,根据需求调整httponly参数。

                  • 原因:Cookie 默认不支持中文,直接存储会乱码;
                  • 解决:用urllib.parse.quote()编码,读取时用unquote()解码。

                  • 原因:频繁请求且未携带真实 User-Agent,被网站识别为爬虫;
                  • 解决:在请求头中添加User-Agent(模拟浏览器),并添加合理延时。

                  以上就是Python操作Cookie的完全指南的详细内容,更多关于Python操作Cookie指南的资料请关注风君子博客其它相关文章!

                  您可能感兴趣的文章:

                  • Python Selenium操作Cookie的技巧与测试场景详解
                  • python实战scrapy操作cookie爬取博客涉及browsercookie
                  • Python中Selenium对Cookie的操作方法
                  • Python Selenium操作Cookie的实例方法
                  • python selenium操作cookie的实现

                  站内搜索