Skip to content

DrissionPage

DrissionPage 是一个基于 Python 的网页自动化工具。它既能控制浏览器,也能收发数据包,还能把两者合而为一,兼顾浏览器自动化的便利性和 HTTP 请求的高效率。

Drission = Driver + Session,意为"双模式",读作"拽神"。

核心特性

双模式一体

DrissionPage 最大的特点是同时集成了两种操作模式:

模式说明适用场景
ChromiumPage控制浏览器(基于 CDP 协议)需要执行 JS、处理复杂交互、绕过反爬
SessionPage收发数据包(类似 requests)纯数据抓取、API 调用、高性能场景

两种模式可以无缝切换,例如先用 SessionPage 快速获取页面数据,遇到需要执行 JS 的场景再切换到 ChromiumPage。

与同类工具对比

特性DrissionPageSeleniumPlaywrightPuppeteer
语言Python多语言多语言JS/TS
浏览器控制
HTTP 请求
模式切换内置需额外库需额外库需额外库
学习成本
无需 WebDriver

亮点功能

  • 无需 WebDriver:直接通过 CDP(Chrome DevTools Protocol)控制浏览器,省去驱动配置
  • 元素查找便捷:支持 CSS、XPath、文本、属性等多种定位方式
  • iFrame 自动穿透:操作 iframe 中的元素无需手动切换
  • Shadow DOM 支持:直接操作 Shadow DOM 内部元素
  • 自动等待:元素操作自带智能等待,减少显式等待代码
  • 并发安全:支持多标签页并发操作
  • 内置下载工具:支持大文件分块多线程下载

安装

bash
pip install DrissionPage

建议使用最新版本以获取完整功能支持。

快速上手

浏览器控制模式(ChromiumPage)

python
from DrissionPage import ChromiumPage

# 创建页面对象(自动启动浏览器)
page = ChromiumPage()

# 访问网页
page.get('https://www.baidu.com')

# 定位搜索框并输入
page.ele('#kw').input('DrissionPage')

# 点击搜索按钮
page.ele('#su').click()

# 获取搜索结果
results = page.eles('.result')
for item in results:
    print(item.text)

# 截图
page.screenshot('baidu_search.png')

# 关闭浏览器
page.quit()

数据包模式(SessionPage)

python
from DrissionPage import SessionPage

# 创建 Session 页面对象
page = SessionPage()

# 发送 GET 请求
page.get('https://httpbin.org/get')
print(page.json)

# 发送 POST 请求
page.post('https://httpbin.org/post', data={'key': 'value'})
print(page.json)

# 解析 HTML
page.get('https://www.baidu.com')
title = page.ele('title')
print(title.text)

模式无缝切换

python
from DrissionPage import ChromiumPage

page = ChromiumPage()

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

# 登录后切换到 Session 模式进行高效抓取
session = page.change_mode()
session.get('https://example.com/data/api/list')
data = session.json
print(data)

元素定位

DrissionPage 提供了丰富的元素定位方式:

python
# CSS 选择器
page.ele('#id')
page.ele('.class')
page.ele('div > p')

# XPath
page.ele('xpath://div[@class="content"]')

# 文本匹配
page.ele('text:下一页')
page.ele('text:登录')

# 属性定位
page.ele('@name=username')
page.ele('@id=submit')

# 标签定位
page.ele('tag:input')
page.ele('tag:div@@class=container')

# 组合定位
page.ele('#form @@text:提交')

ele() 返回单个元素,eles() 返回元素列表。

常见应用场景

网页数据采集

python
from DrissionPage import ChromiumPage

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

# 遍历列表提取数据
items = page.eles('.item-card')
data_list = []
for item in items:
    data_list.append({
        'title': item.ele('.title').text,
        'price': item.ele('.price').text,
        'link': item.ele('a').attr('href')
    })

page.quit()

自动化表单填写

python
from DrissionPage import ChromiumPage

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

# 填写表单
page.ele('#name').input('张三')
page.ele('#email').input('zhangsan@example.com')

# 下拉选择
page.ele('#city').select('北京')

# 文件上传
page.ele('#file').input(r'C:\Users\test\file.pdf')

# 提交
page.ele('#submit').click()

# 等待结果
page.wait.ele_displayed('.success-msg')
print('提交成功')

处理弹窗与对话框

python
from DrissionPage import ChromiumPage

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

# 处理 alert/confirm/prompt
page.ele('#alert-btn').click()
print(page.alert_text)  # 获取弹窗文本
page.alert.accept()       # 确认弹窗

# 处理自定义弹窗
if page.ele('.modal-dialog'):
    page.ele('.modal-close').click()

下载文件

python
from DrissionPage import ChromiumPage

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

# 触发下载
page.ele('#download-btn').click()

# 等待下载完成
page.wait.download_begun()
download = page.download
download.save(r'D:\downloads')  # 指定保存路径

配置与优化

常用初始化参数

python
from DrissionPage import ChromiumPage, ChromiumOptions

# 配置选项
options = ChromiumOptions()
options.set_argument('--headless')         # 无头模式
options.set_argument('--disable-gpu')      # 禁用 GPU
options.set_argument('--no-sandbox')       # 沙箱模式
options.set_user_agent('custom-agent-string')

# 创建页面
page = ChromiumPage(options)

无头模式运行

python
from DrissionPage import ChromiumPage, ChromiumOptions

co = ChromiumOptions()
co.set_argument('--headless')
page = ChromiumPage(co)
page.get('https://www.baidu.com')
print(page.title)
page.quit()

反检测配置

python
from DrissionPage import ChromiumPage, ChromiumOptions

co = ChromiumOptions()
# 隐藏自动化痕迹
co.set_argument('--disable-blink-features=AutomationControlled')
# 设置真实窗口大小
co.set_argument('--window-size=1920,1080')

page = ChromiumPage(co)

常见问题

浏览器闪退

确保 Chrome/Chromium 版本与 DrissionPage 兼容,或指定浏览器路径:

python
from DrissionPage import ChromiumOptions

co = ChromiumOptions()
co.set_browser_path(r'C:\Program Files\Google\Chrome\Application\chrome.exe')

元素未找到

检查是否在正确的 iframe 中。DrissionPage 自动穿透 iframe,但如果元素在跨域 iframe 中可能需要手动切换:

python
# 进入 iframe
iframe = page.ele('#frame-id')
page = iframe.inner_page

# 操作 iframe 内元素
page.ele('.target').click()

与 Selenium/Playwright 对比选择

场景推荐工具
Python 项目,快速开发DrissionPage
多语言支持、团队协作Playwright
遗留项目维护Selenium
Node.js 生态Puppeteer / Playwright

参考资源