本文目录导读:

- 使用 requests 库操作 Cookie
- 使用 http.cookiejar 模块
- 使用 Selenium 操作浏览器 Cookie
- Cookie 解析和处理
- 实战案例:自动登录和保持会话
- Cookie 安全注意事项
- 使用 Flask 框架操作 Cookie
我来详细讲解 Python 操作 Cookie 数据的几种常见方式:
使用 requests 库操作 Cookie
基本用法
import requests
# 方法1:直接设置 Cookie
url = "https://httpbin.org/cookies"
cookies = {"user": "admin", "session": "12345"}
response = requests.get(url, cookies=cookies)
print(response.text)
# 方法2:使用 CookieJar
from http.cookiejar import CookieJar
jar = CookieJar()
response = requests.get(url, cookies=jar)
会话维持
# 使用 Session 自动管理 Cookie
session = requests.Session()
# 第一次请求(登录)
login_data = {
"username": "user123",
"password": "pass123"
}
session.post("https://example.com/login", data=login_data)
# 后续请求自动携带 Cookie
response = session.get("https://example.com/dashboard")
print(response.text)
# 查看看所有 Cookie
for cookie in session.cookies:
print(f"{cookie.name}: {cookie.value}")
使用 http.cookiejar 模块
from http.cookiejar import CookieJar, Cookie
import urllib.request
# 创建 Cookie 管理器
cookie_jar = CookieJar()
# 手动创建 Cookie
from datetime import datetime, timedelta
cookie = Cookie(
version=0,
name='session_id',
value='abc123',
port=None,
port_specified=False,
domain='.example.com',
domain_specified=True,
domain_initial_dot=True,
path='/',
path_specified=True,
secure=False,
expires=int((datetime.now() + timedelta(days=30)).timestamp()),
discard=False,
comment=None,
comment_url=None,
rest={'HttpOnly': None},
rfc2109=False
)
# 添加 Cookie
cookie_jar.set_cookie(cookie)
# 创建 URL 处理器
opener = urllib.request.build_opener(
urllib.request.HTTPCookieProcessor(cookie_jar)
)
# 发送请求
response = opener.open("https://httpbin.org/cookies")
print(response.read().decode())
使用 Selenium 操作浏览器 Cookie
from selenium import webdriver
# 启动浏览器
driver = webdriver.Chrome()
driver.get("https://example.com")
# 获取所有 Cookie
cookies = driver.get_cookies()
print(cookies)
# 获取特定 Cookie
cookie = driver.get_cookie("session_id")
print(cookie)
# 添加 Cookie
new_cookie = {
"name": "user_id",
"value": "12345",
"domain": "example.com",
"path": "/",
"expiry": 1735689600 # 可选,Unix 时间戳
}
driver.add_cookie(new_cookie)
# 删除 Cookie
driver.delete_cookie("session_id") # 删除特定 Cookie
driver.delete_all_cookies() # 删除所有 Cookie
# 保存和加载 Cookie
import pickle
# 保存 Cookie 到文件
with open("cookies.pkl", "wb") as file:
pickle.dump(driver.get_cookies(), file)
# 从文件加载 Cookie
driver.get("https://example.com") # 先访问域名
with open("cookies.pkl", "rb") as file:
cookies = pickle.load(file)
for cookie in cookies:
driver.add_cookie(cookie)
Cookie 解析和处理
import http.cookies
# 解析 Cookie 字符串
cookie_string = "user=john; session=abc123; lang=zh-CN"
cookies = http.cookies.SimpleCookie(cookie_string)
# 访问 Cookie
print(cookies['user'].value) # 输出: john
# 遍历所有 Cookie
for key, morsel in cookies.items():
print(f"{key}: {morsel.value}")
print(f" 属性: {morsel.coded_value}")
# 创建新的 Cookie
new_cookie = http.cookies.SimpleCookie()
new_cookie['session'] = 'xyz789'
new_cookie['session']['domain'] = 'example.com'
new_cookie['session']['path'] = '/'
new_cookie['session']['httponly'] = True
new_cookie['session']['secure'] = True
new_cookie['session']['max-age'] = 3600 # 1小时
print(new_cookie.output()) # 输出完整的 Cookie 字符串
实战案例:自动登录和保持会话
import requests
from bs4 import BeautifulSoup
class WebsiteAgent:
def __init__(self):
self.session = requests.Session()
self.session.headers.update({
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
})
def login(self, login_url, username, password):
# 获取登录页面(获取 CSRF Token)
response = self.session.get(login_url)
soup = BeautifulSoup(response.text, 'html.parser')
# 提取 CSRF Token(示例)
csrf_token = soup.find('input', {'name': 'csrf_token'}).get('value')
# 提交登录
login_data = {
'username': username,
'password': password,
'csrf_token': csrf_token
}
response = self.session.post(login_url, data=login_data)
if response.status_code == 200:
print("登录成功")
return True
return False
def access_protected(self, url):
# 使用已保存的 Cookie 访问受保护页面
response = self.session.get(url)
return response.text
def save_cookies(self, filepath):
# 保存 Cookie 到文件
import json
cookies = [
{
'domain': c.domain,
'name': c.name,
'value': c.value,
'path': c.path,
'secure': c.secure
}
for c in self.session.cookies
]
with open(filepath, 'w') as f:
json.dump(cookies, f)
def load_cookies(self, filepath):
# 从文件加载 Cookie
import json
with open(filepath, 'r') as f:
cookies = json.load(f)
for cookie_data in cookies:
self.session.cookies.set(**cookie_data)
# 使用示例
agent = WebsiteAgent()
# 登录
if agent.login('https://example.com/login', 'user123', 'pass123'):
# 保存 Cookie
agent.save_cookies('my_cookies.json')
# 访问受保护页面
content = agent.access_protected('https://example.com/dashboard')
print(content)
Cookie 安全注意事项
import hmac
import hashlib
import base64
class CookieSecurity:
@staticmethod
def sign_cookie(value, secret_key):
"""签名 Cookie 以防篡改"""
signature = hmac.new(
secret_key.encode(),
value.encode(),
hashlib.sha256
).hexdigest()
return f"{value}.{signature}"
@staticmethod
def verify_cookie(signed_value, secret_key):
"""验证 Cookie 签名"""
parts = signed_value.split('.')
if len(parts) != 2:
return None
value, signature = parts
expected_sig = hmac.new(
secret_key.encode(),
value.encode(),
hashlib.sha256
).hexdigest()
# 安全比较,防止时序攻击
if hmac.compare_digest(signature, expected_sig):
return value
return None
@staticmethod
def encrypt_cookie(value, key):
"""加密 Cookie 中的敏感信息"""
from cryptography.fernet import Fernet
f = Fernet(base64.urlsafe_b64encode(key.encode().ljust(32)[:32]))
return f.encrypt(value.encode()).decode()
@staticmethod
def decrypt_cookie(encrypted_value, key):
"""解密 Cookie"""
from cryptography.fernet import Fernet
f = Fernet(base64.urlsafe_b64encode(key.encode().ljust(32)[:32]))
return f.decrypt(encrypted_value.encode()).decode()
# 使用示例
security = CookieSecurity()
secret = "my_secret_key_123"
# 签名 Cookie
signed = security.sign_cookie("user_id=12345", secret)
print(f"签名后的 Cookie: {signed}")
# 验证 Cookie
verified = security.verify_cookie(signed, secret)
print(f"验证结果: {verified}")
使用 Flask 框架操作 Cookie
from flask import Flask, request, make_response
app = Flask(__name__)
@app.route('/set_cookie')
def set_cookie():
response = make_response("Cookie 已设置")
# 设置 Cookie
response.set_cookie(
'username',
'john',
max_age=3600, # 过期时间(秒)
expires=None, # 可选:具体的过期时间
path='/', # Cookie 路径
domain=None, # Cookie 域名
secure=False, # 是否仅 HTTPS
httponly=True, # 是否仅 HTTP(防止 JS 访问)
samesite='Lax' # SameSite 策略
)
return response
@app.route('/update_cookie')
def update_cookie():
response = make_response("Cookie 已更新")
response.set_cookie('username', 'jane')
return response
@app.route('/delete_cookie')
def delete_cookie():
response = make_response("Cookie 已删除")
response.delete_cookie('username')
return response
@app.route('/read_cookies')
def read_cookies():
# 读取所有 Cookie
cookies = request.cookies
username = cookies.get('username', '未设置')
return f"用户名: {username}"
if __name__ == '__main__':
app.run()
这些方法涵盖了 Python 中操作 Cookie 的主要场景,从简单的 HTTP 请求到 Web 框架的应用都有涉及,选择哪种方法取决于你的具体需求和使用场景。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播