跳到主要内容Python 操作 Cookie 指南:爬虫与 Web 开发实战 | 极客日志Python
Python 操作 Cookie 指南:爬虫与 Web 开发实战
Python 中操作 Cookie 的两种主要场景。在爬虫场景中,使用 requests 库获取、携带及手动设置 Cookie,模拟登录状态并维持会话。在 Web 开发场景中,分别展示了 Flask 和 Django 框架下设置、读取和删除 Cookie 的方法,包括安全配置(httponly、secure)、中文处理及跨域问题。文章还提供了常见问题排查与避坑建议,帮助开发者高效处理 Cookie 相关任务。
DockerOne1 浏览 在 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)
cookies = response.cookies
print("响应 Cookie(RequestsCookieJar 格式):")
print(cookies)
cookie_dict = requests.utils.dict_from_cookiejar(cookies)
print("\nCookie(字典格式):")
for key, value in cookie_dict.items():
print(f"{key}: {value}")
print("\n响应头中的 Set-Cookie:")
print(response.headers.get("Set-Cookie"))
3. 场景 2:携带 Cookie 发送请求(模拟登录状态)
很多网站需要登录后才能访问核心数据,此时需先登录获取 Cookie,再携带 Cookie 请求目标页面。
示例:模拟登录某测试网站(以 GitHub 简化示例)
import requests
login_url = "https://github.com/session"
login_data = {
"login": "你的 GitHub 账号",
"password": "你的 GitHub 密码",
"commit": "Sign in"
}
session = requests.Session()
response = session.post(login_url, data=login_data)
profile_url = "https://github.com/你的用户名"
profile_response = session.get(profile_url)
if "你的用户名" in profile_response.text:
print("登录成功,已携带 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"
headers = {
"Cookie": "BDUSS=xxx; BAIDUID=xxx; BIDUPSID=xxx",
"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
完整示例代码:
from flask import Flask, make_response, request
app = Flask(__name__)
@app.route("/set_cookie")
def set_cookie():
response = make_response("已为你设置 Cookie!")
response.set_cookie(
key="username",
value="zhangsan",
max_age=3600,
path="/",
secure=False,
httponly=True
)
response.set_cookie("theme", "dark", max_age=7*24*3600)
return response
@app.route("/get_cookie")
def get_cookie():
username = request.cookies.get("username")
theme = request.cookies.get("theme")
if username and theme:
return f"当前 Cookie:用户名={username},主题={theme}"
else:
return "未检测到 Cookie,请先访问/set_cookie 设置"
@app.route("/delete_cookie")
def delete_cookie():
response = make_response("已删除 Cookie!")
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
def set_cookie(request):
response = HttpResponse("Django 已设置 Cookie!")
response.set_cookie(
key="user_id",
value="1001",
max_age=3600,
path="/",
httponly=True
)
return response
def get_cookie(request):
user_id = request.COOKIES.get("user_id")
if user_id:
return HttpResponse(f"读取到 Cookie:user_id={user_id}")
else:
return HttpResponse("未找到 Cookie,请先访问/set_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() 解码:
from urllib.parse import quote, unquote
response.set_cookie("nickname", quote("张三"), max_age=3600)
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(模拟浏览器),并添加合理延时。
微信扫一扫,关注极客日志
微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
相关免费在线工具
- curl 转代码
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
- Markdown 转 HTML
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML 转 Markdown 互为补充。 在线工具,Markdown 转 HTML在线工具,online
- HTML 转 Markdown
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML 转 Markdown在线工具,online
- JSON 压缩
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online