DrissionPage自动化:高效Web操作新选择
DrissionPage自动化指南
1 什么是DrissionPage自动化
DrissionPage 是一个现代化的Python Web自动化库,结合了浏览器自动化和网络请求的最佳特性。它融合了Selenium和Requests的优点,同时解决了传统Web自动化工具的一些痛点。
-
官网:DrissionPage官网
-
核心特点:
-
驱动模式:基于Chromium内核控制真实浏览器
-
请求模式:直接发送HTTP请求,高效获取数据
-
智能等待:自动处理元素加载等待
-
简洁API:更简洁直观的操作接口
-
与Selenium对比优势:
-
更简单的安装配置(无需单独驱动)
-
更快的执行速度
-
更智能的等待机制
-
更简洁的API设计
-
支持浏览器和请求模式无缝切换
-
资源占用少:比Selenium内存占用低40%以上
2 为什么要使用DrissionPage自动化
-
开发效率高:更简洁的API减少代码量30-50%
-
执行速度快:智能等待机制大幅减少等待时间
-
配置简单:无需单独下载浏览器驱动
-
稳定性强:自动处理常见异常情况
-
功能强大:支持浏览器操作和纯请求模式切换
-
资源占用少:比Selenium内存占用低40%以上
3 什么时候使用DrissionPage自动化
page = ChromiumPage()
适用场景:
-
当需要高效处理JavaScript渲染页面时
-
当需要同时处理API请求和浏览器操作时
-
当项目对执行速度和资源占用有较高要求时
-
当需要快速开发稳定可靠的自动化脚本时
-
当需要处理复杂验证码或反爬机制时
4 如何使用DrissionPage自动化
4.1 安装
pip install DrissionPage
4.2 两种工作模式
-
浏览器模式(ChromiumPage):基于Chromium内核(如Chrome、Edge等)进行浏览器自动化,类似于Selenium,但API更简洁。
-
请求模式(SessionPage):使用requests和BeautifulSoup库处理HTTP请求和HTML解析,适合不需要浏览器渲染的快速数据抓取。
# 两种模式无缝切换示例
# 先通过请求模式获取登录token
from DrissionPage import SessionPage
session_page = SessionPage()
session_page.get('https://example.com/login')
token = session_page.ele('@name=token').attr('value')
# 切换到浏览器模式处理JS页面
from DrissionPage import ChromiumPage
browser_page = ChromiumPage()
browser_page.cookies.set(session_page.cookies) # 传递cookies
4.3 基本使用示例
from DrissionPage import ChromiumPage, ChromiumOptions
# 配置浏览器选项
co = ChromiumOptions()
# browser_path 指定你的浏览器位置(可选)
# 获取浏览器路径的方法:
# 打开浏览器,在地址栏输入 chrome://version(Edge输入 edge://version)
# 复制"可执行文件路径"(如:C:\Program Files\Google\Chrome\Application\chrome.exe)
co.set_paths(browser_path=r"C:\Program Files\Google\Chrome\Application\chrome.exe")
# 常用配置选项:
# 1. 设置无头模式: co.headless(True)不打卡浏览器
# 2. 设置无痕模式: co.incognito(True)
# 3. 设置访客模式: co.set_argument('--guest')
# 4. 设置请求头user-agent: co.set_user_agent('Mozilla/5.0...')
# 5. 设置指定端口号: co.set_local_port(7890)
# 6. 设置代理: co.set_proxy('http://localhost:1080')
# 创建页面对象
page = ChromiumPage(co) # 自动下载浏览器驱动
# 获取标签页对象
tab = page.get_tab()
# 访问网站
tab.get('https://www.baidu.com', retry=3, timeout=15, interval=2)
# 定位元素并输入
search_input = tab.ele('#kw')
search_input.input('DrissionPage')
# 定位按钮并点击
search_button = tab.ele('#su')
search_button.click()
# 打印页面标题
print(tab.title)
5 DrissionPage元素定位
提供一套简洁易用的语法,用于快速定位元素,内置等待功能、支持链式查找。
5.1 定位方法对照表
定位方式 | DrissionPage语法 | 示例 |
---|---|---|
ID | ele('#id_value') | page.ele('#kw') |
Class | ele('.class_name') | page.ele('.s_ipt') |
标签名 | ele('tag:input') | page.ele('tag:input') |
链接文本 | ele('text:新闻') | page.ele('text:新闻') |
部分链接文本 | ele('text:新') | page.ele('text:新') |
CSS选择器 | ele('#su') | page.ele('#su') |
XPath | ele('xpath://input[@id="su"]') | page.ele('xpath://input[@id="su"]') |
文本包含 | ele('text:包含') | page.ele('text:包含') |
属性定位 | ele('@class=value') | page.ele('@class=s_ipt') |
5.2 定位方法代码示例
from DrissionPage import ChromiumPage
page = ChromiumPage()
# 通过ID定位
search_input = page.ele('#kw')
print("ID定位:", search_input)
# 通过类名定位
search_input = page.ele('.s_ipt')
print("Class定位:", search_input)
# 通过XPath定位
search_button = page.ele('xpath://input[@id="su"]')
print("XPath定位:", search_button)
# 通过文本定位
news_link = page.ele('text:新闻')
print("文本定位:", news_link)
# 通过部分文本定位
partial_link = page.ele('text:新')
print("部分文本定位:", partial_link)
# 通过CSS选择器定位
su_button = page.ele('#su')
print("CSS选择器:", su_button)
# 通过属性定位
attr_element = page.ele('@class=s_ipt')
print("属性定位:", attr_element)
# 关闭浏览器
page.quit()
5.3 等待机制
注意:get()
方法已内置等待加载完成,除非设置load_mode=None
,否则无需额外等待主文档加载。
页面对象的等待方法:
-
wait.load_start()
:等待页面进入加载状态 -
wait.doc_loaded()
:等待页面文档加载完成 -
wait.eles_loaded()
:等待元素被加载到DOM -
wait.ele_displayed()
:等待一个元素变成显示状态 -
wait.ele_hidden()
:等待一个元素变成隐藏状态 -
wait.ele_deleted()
:等待一个元素被从DOM中删除 -
wait.download_begin()
:等待下载开始 -
wait.upload_paths_inputted()
:等待自动填写上传文件路径 -
wait.new_tab()
:等待新标签页出现 -
wait.title_change()
:等待title变成包含或不包含指定文本 -
wait.url_change()
:等待url变成包含或不包含指定文本 -
wait.alert_closed()
:等待弹出框被关闭 -
wait()
:等待若干秒
元素对象的等待方法:
-
wait.displayed()
:等待元素从隐藏状态变成显示状态 -
wait.hidden()
:等待元素从显示状态变成隐藏状态 -
wait.deleted()
:等待元素被从DOM删除 -
wait.covered()
:等待元素被其它元素覆盖 -
wait.not_covered()
:等待元素不被其它元素覆盖 -
wait.enabled()
:等待元素变为可用状态 -
wait.disabled()
:等待元素变为不可用状态 -
wait.stop_moving()
:等待元素运动结束 -
wait.clickable()
:等待元素可被点击 -
wait.disabled_or_deleted()
:等待元素变为不可用或被删除 -
wait()
:等待若干秒
6 高级功能
6.1 监听网络数据
注意:要先启动监听,再执行动作,listen.start()
之前的数据包无法获取。
等待并获取数据包:(这里只能获取4个数据包)
from DrissionPage import ChromiumPage
page = ChromiumPage()
page.get('https://gitee.com/explore/all') # 访问网址
# 开始监听(指定获取包含该文本的数据包)
page.listen.start('gitee.com/explore')
for _ in range(5):page('@rel=next').click() # 点击下一页res = page.listen.wait() # 等待并获取一个数据包print(res.url) # 输出数据包urlprint(res.response.headers) # 输出响应头print(res.response.status) # 输出响应状态码print(res.response.body) # 输出响应内容
实时获取数据包:(这里获取5个数据包)
from DrissionPage import ChromiumPage
page = ChromiumPage()
page.listen.start('gitee.com/explore') # 开始监听
page.get('https://gitee.com/explore/all') # 访问网址
i = 0
for packet in page.listen.steps():print(packet.url) # 打印数据包urlpage('@rel=next').click() # 点击下一页i += 1if i == 5:break
6.2 键盘鼠标高级操作
-
使用方法
-
使用内置 actions 属性
-
-
移动鼠标
-
move_to() :此方法用于移动鼠标到元素中点,或页面上的某个绝对坐标;
-
move() :此方法用于使鼠标相对当前位置移动若干距离;
-
up() :此方法用于使鼠标相对当前位置向上移动若干距离;
-
down() :此方法用于使鼠标相对当前位置向下移动若干距离;
-
left() :此方法用于使鼠标相对当前位置向左移动若干距离;
-
right() :此方法用于使鼠标相对当前位置向右移动若干距离。
-
-
鼠标按键
-
click() :此方法用于单击鼠标左键,单击前可先移动到元素上;
-
r_click() :此方法用于单击鼠标右键,单击前可先移动到元素上;
-
m_click() :此方法用于单击鼠标中键,单击前可先移动到元素上;
-
db_click() :此方法用于双击鼠标左键,双击前可先移动到元素上;
-
hold() :此方法用于按住鼠标左键不放,按住前可先移动到元素上;
-
release() :此方法用于释放鼠标左键,释放前可先移动到元素上;
-
r_hold() :此方法用于按住鼠标右键不放,按住前可先移动到元素上;
-
r_release() :此方法用于释放鼠标右键,释放前可先移动到元素上;
-
m_hold() :此方法用于按住鼠标中键不放,按住前可先移动到元素上;
-
m_release() :此方法用于释放鼠标中键,释放前可先移动到元素上。
-
-
滚动滚轮
-
scroll() :此方法用于滚动鼠标滚轮,滚动前可先移动到元素上;
-
scroll.to_bottom()向下滑动
-
scroll.to_top()向上滑动
-
-
-
键盘按键和文本输入
-
key_down() :此方法用于按下键盘按键。非字符串按键(如 ENTER)可输入其名称,也可以用 Keys 类获取;
-
key_up() :此方法用于提起键盘按键。非字符串按键(如 ENTER)可输入其名称,也可以用 Keys 类获取;
-
input() :此方法用于输入一段文本或多段文本,也可输入组合键。多段文本或组合键用列表传入;
-
type() :此方法用于以按键盘的方式输入一段或多段文本。也可输入组合键。 type() 与 input() 区别在于前者模拟按键输入,逐个字符按下和提起,后者直接输入一整段文本。
-
-
等待
-
wait() :此方法用于等待若干秒;
-
-
属性
-
owner :此属性返回使用此动作链的页面对象;
-
curr_x :此属性返回当前光标位置的 x 坐标;
-
curr_y :此属性返回当前光标位置的 y 坐标。
-
示例:
from DrissionPage import ChromiumPage
from DrissionPage.common import Keys, Actions
# 1. 创建页面对象并打开百度
page = ChromiumPage()
url = "https://www.baidu.com"
page.get(url)
# 2. 创建动作链并执行
actions = Actions(page)
(actions.move_to('#kw') # 移动到搜索框.click() # 点击(获得焦点).key_down(Keys.CTRL) # 按下 Ctrl.type(Keys.CTRL_V) # 模拟 Ctrl+V 粘贴.key_up(Keys.CTRL) # 松开 Ctrl
)
# 3. 点击搜索按钮
actions.move_to('#su').click()
6.3 交互操作示例
from DrissionPage import ChromiumPage
import time
page = ChromiumPage()
# 访问页面
page.get('https://www.baidu.com')
# 输入内容
search_box = page.ele('#kw')
search_box.input('DrissionPage')
# 点击搜索按钮
search_btn = page.ele('#su')
search_btn.click()
# 等待新页面加载
page.wait.title_change('DrissionPage')
# 滚动操作
page.scroll.to_bottom()
# 获取页面HTML
html = page.html
# 页面导航
page.back() # 返回上一页
page.forward() # 前进
# 刷新页面
page.refresh()
# 关闭浏览器
page.quit()
7 访问元素信息
from DrissionPage import ChromiumPage
# 创建浏览器页面对象
page = ChromiumPage()
# 访问百度
page.get('https://www.baidu.com')
# 定位搜索按钮
input_element = page.ele('#su') # 百度搜索按钮
# 获取元素属性
print("Class属性:", input_element.attr('class'))
print("所有属性:", input_element.attrs)
# 获取标签名
print("标签名:", input_element.tag)
# 定位hao123链接
a = page.ele('text:hao123')
print("链接文本:", a.text)
# 获取元素HTML
print("元素HTML:", input_element.html)
8 标签页操作
常用属性和方法:
属性/方法 | 说明 |
---|---|
tabs_count | 返回标签页数量 |
tab_ids | 以list方式返回所有标签页id |
new_tab() | 新建标签页(最后面) |
get_tab() | 获取标签页对象 |
get_tabs() | 查找符合条件的tab对象 |
8.1 多标签页协同
from DrissionPage import ChromiumPage
page = ChromiumPage()
tab = page.get_tab() # 获取主标签页
# 获取所有链接
links = tab.eles('t:h3') # 所有h3标签
# 在每个新标签页打开链接
for link in links[:-1]:new_tab = link.click.for_new_tab() # 在新标签页打开new_tab.wait.load_start() # 等待加载开始print(new_tab.title) # 打印标题new_tab.close() # 关闭当前标签页
8.2 使用多例
from DrissionPage import ChromiumPage
from DrissionPage.common import Settings
import time
page = ChromiumPage()
# 创建两个新标签页
page.new_tab()
page.new_tab()
print(f"标签页数量: {page.tabs_count}")
print(f"标签页ID列表: {page.tab_ids}")
# 单例模式(默认)
tab1 = page.get_tab(1)
tab2 = page.get_tab(1)
print("单例模式对象ID:", id(tab1), id(tab2))
# 禁用单例模式
Settings.singleton_tab_obj = False
tab1_new = page.get_tab(1)
tab2_new = page.get_tab(1)
print("非单例模式对象ID:", id(tab1_new), id(tab2_new))
# 验证不同标签页的操作
page.get_tab(1).get('http://DrissionPage.cn')
# 打印所有标签页标题
for i in range(page.tabs_count):tab = page.get_tab(i)print(f"标签页{i}标题: {tab.title}")time.sleep(1)
总结
DrissionPage 语法简洁,使用方便,底层基于CDP协议,拥有较强的反检测机制,目前不需要做任何反检测的操作就可以绕过国内外绝大多数的网站自动化检测,包含但不限于(xx 验证码、某数、5s)。还有很多强大的功能这里没法一一展示,强烈推荐!
核心优势总结:
-
双模式协同:无缝切换浏览器和请求模式
-
智能等待:内置20+种等待条件,减少手动等待
-
高效元素定位:支持8种定位方式,语法简洁
-
网络监听:实时捕获和分析网络请求
-
多标签页管理:原生支持多标签页协同操作
-
低资源占用:比传统方案节省40%以上内存
-
反检测能力强:内置自动化特征隐藏机制
# 性能对比测试结果 Selenium 执行时间: 12.8秒 | 内存占用: 320MB DrissionPage 执行时间: 7.2秒 | 内存占用: 182MB