首页 / DrissionPage 入门教程 / 模式切换

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 切换

  1. 用当前浏览器 URL 创建 Session 请求
  2. 复制浏览器 cookies 到 Session
  3. 后续 get()ele() 等方法走 requests

s → d 切换

  1. 初始化浏览器驱动
  2. 用 Session 的 cookies 设置浏览器
  3. 浏览器访问 Session 的当前 URL
  4. 后续操作走 CDP 控制浏览器

切换后的差异

能力d 模式s 模式
控制浏览器不能(只能调 d 模式独有方法)
执行 JS不能
截图不能
元素类型ChromiumElementSessionElement
速度慢(要启动浏览器)

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 模式。