Python案例如何操作Cookie数据?

wen python案例 14

本文目录导读:

Python案例如何操作Cookie数据?

  1. 使用 requests 库操作 Cookie
  2. 使用 http.cookiejar 模块
  3. 使用 Selenium 操作浏览器 Cookie
  4. Cookie 解析和处理
  5. 实战案例:自动登录和保持会话
  6. Cookie 安全注意事项
  7. 使用 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 框架的应用都有涉及,选择哪种方法取决于你的具体需求和使用场景。

抱歉,评论功能暂时关闭!