告别Selenium!用DrissionPage的ChromiumPage和SessionPage,5分钟搞定登录与爬虫
在Python自动化测试和爬虫开发领域,Selenium曾经是无可争议的王者。但随着时间的推移,开发者们逐渐意识到Selenium的局限性——复杂的配置、缓慢的执行速度,以及需要额外安装浏览器驱动。这些痛点催生了一批新兴的替代方案,其中DrissionPage以其简洁高效的特性脱颖而出。
DrissionPage是一个纯Python编写的自动化工具库,它巧妙地整合了浏览器自动化和网络请求两大功能。通过ChromiumPage和SessionPage两个核心类,开发者可以轻松应对各种场景:从需要渲染JavaScript的复杂网页操作,到高性能的纯数据抓取。本文将带你快速上手DrissionPage,通过实际案例展示它如何用更简洁的代码完成传统Selenium的任务。
1. 为什么选择DrissionPage而非Selenium
在深入代码之前,让我们先看看DrissionPage相比Selenium的几大优势:
- 零配置启动:不需要下载额外的浏览器驱动,安装即用
- 更简洁的API:方法命名直观,链式调用让代码更易读
- 混合模式支持:可在浏览器控制和纯请求模式间无缝切换
- 内置智能等待:自动处理元素加载等待,减少冗余代码
- 性能优势:比Selenium执行相同任务快30%-50%
# Selenium与DrissionPage初始化对比 from selenium import webdriver from DrissionPage import ChromiumPage # Selenium需要配置驱动路径 driver = webdriver.Chrome(executable_path='/path/to/chromedriver') # DrissionPage直接使用系统已安装的浏览器 page = ChromiumPage()从上面的简单对比就能看出,DrissionPage省去了繁琐的驱动配置环节。对于经常需要在不同环境部署脚本的开发者来说,这大大降低了维护成本。
2. 快速实现网站登录:以Gitee为例
自动化登录是许多爬虫和测试脚本的第一步。让我们看看如何使用DrissionPage的ChromiumPage完成Gitee登录流程。
2.1 登录流程实现
from DrissionPage import ChromiumPage # 创建页面对象(会自动打开浏览器) page = ChromiumPage() page.get('https://gitee.com/login') # 输入用户名和密码 page.ele('#user_login').input('your_username') page.ele('#user_password').input('your_password') # 点击登录按钮 page.ele('@value=登 录').click()这段代码有几个值得注意的特点:
- 智能元素定位:
ele()方法支持CSS选择器、XPath、属性定位等多种方式 - 自动等待:所有元素操作都内置等待机制,默认10秒超时
- 链式调用:可以直接在元素定位后接操作命令,代码更紧凑
2.2 登录状态保持
登录成功后,DrissionPage会自动管理cookies。你可以将会话保存下来供后续使用:
# 保存当前会话 page.save_cookies('gitee_cookies.json') # 下次使用时加载cookies page = ChromiumPage() page.get('https://gitee.com') page.load_cookies('gitee_cookies.json') page.get('https://gitee.com/dashboard') # 直接进入登录后页面3. 高效数据爬取:SessionPage实战
对于不需要浏览器渲染的简单页面,使用SessionPage(基于requests)可以获得更高的性能。下面我们以爬取Gitee开源项目为例。
3.1 单页数据抓取
from DrissionPage import SessionPage page = SessionPage() page.get('https://gitee.com/explore/all') # 获取所有项目标题和链接 projects = page.eles('.title project-namespace-path') for proj in projects: print(f"项目: {proj.text}, 链接: {proj.link}")3.2 分页爬取完整实现
from DrissionPage import SessionPage import time page = SessionPage() for i in range(1, 6): # 爬取前5页 page.get(f'https://gitee.com/explore/all?page={i}') # 使用CSS选择器定位元素 items = page.eles('.project-info') for item in items: title = item.ele('a').text desc = item.ele('.project-desc').text stars = item.ele('.stars-count').text print(f"{title}: {desc} | 星标: {stars}") time.sleep(1) # 礼貌性延迟提示:对于反爬严格的网站,可以结合ChromiumPage和SessionPage使用。先用浏览器获取渲染后的页面,然后提取关键数据用SessionPage批量请求。
4. 元素定位与操作大全
DrissionPage提供了丰富的元素定位和操作方法,比Selenium更加灵活。以下是常用方式的总结:
4.1 元素定位方式对比
| 定位方式 | 示例代码 | 适用场景 |
|---|---|---|
| CSS选择器 | page.ele('#id') | 简单的ID/class定位 |
| XPath | page.ele('xpath://div[@class="name"]') | 复杂层级结构 |
| 属性定位 | page.ele('@name=username') | 通过任意属性定位 |
| 文本定位 | page.ele('text:登录') | 通过可见文本定位 |
| 组合定位 | page.ele('tag:div@class=header') | 标签+属性组合 |
4.2 常用元素操作
element = page.ele('#some-element') # 基本操作 element.click() # 点击 element.input('text') # 输入文本 element.clear() # 清空内容 # 高级操作 element.drag_to(other_element) # 拖拽 element.hover() # 鼠标悬停 element.screenshot('elem.png') # 元素截图 # JavaScript执行 element.run_script('arguments[0].style.border="2px solid red"')5. 从Selenium迁移到DrissionPage的实用技巧
如果你已经有Selenium项目,以下转换指南可以帮助你平滑迁移:
5.1 常见模式转换对照表
| Selenium代码 | DrissionPage等效代码 |
|---|---|
find_element(By.ID, 'id') | ele('#id') |
find_elements(By.CLASS, 'class') | eles('.class') |
WebDriverWait(driver, 10) | 内置自动等待,无需额外代码 |
ActionChains(driver).move_to_element(elem) | elem.hover() |
driver.execute_script() | page.run_js()或element.run_script() |
5.2 性能优化建议
合理选择页面模式:
- 需要JS渲染:用
ChromiumPage - 纯数据抓取:用
SessionPage
- 需要JS渲染:用
复用浏览器实例:
# 创建时指定不自动关闭 page = ChromiumPage(quit_driver=False) # 多次操作... # 最后手动关闭 page.quit()并行处理技巧:
from concurrent.futures import ThreadPoolExecutor def crawl_page(url): page = SessionPage() page.get(url) return page.ele('tag:title').text urls = ['https://example.com/page1', 'https://example.com/page2'] with ThreadPoolExecutor(max_workers=4) as executor: results = list(executor.map(crawl_page, urls))
在实际项目中,DrissionPage的简洁API确实大幅减少了样板代码。一个常见的登录+数据抓取流程,用Selenium可能需要100行代码,而用DrissionPage通常50行内就能完成,且执行速度更快。