06-DrissionPage自动化
DrissionPage
DrissionPage 是一个基于 Python 的网页自动化库,结合了 Selenium 的浏览器控制能力和 requests 的高效网络请求功能,适用于爬虫、自动化测试和 RPA(机器人流程自动化)
安装:
pip install DrissionPage安装对应第三方模块
selenium和DrissionPage的区别
Selenium和DrissionPage都是用于Web自动化和数据采集的Python库, DrissionPage可以看作是Selenium的现代化改进版本,特别适合以数据采集为主要目的的场景。它解决了Selenium在速度和反检测方面的痛点,提供了更优雅的API。而Selenium在传统自动化测试领域仍然有其不可替代的地位,特别是需要严格遵循测试标准和跨浏览器测试的场景
Selenium
- 主要进行Web应用功能测试
- 支持多种浏览器
- 团队熟悉Selenium
DrissionPage
- 主要进行数据采集和爬虫开发
- 需要绕过复杂的反爬机制
- 追求更高的执行效率
- 喜欢更简洁的API设计
- 处理大量页面时关注资源消耗
基础使用
基础属性与方法
- 标签对象.title属性: 获取网页的title标签内容
- 标签对象.url属性: 获取网页的url信息
- browser.quit(): 关闭浏览器
# Chromium用于控制浏览器页面对象 from DrissionPage import Chromium# 连接浏览器browser = Chromium() # 获取最新标签页对象tab = browser.latest_tab # 访问网页tab.get('https://www.baidu.com') # 获取当前页面的html源码print(tab.html) 标签页管理
tab.close()关闭当前页面
位置: 标签页管理
# 标签页一 tabtab = browser.latest_tab tab.get('https://www.baidu.com') print(tab.title) # 获取网页的标题time.sleep(1.5)# 标签页 新建一个标签页并访问网址tab2网页tab2 = browser.new_tab('https://www.taob.com') print(tab2.title) # 获取网页的标题# 新建一个标签页并访问网址tab3 = browser.new_tab('https://drissionpage.cn/') print(tab3.title)get_tab() 通过浏览器对象 参数切换对应标签页面
标签页没有焦点的概念,多个标签页可以并行操作 , 不需要显示对应的页面也能操作
browser = Chromium() # 通过标签页索引进行获取dom = browser.get_tab(3) # 注意是倒置的# 通过网页标题进行选择dom = browser.get_tab(title=tab1.title)# 通过网页地址进行选择dom = browser.get_tab(url=tab1.url)# 浏览器显示那个页面 这个序号是倒置的最前面的在最后面browser.activate_tab(browser.tab_ids[2])管理单个页面的历史记录
browser = Chromium() tab = browser.latest_tab tab.get('https://www.baidu.com/')time.sleep(1)tab.get('https://www.taobao.com/')time.sleep(1)tab.get('https://www.jd.com/')time.sleep(1)tab.back() # 后退time.sleep(2.5)tab.forward() # 前进浏览器配置
-
set_paths(browser_path,local_port,user_data_path)-
browser_path: 浏览器可执行文件路径
-
local_port: 浏览器要使用的本地端口号
-
download_path: 下载文件默认保存路径
-
user_data_path: 用户数据文件夹路径
-
options.set_user_data_path(path='')- 可以单独设置用户存储数据
-
-
co1.set_timeouts(10, 10, 10)用于设置几种超时时间,单位为秒。
'base': 默认值None, 超时时间,用于元素等待'page_load': 默认值None 页面加载超时时间'script': 默认值None 网络请求运行超时时间
# ChromiumOptions设置配置信息from DrissionPage import Chromium,ChromiumOptionsoptions = ChromiumOptions()# 无头模式 不显示浏览器'options.headless() # 设置浏览器最大显示options.set_argument('--start-maximized')# 匿名模式 浏览器无痕模式options.incognito()# 禁用GPU加速,通常用于解决一些图形相关的问题,(减少内存使用)# 无头模式下的渲染兼容性问题options.set_argument("--disable-gpu")# 设置全局元素加载超时、页面超时和 网络请求超时各为 10 秒options.set_timeouts(10, 10, 10)# 禁用沙盒模式(提高权限) 在liunx系统中需要设置 解决权限不足导致的启动崩溃问题options.set_argument('--no-sandbox') # 设置用户数据存储options.set_paths(local_port=9111, user_data_path=r'C:/Users/15116/Desktop/lianxi/userdata')# 设置用户数据存储options.set_user_data_path(path='') options.set_local_port(port="9000")# 以该配置创建浏览器页面对象page = Chromium(addr_or_opts=options).latest_tab网页处理
查询元素
-
ele用于查找其内部第一个符合条件的元素 -
eles此方法与
ele()相似,返回匹配到的所有元素组成的列表
- timeout 等待元素出现的超时时间(秒)
| 原写法 | 简化写法 | 说明 |
|---|---|---|
@id |
# |
表示 id 属性,简化写法只在语句最前面且单独使用时生效 |
@class |
. |
表示 class 属性,简化写法只在语句最前面且单独使用时生效 |
text |
tx |
按文本匹配 |
@text() |
@tx() |
按文本查找,与 @ 或 @@ 配合使用时 |
tag |
t |
按标签类型匹配 |
@tag() |
@t() |
按元素名查找,与 @ 或 @@ 配合使用时 |
xpath |
x |
用 xpath 方式查找元素 |
css |
c |
用 css selector 方式查找元素 |
获取内容和属性
tag此属性返回元素的标签名text此属性返回元素内所有文本组合成的字符串link此方法返回元素的href或src属性,没有对应属性则返回Noneattr此方法返回元素某个 attribute 属性值attrs此属性以字典形式返回元素所有属性及值
iframe内容
菜鸟教程的iframe通过ele可以直接获取
# 本库可以直接查找同域` iframe `里面的元素 page.get("https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable")dom = page.ele("#draggable")print(dom)对于跨域的iframe,无法通过页面直接查找里面的元素,可以先获取到iframe 元素,再在其下查找
tab = Chromium().latest_tabiframe = tab('#iframe1')ele = iframe('#abc')等待
与全局超时进行互补,这是指定等待
# 设置全局超时(后备保障)options.set_timeouts(10, 10, 10)# 先获取元素对象(可能此时元素尚未显示)element = page.ele('tag:div')# 此方法用于等待元素从隐藏状态变成显示状态 if element.wait.displayed(timeout=5): print('元素已经显示') # 进行后续操作,比如点击 element.click()# 页面操作...tab.get('https://example.com')# 对关键元素使用显式等待(更精确控制)if tab.wait.ele_displayed('tag:div', timeout=15): # 可以覆盖全局设置 # 元素已显示,继续操作 element = tab.ele('tag:div')交互元素
# 引入按键交互 from DrissionPage.common import Keys# 输入内容text_input.input("美食")text_input.input((Keys.ENTER)) # 回车触发time.seep(2.5)text_input.clear() #清空内容# 组合键text_input.input((Keys.CTRL, 'a',))# 进行下拉到底部page.scroll.to_bottom()# 等待2stime.sleep(2)# 进行下拉到底部page.scroll.to_bottom()# 获取网页源码msg_data = page.htmlprint(msg_data)点击
click和click.left用于左键点击元素。可选择模拟点击或 js 点击
默认点击是: 自动选择最佳点击方式 (此处可不讲)
| 参数名称 | 类型 | 默认值 | 说明 |
|---|---|---|---|
by_js |
bool |
False |
指定点击行为方式。 为None时,如不被遮挡,用模拟点击,否则用 js 点击 ,为True时直接用 js 点击; 为False时强制模拟点击,被遮挡也会进行点击 |
timeout |
float |
1.5 |
模拟点击的超时时间(秒),等待元素可见、可用、进入视口 |
wait_stop |
bool |
True |
点击前是否等待元素停止运动 |
# 获取点击元素but_page = page.ele('xpath://', timeout=2)# 进行点击but_page.click(by_js=None,timeout=3)but_page.click.left(by_js=None,timeout=3)鼠标交互
page.get('https://www.mi.com/shop')page = page.ele('xpath://*[@id="J_siteDownloadApp"]')# 悬停在元素中点tab_page.hover()