首页 / DrissionPage 入门教程 / 常见问题与进阶指南

DrissionPage 入门教程

常见问题与进阶指南

本教程共 42 篇 · 第 42 篇 · 更新于 2026-07-29 · 约 6 分钟阅读

DrissionPageDrissionPage 入门教程FAQ常见问题版本迁移进阶

42. 常见问题与进阶指南

本节目标:汇总常见错误和疑问,帮你避坑,同时指明继续学习的方向。

常见错误

找不到元素

现象ele() 返回 NoneElement,或者报找不到元素的错误。

可能原因:

  1. 元素在 iframe 里

    # 先获取 frame,再查找
    frame = page.get_frame('#frameId')
    element = frame.ele('#elementId')
  2. 元素还没加载出来

    # 等待一下
    page.wait.ele_display('#elementId', timeout=10)
    element = page.ele('#elementId')
  3. 元素在 Shadow DOM 里

    # 穿透 Shadow DOM
    shadow_root = page.ele('#hostElement').shadow_root
    element = shadow_root.ele('.shadow-element')
  4. 选择器写错了

    # 试试不同写法
    element = page.ele('#id')
    element = page.ele('.className')
    element = page.ele('tag:div')
    element = page.ele('text=文本')

点击没反应

现象click() 执行了,但页面没变化。

常见原因:

  1. 元素被遮挡

    # 先滚动到可见区域
    element.scroll.to_see()
    element.click()
  2. 需要 JS 点击

    # 用 JS 直接调用 click
    element.run_js('this.click()')
  3. 元素还没可交互

    # 等元素可点击
    page.wait.ele_display('#btn')
    page.ele('#btn').click()

浏览器启动失败

现象:创建 ChromiumPage() 时报错。

解决方案:

  1. 浏览器版本不匹配:DrissionPage 会自动下载匹配的浏览器,确保网络畅通
  2. 端口被占用:换端口
    from DrissionPage import ChromiumOptions
    co = ChromiumOptions()
    co.set_local_port(9222)  # 指定调试端口
    page = ChromiumPage(co)
  3. 杀毒软件拦截:添加信任或临时关闭

输入中文乱码

现象input('中文') 显示乱码。

解决:用模拟键盘方式输入。

element = page.ele('#input')
element.input('中文内容', by_js=False)

版本迁移

DrissionPage 从 3.x 升级到 4.x 有一些变化。

主要变化

  1. 包名调整:导入路径可能有变化
  2. API 重构:部分方法签名改了
  3. 类型提示:4.x 增强了 IDE 类型提示

迁移建议

  1. 先看官方更新日志:4.0 功能介绍
  2. 跑一遍现有测试,看看哪些报错
  3. 对照官方文档逐个修复

旧版兼容

一些旧版写法在 4.x 还能用,但会有警告:

# 旧版写法(仍可用但不推荐)
page.set_headers({'User-Agent': 'xxx'})

# 新版推荐写法
page.set.user_agent('xxx')

FAQ

DrissionPage 支持哪些浏览器?

支持基于 Chromium 的浏览器:Chrome、Edge、Vivaldi 等。

目前不支持 Firefox 和 Safari。

如何使用已安装的浏览器?

from DrissionPage import ChromiumOptions

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

如何让浏览器不自动关闭?

# 创建页面后,不调用 quit()
page = ChromiumPage()
page.get('https://example.com')

# 脚本结束前保持运行
input('按回车退出...')
page.quit()

如何处理验证码?

几种思路:

  1. 第三方打码平台:超级鹰、2Captcha 等
  2. 手动输入:保存图片,人工识别
    captcha = page.ele('#captchaImg')
    captcha.save('captcha.png')
    code = input('请输入验证码: ')
    page.ele('#captchaInput').input(code)
  3. WebPage 模式绕过:部分验证码只在数据包请求时出现

脚本运行慢怎么优化?

  1. 不需要浏览器渲染时用 SessionPage
  2. 无头模式省资源
  3. 禁用图片加载
  4. 合理设置超时
  5. 及时释放不用的页面对象
co = ChromiumOptions()
co.headless()  # 无头模式
co.no_imgs(True)  # 禁用图片
co.set_timeouts(page_load=10, script=10)
page = ChromiumPage(co)

怎么处理反爬?

  1. 加随机延时

    import random, time
    time.sleep(random.uniform(1, 3))
  2. 设置合理的请求头

    page.set.user_agent('Mozilla/5.0 ...')
  3. 用代理 IP

    co = ChromiumOptions()
    co.set_proxy('http://proxy.example.com:8080')
  4. 模拟正常用户行为

    page.scroll.down(500)
    element.hover()

如何报告 Bug?

  1. GitHub Issues
  2. Gitee Issues
  3. QQ 交流群(见官方文档)

提交时请带上:版本号、Python 版本、系统信息、复现代码。

进阶学习建议

学完本教程,你已经掌握了 DrissionPage 的核心功能。

接下来可以深入这些方向:

1. 深入理解架构

  • 了解 CDP(Chrome DevTools Protocol)
  • 理解 WebPage 双模式的设计原理
  • 学习会话管理和连接复用

2. 性能优化

  • 无头部署到服务器
  • 多进程 + 多线程组合
  • 连接池管理
  • 资源复用策略

3. 高级交互

  • 动作链(Actions)的复杂用法
  • 文件上传下载的高级场景
  • 事件监听和拦截
  • WebSocket 处理

4. 项目集成

  • 和 Scrapy 集成
  • 和 FastAPI/Flask 集成
  • 配合数据库存储
  • 部署到 Docker

5. 推荐资源

小结

遇到元素找不到,先检查是否在 iframe 或 Shadow DOM 里。

点击没反应试试 JS 点击或滚动到可见区域。

性能优化三板斧:无头、禁图片、设超时。

反爬要综合运用延时、换 UA、代理、模拟行为等手段。

进阶方向包括架构理解、性能优化、高级交互和项目集成。

上一篇
与 selenium 对比
下一篇
已经是最后一篇啦