DrissionPage 入门教程
模式切换
本教程共 42 篇 · 第 31 篇 · 更新于 2026-07-29 · 约 7 分钟阅读
DrissionPageDrissionPage 入门教程模式切换change_moded模式s模式WebPage
31. 模式切换
本节目标:理解 d 模式和 s 模式的区别,掌握 change_mode() 切换方法,知道什么时候该切换、切换时会发生什么。
DrissionPage 的 WebPage 和 MixTab 对象有两种工作模式。
- d 模式(driver):控制浏览器,用 CDP 协议驱动 Chromium
- s 模式(session):用 requests 库收发数据包,不启动浏览器
两种模式共用一套 API,切过去之后代码写法基本不变。
为什么要切换模式
一个典型场景:网站登录检查很严格,需要浏览器处理验证码、JS 挑战。
登录完之后,数据采集其实用 requests 就够了,还更快。
这时候就可以:浏览器登录 → 切 s 模式 → 高效采集。
基本切换
from DrissionPage import Chromium
tab = Chromium().latest_tab
tab.get('http://DrissionPage.cn')
print(tab.title) # d 模式下获取标题
tab.change_mode() # 切换到 s 模式,会自动访问当前 URL
print(tab.title) # s 模式下获取标题
输出:
DrissionPage官网
DrissionPage官网
切换时同步 cookies
change_mode()默认会把当前 cookies 复制到目标模式,保持登录状态。
change_mode() 参数
tab.change_mode(
mode=None, # 's' 或 'd',None 表示切到另一个模式
go=True, # 切完后是否访问当前 URL
copy_cookies=True # 是否复制 cookies
)
指定目标模式
tab.change_mode('s') # 切到 s 模式
tab.change_mode('d') # 切回 d 模式
tab.change_mode() # 不管当前是什么,切到另一个
不自动跳转
# 切到 s 模式但不自动访问 URL
tab.change_mode('s', go=False)
# 然后自己构造 headers 再访问
tab.get('https://api.example.com/data')
不复制 cookies
tab.change_mode(copy_cookies=False)
查看当前模式
print(tab.mode) # 'd' 或 's'
模式切换时的行为
d → s 切换
- 用当前浏览器 URL 创建 Session 请求
- 复制浏览器 cookies 到 Session
- 后续
get()、ele()等方法走 requests
s → d 切换
- 初始化浏览器驱动
- 用 Session 的 cookies 设置浏览器
- 浏览器访问 Session 的当前 URL
- 后续操作走 CDP 控制浏览器
切换后的差异
| 能力 | d 模式 | s 模式 |
|---|---|---|
| 控制浏览器 | 能 | 不能(只能调 d 模式独有方法) |
| 执行 JS | 能 | 不能 |
| 截图 | 能 | 不能 |
| 元素类型 | ChromiumElement | SessionElement |
| 速度 | 慢(要启动浏览器) | 快 |
s 模式下 ele() 找的是静态 HTML
切到 s 模式后,
ele()和eles()查找的是 requests 拿到的静态 HTML,不是浏览器渲染后的 DOM。JS 动态渲染的内容拿不到。
切换前获取的元素还能用吗?
能。切换模式前已经获取到的元素对象可以继续使用。
但切换后新获取的元素,类型会跟着当前模式走。
tab.get('https://example.com')
ele_d = tab.ele('#title') # ChromiumElement
tab.change_mode('s')
# ele_d 仍然可用
print(ele_d.text)
# 但新获取的是 SessionElement
ele_s = tab.ele('#title') # SessionElement
cookies 双向同步
除了 change_mode() 自动同步,还可以手动复制 cookies:
# 浏览器 → Session
tab.cookies_to_session()
# Session → 浏览器
tab.cookies_to_browser()
cookies_to_session() 还可以选择是否复制 user agent:
tab.cookies_to_session(copy_user_agent=True)
实际场景:浏览器登录后切 s 模式采集
from DrissionPage import Chromium
tab = Chromium().latest_tab
# d 模式登录
tab.get('https://example.com/login')
tab('#username').input('admin')
tab('#password').input('123456')
tab('#login-btn').click()
# 等登录完成
tab.wait.url_changes('login')
# 切到 s 模式,cookies 自动同步
tab.change_mode('s')
# 现在用 requests 的方式高效采集
for page in range(1, 11):
tab.get(f'https://example.com/data?page={page}')
items = tab.eles('.data-item')
for item in items:
print(item.text)
什么时候切换
登录、验证码、JS 挑战用 d 模式,纯数据请求用 s 模式。切换一次就行,不用来回切。
小结
模式切换是 DrissionPage 的核心能力之一:
change_mode()一键切换,自动同步 cookies- d 模式功能全但慢,s 模式快但只能处理静态内容
- 切换前后的元素对象互不干扰
记住一个原则:能用 s 模式搞定就不用开浏览器,遇到必须浏览器的场景再切回 d 模式。