爬虫基础之自动化工具 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)

获取浏览器路径的方法

  1. 打开浏览器,在地址栏输入:
    • Chrome: chrome://version
    • Edge: edge://version
  2. 查找"可执行文件路径"或类似字段

访问网页

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 具有内置的反检测特性:

  1. 无 webdriver 特征
  2. 无需浏览器驱动
  3. 默认情况下不会被 bot.sannysoft.com 等检测工具识别
  4. 无头模式下只需设置 user-agent 即可绕过基本检测

总结

DrissionPage 是一个功能强大、语法简洁的网页自动化工具,具有以下特点:

  1. 内置强大的自研内核,无需 webdriver
  2. 提供简洁易用的元素定位语法
  3. 完善的等待机制,提高脚本稳定性
  4. 支持网络监听、多标签页操作等高级功能
  5. 内置反检测机制,可绕过大多数自动化检测
  6. 支持截图、录像等多媒体操作
  7. 可执行任意 JavaScript 代码

相比传统自动化工具,DrissionPage 代码更简洁、运行更高效、功能更全面,是目前 Python 网页自动化的优秀解决方案。

DrissionPage 自动化工具使用详解 概述 DrissionPage 是一个基于 Python 的网页自动化工具,它结合了浏览器自动化的便利性和 requests 的高效率。相比 Selenium、Playwright 和 Pyppeteer,DrissionPage 具有以下独特优势: 无 webdriver 特征 无需为不同浏览器版本下载不同驱动 运行速度更快 支持跨 iframe 查找元素 可同时操作浏览器中的多个标签页 可直接读取浏览器缓存保存图片 支持全网页截图(包括视口外部分) 可处理非 open 状态的 shadow-root 安装与升级 基本使用 初始化浏览器 获取浏览器路径的方法 打开浏览器,在地址栏输入: Chrome: chrome://version Edge: edge://version 查找"可执行文件路径"或类似字段 访问网页 参数说明: retry : 重试次数 timeout : 超时时间(秒) interval : 重试间隔时间(秒) 元素定位与操作 元素定位方法 元素操作 等待机制 页面等待方法 元素等待方法 网络监听 基本用法 实时获取数据包 动作链 基本用法 常用动作方法 鼠标移动: 鼠标点击: 键盘操作: 拖拽示例 标签页操作 多标签页管理 截图与录像 截图功能 页面录像 执行JavaScript 反检测机制 DrissionPage 具有内置的反检测特性: 无 webdriver 特征 无需浏览器驱动 默认情况下不会被 bot.sannysoft.com 等检测工具识别 无头模式下只需设置 user-agent 即可绕过基本检测 总结 DrissionPage 是一个功能强大、语法简洁的网页自动化工具,具有以下特点: 内置强大的自研内核,无需 webdriver 提供简洁易用的元素定位语法 完善的等待机制,提高脚本稳定性 支持网络监听、多标签页操作等高级功能 内置反检测机制,可绕过大多数自动化检测 支持截图、录像等多媒体操作 可执行任意 JavaScript 代码 相比传统自动化工具,DrissionPage 代码更简洁、运行更高效、功能更全面,是目前 Python 网页自动化的优秀解决方案。