首页 / DrissionPage 入门教程 / Cookies 管理

DrissionPage 入门教程

Cookies 管理

本教程共 42 篇 · 第 38 篇 · 更新于 2026-07-29 · 约 5 分钟阅读

DrissionPageDrissionPage 入门教程Cookies会话管理cookie 导入导出

38. Cookies 管理

本节目标:学会获取和设置 cookies,搞懂 cookies 的多种格式,能灵活导入导出。

获取 cookies

DrissionPage 提供了 cookies() 方法。

from DrissionPage import WebPage

page = WebPage()
page.get('https://example.com')

# 获取当前页面的 cookies
cookies = page.cookies()
print(cookies)

返回的是一个列表,每个元素是一个字典:

[
    {'name': 'session_id', 'value': 'abc123', 'domain': '.example.com', 'path': '/'},
    {'name': 'theme', 'value': 'dark', 'domain': '.example.com', 'path': '/'}
]

常用字段包括:namevaluedomainpathexpiressecurehttpOnly

获取所有域的 cookies

默认只返回当前域名的 cookies。

想拿所有域的,加个参数:

# 获取浏览器中所有 cookies
all_cookies = page.cookies(all_domains=True)
print(f'共 {len(all_cookies)} 个 cookies')

设置 cookies

set.cookies() 方法:

# 设置单个 cookie
page.set.cookies({'name': 'token', 'value': 'xyz789'})

# 设置多个 cookie
page.set.cookies([
    {'name': 'a', 'value': '1'},
    {'name': 'b', 'value': '2'}
])

也能传字符串:

# 字符串格式
page.set.cookies('name=value; token=abc123')

删除 cookies

# 删除指定 cookie
page.set.cookies({'name': 'token', 'value': '', 'expires': 0})

# 清除所有 cookies(浏览器模式)
page.browser.clear_cookies()

cookies 格式转换

DrissionPage 支持多种 cookies 格式互转。

转成字典

cookies = page.cookies()

# 转成 {name: value} 字典
cookie_dict = {c['name']: c['value'] for c in cookies}
print(cookie_dict)

转成字符串

# 拼成请求头格式的字符串
cookie_str = '; '.join(f'{c["name"]}={c["value"]}' for c in cookies)
print(cookie_str)
# 输出: session_id=abc123; theme=dark

转成 JSON

import json

cookies = page.cookies()
json_str = json.dumps(cookies, ensure_ascii=False, indent=2)
print(json_str)

导入 cookies 实现登录

一个常见用法:手动登录后导出 cookies,下次直接导入跳过登录。

# 第一次:手动登录后保存 cookies
page.get('https://example.com/login')
# ... 手动登录 ...
cookies = page.cookies()

import json
with open('cookies.json', 'w') as f:
    json.dump(cookies, f)

# 第二次:直接导入 cookies
with open('cookies.json', 'r') as f:
    saved_cookies = json.load(f)

page.get('https://example.com')
page.set.cookies(saved_cookies)
page.refresh()  # 刷新后登录状态生效

SessionPage 的 cookies

SessionPage 也能管理 cookies,用法略有不同:

from DrissionPage import SessionPage

page = SessionPage()
page.get('https://example.com')

# 获取 cookies(返回 RequestsCookieJar)
cookies = page.cookies()
print(cookies)

# 设置 cookies
page.session.cookies.set('name', 'value')

浏览器与 Session 之间共享 cookies

WebPage 模式可以在浏览器和数据包模式之间共享 cookies:

from DrissionPage import WebPage

page = WebPage()

# 浏览器模式登录
page.get('https://example.com/login')
page.ele('#username').input('user')
page.ele('#password').input('pass')
page.ele('#login-btn').click()

# 切换到 Session 模式
page.change_mode()

# Session 模式也能用登录状态
page.get('https://example.com/profile')

如 §31 所述,change_mode() 会保留 cookies 和会话状态。

实用技巧

cookies = page.cookies()
token = next((c['value'] for c in cookies if c['name'] == 'token'), None)
print(f'token: {token}')
cookies = page.cookies()
has_token = any(c['name'] == 'token' for c in cookies)
print(f'有 token: {has_token}')

批量导入 cookies

# 从浏览器导出 cookies 给 SessionPage 用
from DrissionPage import WebPage, SessionPage

# 浏览器模式获取
wp = WebPage()
wp.get('https://example.com')
cookies = wp.cookies()
wp.quit()

# 转成 SessionPage 可用的格式
sp = SessionPage()
for c in cookies:
    sp.session.cookies.set(c['name'], c['value'], domain=c.get('domain', ''))

sp.get('https://example.com')

注意事项

  1. domain 必须匹配:设置 cookie 时 domain 要和页面匹配
  2. secure 标志:HTTPS 页面的 cookie 可能带 secure 标志,HTTP 下无法读取
  3. httpOnly:httpOnly 的 cookie 没法通过 JS 读取,但 cookies() 方法能拿到
  4. 过期时间:过期的 cookie 会被浏览器自动清理

小结

DrissionPage 的 cookies 管理很灵活。

cookies() 获取,set.cookies() 设置,支持字典、列表、字符串多种格式。

浏览器和 Session 之间可以通过 change_mode() 共享 cookies。