3分钟上手DrissionPage:零代码基础也能玩转Web自动化
引言:告别繁琐,拥抱极简Web自动化
你是否还在为Selenium的复杂配置而头疼?是否因Requests无法处理JavaScript渲染内容而束手无策?本文将带你3分钟入门一款集浏览器控制与数据包收发于一体的Python自动化工具——DrissionPage,让零代码基础的你也能轻松玩转Web自动化。
读完本文,你将学会:
- 快速安装DrissionPage
- 创建页面对象并访问网页
- 定位和操作页面元素
- 在浏览器模式与数据包模式间自由切换
- 编写一个完整的自动化案例
DrissionPage简介
DrissionPage是一款基于Python的Web自动化工具,它创新性地将浏览器控制和数据包收发功能融合在一起,既能像Selenium一样操控浏览器,又能像Requests一样高效收发网络请求。其主要特点包括:
- 无需WebDriver:告别繁琐的浏览器驱动配置
- 双模式切换:浏览器模式(d模式)和数据包模式(s模式)无缝切换
- 简洁定位语法:比XPath和CSS选择器更直观的元素定位方式
- 自动等待机制:内置智能等待,大幅提升脚本稳定性
- 跨iframe操作:无需切换即可直接定位iframe内元素
快速开始
安装DrissionPage
使用pip命令即可快速安装DrissionPage:
pip install DrissionPage
第一个程序:访问网页并获取标题
下面的代码将展示如何创建一个页面对象,访问百度首页,并获取页面标题:
from DrissionPage import WebPage
# 创建WebPage对象,默认使用浏览器模式
page = WebPage()
# 访问百度首页
page.get('https://www.baidu.com')
# 获取并打印页面标题
print(page.title) # 输出: 百度一下,你就知道
核心概念:页面对象
DrissionPage提供了三种主要的页面对象,以适应不同的自动化场景:
| 页面对象 | 功能描述 | 适用场景 |
|---|---|---|
| ChromiumPage | 纯浏览器控制 | 需要完整渲染JavaScript的场景 |
| SessionPage | 纯数据包收发 | 高效爬取静态网页数据 |
| WebPage | 双模式整合 | 需要登录后爬取或复杂交互的场景 |
页面对象关系图
元素定位:极简语法,告别繁琐
DrissionPage独创了简洁高效的元素定位语法,让元素查找变得前所未有的简单:
基础定位语法
| 语法 | 说明 | 示例 |
|---|---|---|
#id | 通过ID定位 | page('#kw') 定位id为kw的元素 |
.class | 通过class定位 | page('.s_ipt') 定位class为s_ipt的元素 |
@attr=value | 通过属性定位 | page('@name=wd') 定位name属性为wd的元素 |
text | 通过文本定位 | page('百度一下') 定位文本为"百度一下"的元素 |
tag:tag_name | 通过标签名定位 | page('tag:input') 定位input标签元素 |
定位示例:百度搜索
from DrissionPage import ChromiumPage
# 创建浏览器页面对象
page = ChromiumPage()
# 访问百度首页
page.get('https://www.baidu.com')
# 定位搜索框并输入内容
page('#kw').input('DrissionPage')
# 定位搜索按钮并点击
page('@value=百度一下').click()
# 等待搜索结果加载
page.wait.load_start()
# 获取搜索结果标题
results = page.eles('.result h3')
for i, result in enumerate(results[:5], 1):
print(f'{i}. {result.text}')
高级定位技巧
DrissionPage还支持更高级的定位方式,如模糊匹配、正则表达式和相对定位:
# 模糊匹配包含特定文本的元素
page('text:DrissionPage')
# 使用正则表达式定位
page('regex:^百度.*')
# 相对定位 - 获取下一个兄弟元素
page('#kw').next()
# 相对定位 - 获取父元素
page('#kw').parent()
双模式切换:兼顾灵活性与效率
WebPage对象支持在浏览器模式(d模式)和数据包模式(s模式)之间无缝切换,结合了浏览器的交互能力和数据包的高效特性。
模式切换示例:登录后爬取数据
from DrissionPage import WebPage
# 创建WebPage对象,默认使用浏览器模式
page = WebPage()
# 访问需要登录的网站
page.get('https://gitee.com/login')
# 在浏览器模式下完成登录(此处省略输入账号密码步骤)
# page('#user_login').input('your_username')
# page('#user_password').input('your_password')
# page('@value=登录').click()
# 切换到数据包模式
page.change_mode()
# 现在可以用高效的数据包模式爬取数据了
page.get('https://gitee.com/explore/all')
repos = page.eles('.title project-namespace-path')
for repo in repos[:5]:
print(repo.text, repo.link)
模式切换流程图
实战案例:爬取猫眼电影排行榜
下面我们将通过一个完整的案例,展示如何使用DrissionPage爬取猫眼电影排行榜数据:
from DrissionPage import ChromiumPage
# 创建浏览器页面对象
page = ChromiumPage()
# 访问猫眼电影排行榜
page.get('https://www.maoyan.com/board/4')
# 存储电影数据的列表
movies = []
# 循环翻页爬取数据
while True:
# 获取当前页所有电影元素
movie_elements = page.eles('t:dd')
# 提取每部电影的信息
for movie in movie_elements:
rank = movie('t:i').text
title = movie('.movie-item-title').text
actors = movie('.star').text
release_time = movie('.releasetime').text
score = movie('.score').text
movies.append({
'排名': rank,
'标题': title,
'主演': actors,
'上映时间': release_time,
'评分': score
})
# 尝试点击下一页
next_btn = page('text:下一页', timeout=2)
if next_btn:
next_btn.click()
page.wait.load_start()
else:
break
# 打印爬取结果
for movie in movies[:10]:
print(f"{movie['排名']}. {movie['标题']} - {movie['评分']}")
print(f" {movie['主演']}")
print(f" {movie['上映时间']}\n")
DrissionPage vs 传统工具
| 特性 | DrissionPage | Selenium | Requests |
|---|---|---|---|
| 浏览器控制 | ✅ | ✅ | ❌ |
| 数据包收发 | ✅ | ❌ | ✅ |
| 无需WebDriver | ✅ | ❌ | ✅ |
| 元素自动等待 | ✅ | ❌ | ❌ |
| 跨iframe定位 | ✅ | ❌ | ❌ |
| 语法简洁性 | ⭐⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐ |
常见问题与解决方案
Q: 浏览器启动失败怎么办?
A: 确保已安装Chrome或Edge浏览器,或通过ChromiumOptions指定浏览器路径:
from DrissionPage import ChromiumPage
from DrissionPage._configs import ChromiumOptions
co = ChromiumOptions()
co.set_browser_path(r'C:\Program Files\Google\Chrome\Application\chrome.exe')
page = ChromiumPage(co)
Q: 如何处理登录验证码?
A: 使用浏览器模式手动完成登录后,切换到数据包模式继续爬取:
page = WebPage()
page.get('https://example.com/login')
# 手动完成验证码输入
page.change_mode('s') # 切换到数据包模式
# 继续后续操作
Q: 如何设置代理?
A: 通过ChromiumOptions或SessionOptions设置代理:
# 浏览器模式设置代理
co = ChromiumOptions()
co.set_proxy('http://username:password@proxy_ip:port')
# 数据包模式设置代理
so = SessionOptions()
so.set_proxy('http://username:password@proxy_ip:port')
总结与展望
通过本文的介绍,你已经了解了DrissionPage的基本用法和核心特性。它不仅简化了Web自动化的实现流程,还创新性地将浏览器控制和数据包收发功能结合,为Web自动化开辟了新的可能。
未来,DrissionPage将继续优化性能,增加更多实用功能,让Web自动化变得更加简单高效。
如果你觉得本文对你有帮助,不妨点赞、收藏、关注三连,后续我们还将推出更多DrissionPage高级用法教程。
附录:常用API速查表
| 方法 | 说明 | 示例 |
|---|---|---|
get(url) | 访问指定URL | page.get('https://www.baidu.com') |
ele(locator) | 定位单个元素 | page.ele('#kw') |
eles(locator) | 定位多个元素 | page.eles('.result') |
input(text) | 向元素输入文本 | page('#kw').input('DrissionPage') |
click() | 点击元素 | page('@value=百度一下').click() |
change_mode() | 切换工作模式 | page.change_mode() |
wait.load_start() | 等待页面开始加载 | page.wait.load_start() |
html | 获取页面HTML | page.html |
title | 获取页面标题 | page.title |
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



