【python】使用 DrissionPage 库进行网页自动化操作和数据提取

使用 DrissionPage 库进行网页自动化操作和数据提取

简介

随着自动化测试、数据抓取和网页交互应用的日益增多,Python 作为一种功能强大且易于学习的编程语言,成为了开发人员的首选工具。在众多的自动化库中,DrissionPage 作为一个新兴的库,以其简洁易用和强大的功能受到越来越多开发者的关注。本文将介绍如何使用 DrissionPage 进行网页自动化操作和数据提取。

1. 什么是 DrissionPage?

DrissionPage 是一个基于 SeleniumRequests 的自动化网页操作库。它简化了 Web 页面元素的交互,提供了对元素定位、表单填写、截图等常见操作的支持。与传统的 Selenium 和 Requests 等库相比,DrissionPage 在API设计上更加简洁和易用。

该库的一个关键特点是,它结合了 Selenium 和 Requests 两者的优势。Selenium 适用于需要进行动态渲染的网页(例如JavaScript生成的内容),而 Requests 适合用于处理静态网页。通过两者的结合,DrissionPage 能够更灵活地应对各种网页自动化需求。

2. 安装 DrissionPage

在使用 DrissionPage 前,我们首先需要进行安装。可以通过 pip 来安装:

pip install drission

安装完成后,你就可以开始使用该库来编写自动化脚本了。

3. 基本使用示例

3.1 初始化和创建 DrissionPage 实例

DrissionPage 通过创建一个 DrissionPage 类的实例来启动网页操作。我们可以通过两种方式启动浏览器:使用 requests 模式(适用于静态页面)或者使用 selenium 模式(适用于动态渲染页面)。

以下是一个简单的例子,展示如何初始化 DrissionPage 实例并启动浏览器:

from drission import Drission
from drission.page import Page

# 初始化浏览器,使用 Selenium 模式
drission = Drission(browser='chrome')

# 创建页面实例
page = Page(drission)

# 打开一个网页
page.get('https://example.com')
3.2 定位和操作元素

DrissionPage 提供了非常方便的 API 来定位和操作页面元素。可以通过元素的 id、class、标签名、xpath 等方式进行定位。

例如,查找一个输入框并填写内容:

# 查找元素并输入文本
input_element = page.element('#username')
input_element.send_keys('my_username')

再比如,点击一个按钮:

# 点击按钮
button = page.element('.submit-button')
button.click()
3.3 截图功能

截图是自动化测试中常用的功能,DrissionPage 提供了截图的方法,可以轻松获取网页的屏幕截图。

# 截取网页截图
page.screenshot('screenshot.png')
3.4 数据提取

DrissionPage 也支持从页面中提取数据,例如获取页面元素的文本内容,或者获取属性。

# 获取元素的文本内容
element_text = page.element('.headline').text
print(element_text)

# 获取链接的href属性
link = page.element('.link')
href = link.get_attribute('href')
print(href)

4. 与其他库的集成

DrissionPage 可以与其他库(如 BeautifulSouppandas 等)结合使用,来进行更复杂的网页数据提取和处理。

例如,使用 BeautifulSoup 解析页面的 HTML 结构:

from bs4 import BeautifulSoup

# 获取页面源码
html_content = page.content

# 使用 BeautifulSoup 解析
soup = BeautifulSoup(html_content, 'html.parser')
title = soup.title.text
print(title)

5. 支持的其他功能

  • 表单操作DrissionPage 提供了对表单的支持,可以轻松填写表单并提交。
  • 等待机制:内置的等待机制,支持等待元素的出现,避免因为页面加载延迟导致的错误。
  • Cookies 和会话管理:能够处理 Cookies 和 Session,实现持久化登录等功能。
  • 支持无头浏览器:可以运行在无头模式下,适合在服务器上执行,避免开启浏览器窗口。

6. 性能和效率

由于 DrissionPage 结合了 SeleniumRequests 的优点,它能够在动态和静态网页之间灵活切换,确保了更高的效率。对于需要模拟用户交互的动态页面,Selenium 提供了强大的支持;对于静态页面,Requests 的性能则更加高效。

7. 实际案例

假设你需要抓取一个网站的文章标题和链接,可以使用以下代码:

# 打开目标网页
page.get('https://example.com/articles')

# 查找所有文章标题
articles = page.elements('.article-title')

# 提取并打印标题和链接
for article in articles:
    title = article.text
    link = article.get_attribute('href')
    print(f"Title: {title}, Link: {link}")

这种方式通过 DrissionPage 可以快速实现网页抓取任务,简化了网页操作的代码。

8. 总结

DrissionPage 是一个强大且易用的 Python 库,它将 SeleniumRequests 的优势结合在一起,提供了简洁且功能强大的 API,用于处理网页自动化和数据抓取任务。无论是表单提交、元素操作,还是网页截图、数据提取,DrissionPage 都能有效地提升开发效率。

如果你需要进行网页自动化测试或数据抓取,DrissionPage 是一个值得考虑的优秀选择。

9. 高级功能与技巧

除了基本的网页操作,DrissionPage 还支持一些高级功能和技巧,进一步增强了自动化脚本的能力。

9.1 异常处理

在进行网页自动化时,可能会遇到元素未加载、网络延迟等问题。DrissionPage 提供了异常处理机制,可以有效地处理这些问题。

from drission.exceptions import ElementNotFound

try:
    element = page.element('.nonexistent-element')
except ElementNotFound:
    print("元素未找到,跳过该操作")

这种方式可以帮助开发者在脚本执行过程中避免由于页面状态不稳定而导致的崩溃。

9.2 自定义等待条件

对于动态页面,可能会需要等待某个元素的加载才能进行后续操作。DrissionPage 支持自定义等待条件,确保元素加载完成再执行后续操作。

from drission.page.conditions import ElementToBeClickable

# 等待元素可点击
page.wait_for(ElementToBeClickable('#submit-button'))

通过这种方式,开发者可以灵活地控制等待条件,避免因元素未加载而出现的错误。

9.3 执行 JavaScript 代码

如果需要执行页面上的 JavaScript 代码,DrissionPage 提供了与浏览器交互的接口,允许直接执行 JS 代码。

# 执行 JavaScript
page.driver.execute_script('alert("Hello, DrissionPage!")')

这种方式非常适合处理一些需要与网页脚本交互的高级需求,比如模拟点击事件、修改页面元素等。

9.4 多标签页处理

DrissionPage 也支持多标签页的处理。在一些情况下,我们需要在多个标签页之间切换,DrissionPage 提供了简单的 API 来完成这一操作。

# 打开新标签页
page.driver.execute_script('window.open("https://example.com");')

# 获取所有标签页
windows = page.driver.window_handles

# 切换到新打开的标签页
page.driver.switch_to.window(windows[1])

# 执行操作
page.get('https://example.com')

通过这种方式,你可以轻松地管理和操作多个浏览器标签页。

10. 性能优化

尽管 DrissionPage 提供了非常强大的功能,但在大规模数据抓取或复杂自动化任务中,性能优化仍然非常重要。以下是一些优化建议:

10.1 使用无头浏览器模式

无头浏览器(Headless mode)是指浏览器没有图形界面,通常用于自动化任务的执行。DrissionPage 支持无头模式,可以在不打开浏览器窗口的情况下运行自动化任务,这样能够提高执行效率。

# 启动无头浏览器
drission = Drission(browser='chrome', headless=True)
10.2 减少页面加载时间

对于一些需要加载大量资源的网页,可以通过禁用图片加载、JS 执行等方式来加速页面加载。

from selenium.webdriver.chrome.options import Options

# 设置 Chrome 配置
chrome_options = Options()
chrome_options.add_argument("--blink-settings=imagesEnabled=false")

# 启动无图浏览器
drission = Drission(browser='chrome', options=chrome_options)
10.3 异步操作

DrissionPage 目前没有内置的异步支持,但你可以结合 asyncioaiohttp 等库来进行并行抓取和数据提取。这对于需要同时抓取大量网页的任务尤其有效。

11. 与 Selenium 集成

由于 DrissionPage 是基于 Selenium 的,它与 Selenium 可以无缝集成。例如,可以在 DrissionPage 中执行 Selenium 提供的高级功能,如页面截图、元素滚动等。

# 滚动页面到底部
drission.driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

这种集成方式可以让你利用 Selenium 的强大功能,同时享受 DrissionPage 提供的简洁接口。

12. 使用案例:自动登录和数据抓取

假设你需要自动登录一个网站并抓取其数据,下面是一个完整的使用示例:

from drission import Drission
from drission.page import Page

# 初始化 DrissionPage
drission = Drission(browser='chrome', headless=True)
page = Page(drission)

# 打开登录页面
page.get('https://example.com/login')

# 输入用户名和密码
page.element('#username').send_keys('my_username')
page.element('#password').send_keys('my_password')

# 提交登录表单
page.element('#login-button').click()

# 等待登录成功
page.wait_for(page.element('.dashboard'))

# 抓取数据
articles = page.elements('.article-title')
for article in articles:
    print(article.text)

# 退出浏览器
drission.quit()

这段代码展示了如何通过 DrissionPage 模拟用户登录并抓取数据。通过结合等待机制和元素定位,DrissionPage 使得自动化操作变得更加简便。

13. 总结

DrissionPage 是一个非常灵活且功能强大的库,它为开发者提供了简洁、直观的 API,可以轻松应对网页自动化操作和数据抓取任务。无论是静态页面还是动态页面,DrissionPage 都能够有效处理。其与 Selenium 和 Requests 的集成,使得它在处理复杂网页时表现出色。

通过学习和实践 DrissionPage,你可以大大提高网页自动化的效率,减少重复性工作,提升开发和测试的效率。如果你还没有尝试过这个库,不妨从今天开始,探索其强大功能!


如果你有任何问题或者想了解更深入的技术细节,欢迎在评论区讨论!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/918859.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

菜鸟驿站二维码/一维码 取件识别功能

特别注意需要引入 库文 ZXing 可跳转: 记录【WinForm】C#学习使用ZXing.Net生成条码过程_c# zxing-CSDN博客 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using static System.Net.…

使用WebRTC实现点对点实时音视频通信的技术详解

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 使用WebRTC实现点对点实时音视频通信的技术详解 使用WebRTC实现点对点实时音视频通信的技术详解 使用WebRTC实现点对点实时音视频…

执行flink sql连接clickhouse库

手把手教学,flink connector打通clickhouse大数据库,通过下发flink sql,来使用ck。 组件版本jdk1.8flink1.17.2clickhouse23.12.2.59 1.背景 flink官方不支持clickhouse连接器,工作中难免会用到。 2.方案 利用GitHub大佬提供…

力扣(leetcode)题目总结——辅助栈篇

leetcode 经典题分类 链表数组字符串哈希表二分法双指针滑动窗口递归/回溯动态规划二叉树辅助栈 本系列专栏:点击进入 leetcode题目分类 关注走一波 前言:本系列文章初衷是为了按类别整理出力扣(leetcode)最经典题目&#xff0c…

基于Java Springboot宠物猫售卖管理系统

一、作品包含 源码数据库全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 数据库:…

Windows docker下载minio出现“Using default tag: latestError response from daemon”

Windows docker下载minio出现 Using default tag: latest Error response from daemon: Get "https://registry-1.docker.io/v2/": context deadline exceeded 此类情况,一般为镜像地址问题。 {"registry-mirrors": ["https://docker.re…

数据结构查找-哈希表(开发地址法+线性探测法)+(创建+查找+删除代码)+(C语言代码)

#include<stdlib.h> #include<stdio.h> #include<stdbool.h> #define NULLKEY -1//单元为空 #define DELKEY -2//单元内容被删除 #define M 20 typedef struct {int key;//关键字int count;//统计哈希冲突探测次数 }HashTable; //插入到哈希表 void InsertHT…

视频直播5G CPE解决方案:ZX7981PG/ZX7981PMWIFI6网络覆盖

方案背景 视频直播蓬勃发展的当下&#xff0c;传统直播网络联网方式的局限性越来越明显。目前传统直播的局限性主要集中在以下几个方面&#xff1a; 传统直播间网络架构条件有限&#xff0c;可连接WIFI数量少&#xff0c;多终端同时直播难以维持&#xff1b;目前4G网络带宽有限…

【电子设计】按键LED控制与FreeRTOS

1. 安装Keilv5 打开野火资料,寻找软件包 解压后得到的信息 百度网盘 请输入提取码 提取码:gfpp 安装526或者533版本都可以 下载需要的 F1、F4、F7、H7 名字的 DFP pack 芯片包 安装完 keil 后直接双击安装 注册操作,解压注册文件夹后根据里面的图示步骤操作 打开说明 STM…

vue3【实战】切换白天黑夜(暗黑模式)【组件封装】DarkMode.vue

效果预览 原理解析 切换为暗黑模式时&#xff0c;会在 html 标签上添加样式类 dark导入 ElementPlus 的暗黑模式样式后&#xff0c; ElementPlus 组件会自动响应暗黑模式自定义组件需用 UnoCSS 的 dark: 语法自定义暗黑模式的样式 代码实现 技术方案 vue3 vite ElementPlus …

基于单片机的多功能环保宠物窝设计

本设计基于单片机设计的多功能环保宠物窝&#xff0c;利用温湿度传感器、压力传感模块、气味传感模块、红外测温传感器、通信模块、显示模块、清扫部件等&#xff0c;使其能够实现自动检测并调节温湿度、补充宠物食物、检测宠物体温健康并出现异常时进行报警、自动清扫消毒宠物…

MySql结合element-plus pagination的分页查询

实现效果如下&#xff1a; 重点&#xff1a;使用mysql查询的limit和offset 原生SQL写法&#xff1a; select c.id as deptid,c.name as department,position,a.name staffname,2024-11 as shijian ,CASE WHEN b.shijian IS NULL THEN no ELSE yes END AS submit from fa_wecom…

vue使用List.reduce实现统计

需要对集合的某些元素的值进行计算时&#xff0c;可以在计算属性中使用forEach方法 1.语法&#xff1a;集合.reduce ( ( 定义阶段性累加后的结果 , 定义遍历的每一项 ) > 定义每一项求和逻辑执行后的返回结果 , 定义起始值 ) 2、简单使用场景&#xff1a;例如下面…

Spring Boot汽车资讯:科技与速度的交响

3系统分析 3.1可行性分析 通过对本汽车资讯网站实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本汽车资讯网站采用SSM框架&#xff0c;JAVA作为开发语言&#…

前端页面自适应等比例缩放 Flexible+rem方案

在移动互联网时代&#xff0c;随着智能手机和平板电脑的普及&#xff0c;前端开发者面临的一个重要挑战是如何让网页在不同尺寸和分辨率的设备上都能良好地显示。为了应对这一挑战&#xff0c;阿里巴巴的前端团队开发了 flexible.js&#xff0c;旨在提供一种简单有效的解决方案…

记录一下在原有的接口中增加文件上传☞@RequestPart

首先&#xff0c;咱声明一下&#xff1a; RequestBody和 MultipartFile 不可以 同时使用&#xff01;&#xff01;&#xff01; 因为这两者预期的请求内容类型不同。RequestBody 预期请求的 Content-Type 是 application/json 或 application/xml&#xff0c;而 MultipartFile …

HTML5实现剪刀石头布小游戏(附源码)

文章目录 1.设计来源1.1 主界面1.2 皮肤风格1.2 游戏中界面 2.效果和源码源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/143798520 HTM…

[Qt platform plugin问题] Could not load the Qt platform plugin “xcb“

Qt platform plugin 是 Qt 应用程序启动时加载的插件。不同的平台有不同的插件。 常见的插件有:linuxfb Wayland xcb 简单来说就是启动一个GUI程序, 离不开这些插件.选择其中一个就好 出现这个问题要么就是没有插件&#xff0c;要么就是插件依赖的库没有。 要么就是插件选则的…

【qt】控件2

1.frameGeometry和Geometry区别 frameGeometry是开始从红圈开始算&#xff0c;Geometry从黑圈算 程序证明&#xff1a;使用一个按键&#xff0c;当按键按下,qdebug打印各自左上角的坐标&#xff08;相当于屏幕左上角&#xff09;&#xff0c;以及窗口大小 Widget::Widget(QWid…

Idea中创建和联系MySQL等数据库

备注&#xff1a;电脑中要已下好自己需要的MySQL数据库软件 MySQL社区版下载链接&#xff1a; https://dev.mysql.com/downloads/installer/ 优点&#xff1a; 1.相比与在命令行中管理数据库&#xff0c;idea提供了图形化管理&#xff0c;简单明了&#xff1b; 2.便于与后端…