主题
DrissionPage
DrissionPage 是一个基于 Python 的网页自动化工具。它既能控制浏览器,也能收发数据包,还能把两者合而为一,兼顾浏览器自动化的便利性和 HTTP 请求的高效率。
Drission = Driver + Session,意为"双模式",读作"拽神"。
- 作者:g1879
- 当前稳定版:4.1.1.4
- 协议:CC BY-NC 4.0(禁止商用)
- 官网:https://www.drissionpage.cn
- 仓库:https://github.com/g1879/DrissionPage
核心特性
双模式一体
DrissionPage 最大的特点是同时集成了两种操作模式:
| 模式 | 说明 | 适用场景 |
|---|---|---|
| ChromiumPage | 控制浏览器(基于 CDP 协议) | 需要执行 JS、处理复杂交互、绕过反爬 |
| SessionPage | 收发数据包(类似 requests) | 纯数据抓取、API 调用、高性能场景 |
两种模式可以无缝切换,例如先用 SessionPage 快速获取页面数据,遇到需要执行 JS 的场景再切换到 ChromiumPage。
与同类工具对比
| 特性 | DrissionPage | Selenium | Playwright | Puppeteer |
|---|---|---|---|---|
| 语言 | 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 |