爬虫基础之自动化工具 DrissionPage 的使用
字数 943 2025-08-19 12:41:22
DrissionPage 自动化工具使用详解
概述
DrissionPage 是一个基于 Python 的网页自动化工具,它结合了浏览器自动化的便利性和 requests 的高效率。相比 Selenium、Playwright 和 Pyppeteer,DrissionPage 具有以下独特优势:
- 无 webdriver 特征
- 无需为不同浏览器版本下载不同驱动
- 运行速度更快
- 支持跨 iframe 查找元素
- 可同时操作浏览器中的多个标签页
- 可直接读取浏览器缓存保存图片
- 支持全网页截图(包括视口外部分)
- 可处理非 open 状态的 shadow-root
安装与升级
# 安装
pip install DrissionPage
# 升级到最新稳定版
pip install DrissionPage --upgrade
# 指定版本升级
pip install DrissionPage==4.0.0b17
基本使用
初始化浏览器
from DrissionPage import ChromiumPage, ChromiumOptions
# 配置浏览器选项
co = ChromiumOptions().set_paths(
browser_path=r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"
)
# 可选配置
co.headless(True) # 设置无头模式
co.incognito(True) # 设置无痕模式
co.set_argument('--guest') # 设置访客模式
co.set_user_agent() # 设置请求头user-agent
co.set_local_port(7890) # 设置指定端口号
co.set_proxy('http://localhost:1080') # 设置代理
# 创建页面对象
page = ChromiumPage(co)
获取浏览器路径的方法
- 打开浏览器,在地址栏输入:
- Chrome:
chrome://version - Edge:
edge://version
- Chrome:
- 查找"可执行文件路径"或类似字段
访问网页
page.get('https://gitee.com/login', retry=3, timeout=15, interval=2)
参数说明:
retry: 重试次数timeout: 超时时间(秒)interval: 重试间隔时间(秒)
元素定位与操作
元素定位方法
# 通过CSS选择器
ele = page.ele('#user_login')
# 通过XPath
page.ele('xpath://input[@id="bindMobileFree"]').input("123456789")
# 通过文本内容
page.ele('text:命令学')
# 通过属性
page.ele('@value=登录')
# 链式查找
text = page('@id:footer-left')('css:>div')('text:命令学').text
元素操作
# 输入文本
ele.input('您的账号')
# 点击元素
page.ele('@value=登录').click()
# 获取文本
text = ele.text
# 获取属性
href = ele.attr('href')
等待机制
页面等待方法
page.wait.load_start() # 等待页面进入加载状态
page.wait.doc_loaded() # 等待页面文档加载完成
page.wait.eles_loaded() # 等待元素被加载到DOM
page.wait.ele_displayed() # 等待元素显示
page.wait.ele_hidden() # 等待元素隐藏
page.wait.ele_deleted() # 等待元素被删除
page.wait.download_begin() # 等待下载开始
page.wait.new_tab() # 等待新标签页出现
page.wait.title_change() # 等待title变化
page.wait.url_change() # 等待url变化
page.wait.alert_closed() # 等待弹出框关闭
page.wait(5) # 等待5秒
元素等待方法
ele.wait.displayed() # 等待元素显示
ele.wait.hidden() # 等待元素隐藏
ele.wait.deleted() # 等待元素被删除
ele.wait.covered() # 等待元素被覆盖
ele.wait.not_covered() # 等待元素不被覆盖
ele.wait.enabled() # 等待元素可用
ele.wait.disabled() # 等待元素不可用
ele.wait.stop_moving() # 等待元素运动结束
ele.wait.clickable() # 等待元素可点击
ele.wait() # 等待若干秒
网络监听
基本用法
page.listen.start('gitee.com/explore') # 开始监听指定URL
# 等待并获取一个数据包
res = page.listen.wait()
print(res.url)
print(res.response.headers)
print(res.response.statusText)
print(res.response.body)
实时获取数据包
page.listen.start('gitee.com/explore')
page.get('https://gitee.com/explore/all')
i = 0
for packet in page.listen.steps():
print(packet.url)
page('@rel=next').click() # 点击下一页
i += 1
if i == 5:
break
动作链
基本用法
# 使用内置actions属性
page.actions.move_to('#kw').click().type('DrissionPage')
page.actions.move_to('#su').click()
# 使用独立对象
from DrissionPage.common import Actions
ac = Actions(page)
ac.move_to('#kw').click().type('DrissionPage')
ac.move_to('#su').click()
常用动作方法
-
鼠标移动:
ac.move_to(ele) # 移动到元素 ac.move(x, y) # 相对移动 ac.up(100) # 向上移动100像素 ac.down(100) # 向下移动 ac.left(100) # 向左移动 ac.right(100) # 向右移动 -
鼠标点击:
ac.click() # 左键单击 ac.r_click() # 右键单击 ac.m_click() # 中键单击 ac.db_click() # 双击 ac.hold() # 按住左键 ac.release() # 释放左键 -
键盘操作:
from DrissionPage.common import Keys ac.key_down(Keys.CTRL) # 按下Ctrl ac.type('a') # 输入a ac.key_up(Keys.CTRL) # 释放Ctrl # 或简写为 ac.type(Keys.CTRL_A)
拖拽示例
# 向右拖拽300像素
ac.hold('#div1').right(300).release()
# 拖拽到另一个元素上
ac.hold('#div1').release('#div2')
标签页操作
多标签页管理
# 获取标签页信息
print(page.tabs_count) # 标签页数量
print(page.tab_ids) # 所有标签页ID
# 新建标签页
page.new_tab()
# 获取标签页对象
tab1 = page.get_tab(1) # 按序号获取
tab2 = page.get_tab(title='百度') # 按标题获取
# 启用多例模式
from DrissionPage.common import Settings
Settings.singleton_tab_obj = False
# 关闭和重连
tab1.close()
tab1.disconnect()
tab1.reconnect()
# 关闭多个标签页
page.close_tabs(ids=[tab1.id, tab2.id]) # 关闭指定标签页
page.close_tabs(num=2) # 关闭前2个标签页
截图与录像
截图功能
# 整页截图
page.get_screenshot(path='tmp', name='pic.jpg', full_page=True)
# 元素截图
img = page('tag:img')
img.get_screenshot() # 保存到文件
bytes_str = img.get_screenshot(as_bytes='png') # 获取二进制数据
页面录像
page.screencast.set_save_path('video') # 设置保存路径
page.screencast.set_mode.video_mode() # 设置录制模式
page.screencast.start() # 开始录制
page.wait(3)
page.screencast.stop() # 停止录制
执行JavaScript
# 设置localStorage
page.run_js(f'localStorage.setItem("__user_token.v3",`{token}`)')
page.run_js(f'localStorage.setItem("__user_info",`{token}`)')
# 设置cookie
cookies_set = "document.cookie=`__user_token.v3={token}; path=/;domain=i.shengcaiyoushu.com;`;"
page.run_js(cookies_set)
反检测机制
DrissionPage 具有内置的反检测特性:
- 无 webdriver 特征
- 无需浏览器驱动
- 默认情况下不会被 bot.sannysoft.com 等检测工具识别
- 无头模式下只需设置 user-agent 即可绕过基本检测
总结
DrissionPage 是一个功能强大、语法简洁的网页自动化工具,具有以下特点:
- 内置强大的自研内核,无需 webdriver
- 提供简洁易用的元素定位语法
- 完善的等待机制,提高脚本稳定性
- 支持网络监听、多标签页操作等高级功能
- 内置反检测机制,可绕过大多数自动化检测
- 支持截图、录像等多媒体操作
- 可执行任意 JavaScript 代码
相比传统自动化工具,DrissionPage 代码更简洁、运行更高效、功能更全面,是目前 Python 网页自动化的优秀解决方案。