当前位置:首页 > python > 正文内容

基于python的网页自动化工具--DrissionPage

关中浪子1年前 (2023-02-19)python1584
【腾讯云】2核2G4M云服务器新老同享99元/年,续费同价
找梯子最重要的就是稳定,这个已经上线三年了,一直稳定没有被封过,赶紧下载备用吧!

 概述

DrissionPage 是一个基于 python 的网页自动化工具。

它既能控制浏览器,也能收发数据包,甚至能把两者合而为一。

可兼顾浏览器自动化的便利性和 requests 的高效率。

它功能强大,内置无数人性化设计和便捷功能。

它的语法简洁而优雅,代码量少,对新手友好。


📖 使用文档: 点击查看

交流QQ群: 897838127


支持系统:Windows、Linux、Mac

python 版本:3.6 及以上

支持浏览器:Chromium 内核浏览器(如 Chrome 和 Edge)

背景

用 requests 做数据采集面对要登录的网站时,要分析数据包、JS 源码,构造复杂的请求,往往还要应付验证码、JS 混淆、签名参数等反爬手段,门槛较高。若数据是由 JS 计算生成的,还须重现计算过程,体验不好,开发效率不高。 使用浏览器,可以很大程度上绕过这些坑,但浏览器运行效率不高。

因此,这个库设计初衷,是将它们合而为一,能够在不同须要时切换相应模式,并提供一种人性化的使用方法,提高开发和运行效率。
除了合并两者,本库还以网页为单位封装了常用功能,提供非常简便的操作和语句,在用于网页自动化操作时,减少考虑细节,专注功能实现,使用更方便。 一切从简,尽量提供简单直接的使用方法,使代码更优雅。

以前的版本是对 selenium 进行重新封装实现的。从 3.0 开始,作者另起炉灶,对底层进行了重新开发,摆脱对 selenium 的依赖,增强了功能,提升了运行效率。

理念

简洁!易用 !方便!


☀️ 特性和亮点

作者经过长期实践,踩过无数坑,总结出的经验全写到这个库里了。

🎇 强大的自研内核

本库采用全自研的内核,内置了 N 多实用功能,对常用功能作了整合和优化,对比 selenium,有以下优点:

  • 无 webdriver 特征,不会被网站识别

  • 无需为不同版本的浏览器下载不同的驱动

  • 运行速度更快

  • 可以跨<iframe>查找元素,无需切入切出

  • <iframe>看作普通元素,获取后可直接在其中查找元素,逻辑更清晰

  • 可以同时操作浏览器中的多个标签页,即使标签页为非激活状态,无需切换

  • 可以直接读取浏览器缓存来保存图片,无需用 GUI 点击另存

  • 可以对整个网页截图,包括视口外的部分(90以上版本浏览器支持)

  • 可处理非open状态的 shadow-root

🎇 亮点功能

除了以上优点,本库还内置了无数人性化设计。

  • 极简的语法规则。集成大量常用功能,代码更优雅

  • 定位元素更加容易,功能更强大稳定

  • 无处不在的等待和自动重试功能。使不稳定的网络变得易于控制,程序更稳定,编写更省心

  • 提供强大的下载工具。操作浏览器时也能享受快捷可靠的下载功能

  • 允许反复使用已经打开的浏览器。无须每次运行从头启动浏览器,调试超方便

  • 使用 ini 文件保存常用配置,自动调用,提供便捷的设置,远离繁杂的配置项

  • 内置 lxml 作为解析引擎,解析速度成几个数量级提升

  • 使用 POM 模式封装,可直接用于测试,便于扩展

  • 高度集成的便利功能,从每个细节中体现

  • 还有很多细节,这里不一一列举,欢迎实际使用中体验:)


🌟 简单演示

⭐ 与 selenium 代码对比

以下代码实现一模一样的功能,对比两者的代码量:

🔸 用显性等待方式定位第一个文本包含some text的元素

# 使用 selenium:element = WebDriverWait(driver).until(ec.presence_of_element_located((By.XPATH, '//*[contains(text(), "some text")]')))# 使用 DrissionPage:element = page('some text')

🔸 跳转到第一个标签页

# 使用 selenium:driver.switch_to.window(driver.window_handles[0])# 使用 DrissionPage:page.to_tab(page.tabs[0])

🔸 按文本选择下拉列表

# 使用 selenium:from selenium.webdriver.support.select import Selectselect_element = Select(element)select_element.select_by_visible_text('text')# 使用 DrissionPage:element.select('text')

🔸 拖拽一个元素

# 使用 selenium:ActionChains(driver).drag_and_drop(ele1, ele2).perform()# 使用 DrissionPage:ele1.drag_to(ele2)

🔸 滚动窗口到底部(保持水平滚动条不变)

# 使用 selenium:driver.execute_script("window.scrollTo(document.documentElement.scrollLeft, document.body.scrollHeight);")# 使用 DrissionPage:page.scroll.to_bottom()

🔸 获取伪元素内容

# 使用 selenium:text = webdriver.execute_script('return window.getComputedStyle(arguments[0], "::after").getPropertyValue("content");',                                element)# 使用 DrissionPage:text = element.pseudo_after

🔸 shadow-root 操作

# 使用 selenium:shadow_element = webdriver.execute_script('return arguments[0].shadowRoot', element)# 使用 DrissionPage:shadow_element = element.sr# 在 shadow_root 下可继续执行查找,获取普通元素ele = shadow_element.ele('tag:div')ele.click()

🔸 随时让浏览器窗口消失和显示(Windows系统)

# selenium 无此功能# 使用 DrissionPagepage.hide_browser()  # 让浏览器窗口消失page.show_browser()  # 重新显示浏览器窗口

⭐ 与 requests 代码对比

以下代码实现一模一样的功能,对比两者的代码量:

🔸 获取元素内容

url = 'https://baike.baidu.com/item/python'# 使用 requests:from lxml import etreeheaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36'}response = requests.get(url, headers=headers)html = etree.HTML(response.text)element = html.xpath('//h1')[0]title = element.text# 使用 DrissionPage:page = WebPage('s')page.get(url)title = page('tag:h1').text

Tips: DrissionPage 自带默认headers

🔸 下载文件

url = 'https://www.baidu.com/img/flexible/logo/pc/result.png'save_path = r'C:\download'# 使用 requests:r = requests.get(url)with open(f'{save_path}\\img.png', 'wb') as fd:   for chunk in r.iter_content():       fd.write(chunk)# 使用 DrissionPage:page.download(url, save_path, 'img')  # 支持重命名,处理文件名冲突,自动创建目标文件夹

⭐ 模式切换

用浏览器登录网站,然后切换到 requests 读取网页。两者会共享登录信息。

page = WebPage()  # 创建页面对象,默认 driver 模式page.get('https://gitee.com/profile')  # 访问个人中心页面(未登录,重定向到登录页面)page.ele('@id:user_login').input('your_user_name')  # 使用 selenium 输入账号密码登录page.ele('@id:user_password').input('your_password\n')sleep(1)page.change_mode()  # 切换到 session 模式print('登录后title:', page.title, '\n')  # 登录后 session 模式的输出

输出:

登录后title: 个人资料 - 码云 Gitee.com

获取并显示元素属性

# 接上段代码foot = page.ele('@id:footer-left')  # 用 id 查找元素first_col = foot.ele('css:>div')  # 使用 css selector 在元素的下级中查找元素(第一个)lnk = first_col.ele('text:命令学')  # 使用文本内容查找元素text = lnk.text  # 获取元素文本href = lnk.attr('href')  # 获取元素属性值print(text, href, '\n')# 简洁模式串联查找text = page('@id:footer-left')('css:>div')('text:命令学').textprint(text)

输出:

Git 命令学习 https://oschina.gitee.io/learn-git-branching/Git 命令学习


扫描二维码推送至手机访问。

版权声明:本文由码农翻生发布,如需转载请注明出处。

本文链接:https://lubojian.cn/post/210.html

分享给朋友:

相关文章

Python 控制手机微信

Python 控制手机微信

/1 前言/  最近在做手机APP自动化测试,需要安appium,并配置环境变量,网上虽然有很多教程,但是随着版本的更新总有各种各样的坑,本文以亲身踏坑经历给大家详细介绍一下如何正确安装appium。/2 第一步:安装A...

识别验证码 SO EASY

识别验证码 SO EASY

在很久之前,分享过一次Python代码实现验证码识别的办法。当时采用的是pillow+pytesseract,优点是免费,较为易用。但其识别精度一般,若想要更高要求的验证码识别,初学者就只能去选择使用百度API接口了。但其实百度API接口和...

Python 操作 Excel库总结!非常全面 强烈推荐

Python 操作 Excel库总结!非常全面 强烈推荐

在之前的办公自动化系列文章中,我已经对Python操作Excel的几个常用库openpyxl、xlrd/xlwt、xlwings、xlsxwriter等进行了详细的讲解。为了进一步带大家了解各个库的异同,从而在不同场景下可以灵活使用,本文将...

Appium+python自动化1-环境搭建(上)

Appium+python自动化1-环境搭建(上)

前言   appium可以说是做app最火的一个自动化框架,它的主要优势是支持android和ios,另外脚本语言也是支持java和Python。小编擅长Python,所以接下来的教程是appium+python的实例。...

python脚本 自动刷金币(头条极速版抖音极速版) 逍遥模拟器

1:下载逍遥模拟器安装抖音极速版,并登录2:安装python33:下载adb 并配置到系统环境中:  在这里下载platform-tools.zip 解压到电脑中,将其中的  (链接: https://pan.baidu.com/...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。