【Python从入门到进阶】36、Selenium 动作交互

news2025/2/22 18:24:38

接上篇《35、selenium基本语法学习》
上一篇我们介绍了selenium的基本语法,包括元素定位以及访问元素信息的操作。本篇我们来学习selenium操作网页的动作内容。

一、什么是selenium动作操作

动作操作是指使用Selenium调用WebDriver执行与用户交互相关的动作,例如单击、右键单击、悬停、拖放等。通过模拟用户在网页上的行为,可以实现更真实的测试和自动化操作。


动作操作在爬虫领域具有重要的作用和意义。虽然传统的爬虫主要关注数据的抓取和解析,但随着网站的逐渐发展和演变,越来越多的网页采用了动态加载、异步加载或基于 JavaScript 的交互式元素。
在这种情况下,传统的静态页面爬取方法可能无法获取到完整的数据或准确的页面状态。而动作操作则可以模拟人类用户与网页的交互行为,使爬虫能够处理这些动态页面并正确获取所需的数据。

以下是动作操作对爬虫的作用和意义:

1、处理动态加载:许多网页使用AJAX或其他技术进行动态加载内容。通过执行动作操作,爬虫可以模拟用户的滚动、点击等操作,触发页面的动态加载,获取完整的数据。
2、解析交互式元素:某些网页包含需要用户交互才能显示的元素,例如展开更多评论、加载更多图片等。通过模拟用户操作,爬虫可以触发这些元素的显示,并正确解析其中的数据。
3、模拟登录和表单提交:一些网站要求用户登录或填写表单后才能访问所需的数据。通过动作操作,爬虫可以模拟登录操作或填写表单,以获取需要的数据。
4、处理验证码:许多网站为了防止机器人爬取数据而使用验证码。通过动作操作,爬虫可以模拟用户输入验证码或使用其他识别方式来处理验证码验证过程。
综上所述,动作操作在爬虫中的应用可以提高数据的完整性和准确性,使爬虫能够更好地应对动态页面和交互式元素的挑战,从而实现更全面、高效的数据采集任务。

在接下来的章节中,我将详细介绍Selenium中常用的动作操作,并提供示例代码和说明,帮助大家理解和应用这些操作。

二、导入所需的模块和设置

看过之前章节的伙伴可以跳过本节。
安装浏览器驱动详见《【Python从入门到进阶】34、selenium基本概念及安装流程》第三章节

1、安装selenium的相关库

使用python包管理工具安装Selenium库。或者在命令行中运行pip安装命令:

pip install selenium

2、配置浏览器驱动

并下载完驱动和设置好驱动路径后,就可以开始使用Selenium库编写脚本程序了,引入selenium的相关库,运行后能打开浏览器(闪一下)则表示配置成功:

from selenium import webdriver
driver = webdriver.Chrome()

三、selenium动作操作语法

1、单击元素

使用click()方法实现单击操作:

element = driver.find_element(By.XPATH, 'xpath_expression')
element.click()

示例代码说明:
find_element()方法用于定位目标元素,可使用不同的定位方式(如XPath、CSS选择器、ID、NAME等)。
click()方法将模拟用户单击目标元素。

2、输入内容

使用send_keys()方法实现单击操作:

element = driver.find_element(By.XPATH, 'xpath_expression')
element.send_keys("要输入的字符串")

示例代码说明:
find_element()方法用于定位目标元素,可使用不同的定位方式(如XPath、CSS选择器、ID、NAME等),该元素应该是类似input框等可以输入内容的元素。
send_keys()方法将模拟用户在输入框中输入内容。

3、前进和后退操作

使用driver.back()方法实现后退操作,driver.forward()方法实现前进操作:

driver = webdriver.Chrome()
# 做几项网络操作,最好是可以前往新页面的操作
driver.back()
driver.forward()

4、JS模拟鼠标滚动

使用execute_script()方法实现鼠标滚动:

driver.execute_script("window.scrollTo(0,document.body.scrollHeight)")

示例代码说明:
execute_script()方法可以执行JavaScript代码,这里使用JavaScript执行了一段可以实现页面滚动至底部的JS代码。
通过修改scrollHeight的值可以调整滚动的位置,如将scrollHeight修改为0则表示滚动至页面顶部。

5、获取网页代码

使用 page_source 属性获取当前网页的完整代码:

page_source = driver.page_source
print(page_source)

示例代码说明:
page_source属性返回当前网页的完整HTML代码。
可以使用该属性将网页的源代码保存到变量中或进行其他处理。
获取特定元素的代码片段:

element = driver.find_element(By.XPATH, 'xpath_expression')
element_html = element.get_attribute("outerHTML")
print(element_html)

示例代码说明:
get_attribute("outerHTML")方法返回指定元素的HTML代码片段,包括元素本身及其所有子元素。
可以使用该方法将特定元素的代码片段保存到变量中或进行其他处理。

6、获取当前网页的 URL

使用current_url属性获取当前网页的 URL:

url = driver.current_url
print(url)

示例代码说明:
current_url属性返回当前网页的完整URL。
可以将URL保存到变量中或进行其他处理。

7、右键单击元素

使用context_click()方法实现右键单击操作:

element = driver.find_element(By.XPATH, 'xpath_expression')
ActionChains(driver).context_click(element).perform()

示例代码说明:
context_click()方法模拟鼠标右键单击操作。
perform()方法执行所有已定义的鼠标操作。

8、悬停在元素上

使用move_to_element()方法实现悬停操作:

element = driver.find_element(By.XPATH, 'xpath_expression')
ActionChains(driver).move_to_element(element).perform()

示例代码说明:
move_to_element()方法将鼠标移动到指定元素上。
perform()方法执行所有已定义的鼠标操作。

9、元素拖放

使用drag_and_drop()方法实现元素拖放操作:

source_element = driver.find_element(By.XPATH, 'xpath_expression')
target_element = driver.find_element(By.XPATH, 'xpath_expression')
ActionChains(driver).drag_and_drop(source_element, target_element).perform()

示例代码说明:
drag_and_drop()方法将源元素拖动到目标元素的位置。
perform()方法执行所有已定义的鼠标操作。

10、等待操作完成

(1)使用显式等待(Explicit Wait)机制等待特定条件达成:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

element = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.XPATH, 'xpath_expression'))
)

示例代码说明:
WebDriverWait类用于设置最长等待时间,并提供了多种条件来等待特定条件达成。
EC.presence_of_element_located()是一个预定义的条件,用于等待元素出现在页面中。
(2)使用隐式等待(Implicit Wait)机制等待特定时间段:

driver.implicitly_wait(10)

示例代码说明:
implicitly_wait()方法将设置隐式等待的最长时间,单位为秒。
在执行其他操作时,如果元素未立即找到,WebDriver将等待指定的时间后再进行查找。

11、异步加载页面的处理

使用page_load_timeout属性设置页面加载超时时间:

driver.set_page_load_timeout(10)

示例代码说明:
set_page_load_timeout()方法用于设置页面加载的最长等待时间,单位为秒。
如果页面在指定时间内未完全加载完成,将抛出TimeoutException异常。
使用execute_script()方法判断页面是否加载完成:

is_page_loaded = driver.execute_script("return document.readyState") == "complete"

示例代码说明:
document.readyState表示页面加载状态,值为"complete"表示页面已完全加载完成。
可以使用 JavaScript 判断页面加载状态,从而确定页面是否加载完成。

12、关闭网页

关闭网页
使用close()方法关闭当前窗口:

driver.close()

示例代码说明:
close()方法用于关闭当前的浏览器窗口。
当前窗口关闭后,如果还有其他窗口存在,则焦点会切换到最后一个打开的窗口。
使用quit()方法退出整个浏览器会话:

driver.quit()

示例代码说明:
quit()方法将关闭所有打开的浏览器窗口,并终止与WebDriver的连接。
推荐在测试结束后使用quit()方法,以确保资源得到正确释放。

四、selenium动作操作示例

以下是我按照上面的所有操作实例(除异步加载和拖拽外),通过访问百度页面进行操作的验证,完整代码如下,有兴趣的同学可以运行一下试试看:

# _*_ coding : utf-8 _*_
# @Time : 2023-09-17 18:56
# @Author : 光仔December
# @File : selenium动作交互
# @Project : Python_Projects

from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
import time

# 初始化浏览器驱动程序
driver = webdriver.Chrome()

try:
    # 打开网页
    driver.get('https://www.baidu.com')
    # (1)通过ID定位百度搜索的按钮
    element1 = driver.find_element(By.ID, "su")
    # (2)通过名称定位元素(百度的搜索输入框)
    element2 = driver.find_element(By.NAME, "wd")
    # 给输入框输入字符串“我要学python”
    element2.send_keys("我要学python")
    element1.click()  # 点击搜索
    time.sleep(3)
    driver.back()  # 网页后退
    time.sleep(3)
    driver.forward()  # 网页前进
    time.sleep(3)
    # 模拟鼠标滚动到网页最下方
    driver.execute_script("window.scrollTo(0,document.body.scrollHeight)")
    # 获取整个网页的代码
    page_source = driver.page_source
    print(page_source)
    # 只获取百度搜索按钮的代码
    element1 = driver.find_element(By.ID, "su")
    element_html = element1.get_attribute('outerHTML')
    print("----获取百度搜索按钮的代码----")
    print(element_html)
    # 获取当前网络的url
    print("----获取当前网络的url----")
    url = driver.current_url
    print(url)
    # 鼠标悬停在百度一下按钮上
    ActionChains(driver).move_to_element(element1).perform()
    # 右键单击百度一下按钮
    ActionChains(driver).context_click(element1).perform()
    # 使用浏览器隐式等待5秒
    driver.implicitly_wait(5)
finally:
    # 关闭浏览器
    driver.close()

下一篇我们继续讲解Selenium有关phantomjs的基本使用。

参考:尚硅谷Python爬虫教程小白零基础速通教学视频
转载请注明出处:https://guangzai.blog.csdn.net/article/details/132951733

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

可视化大屏报表的设计与制作 | 附成果图

大屏可视化报表是一种以大屏幕为展示媒介,通过图形、图表、文字等多种方式将数据信息呈现出来的报表形式。它具有视觉冲击力强、信息量大、交互性高等特点,能够帮助企业快速获取数据背后的价值和洞见,提高决策效率。因此近年来,大…

软件设计模式系列之十一——装饰模式

当谈到设计软件系统时,经常需要考虑如何使系统更加灵活、可扩展和易维护。设计模式是一种被广泛采用的方法,用于解决常见的设计问题,并提供了一套可重用的解决方案。装饰模式(Decorator Pattern)是一种结构型设计模式&…

iOS应用上线需要注意的问题

将iOS应用上线到App Store需要仔细注意一系列问题,以确保应用的质量、安全性和用户体验。以下是一些在iOS应用上线过程中需要注意的关键问题,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。…

教你快速使用springboot整合图形验证码的两种方式

前言 今天给大家展示的是springboot使用图形验证码的两种方式,第一种基于hutool来实现,第二种方式基于axet实现。现在我们来谈一谈为什么要学习验证码 防止恶意攻击:验证码是一种常用的安全措施,它可以有效地防止恶意攻击&#x…

C++学习笔记——类与对象(六个默认成员函数)

1、构造函数 在一个类中,编译器会自动生成默认的成员函数,当对象进行初始化时,会默认调用这个函数来初始化。 构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,以保证 每个数据成员都有…

HTTPS的工作过程

HTTPS就是对HTTP进行了加密,因为要保证数据安全,就需要进行加密,网络中不再直接传输明文了,而是加密之后的密文,加密的方法有很多,但是整体可以分为两大类:对称加密和非对称加密 对称加密 对称加密其实就是…

Vue中的深度监听(Deep Watch):详细解析与实际示例

Vue中的深度监听(Deep Watch):详细解析与实际示例 Vue.js 是一款流行的前端 JavaScript 框架,其响应式系统是其核心特性之一。通过响应式系统,Vue允许开发者轻松地监听数据的变化并对其做出响应。在某些情况下&#x…

零基础学前端(七)将项目发布成网站

我们学习了HTML和CSS,已经可以做出精美的静态网页。我们不慌学习JavaScript,因为Javascript的作用是为网页增加动作和数据交换,只能让网页更完美而已,现在网页的基础我们已经可以搭建,我们不妨先将网站发布出去&#x…

uniapp选择地址弹窗组件

1.效果 2.子组件在components里面创建组件AddreessWindow <template><view style"position: relative;z-index: 999999 !important;"><view class"address-window" :class"value true ? on : "><view class"title…

Controller统一异常处理和yaml配置

目录 Controller统一异常处理 url解析 static下静态资源文件的访问 配置类 如何访问static下的资源文件 yaml基础语法 注解赋值 批量注入 单个注入 Controller统一异常处理 Controller统一异常处理ControllerAdvice&#xff1a;统一为Controller进行"增强" …

聊聊Spring中循环依赖与三级缓存

先看几个问题 什么事循环依赖&#xff1f;什么情况下循环依赖可以被处理&#xff1f;spring是如何解决循环依赖的&#xff1f; 什么是循环依赖&#xff1f; 简单理解就是实例 A 依赖实例 B 的同时 B 也依赖了 A Component public class A {// A 中依赖 BAutowiredprivate B b…

【表格插入小计行】el-table表格,数组对象中根据某字段插入小计行计算数据

前言 功能解释&#xff1a;遇到的一个需求&#xff0c;是表格的tabledata数组。里面有科室医生还有很多消费指标等数据。然后需要我排序后把科室放在一起。然后在每个科室下面添加一行数据&#xff0c;是小计行。用于计算上面相同科室的所有数据汇总。然后最下面再来个合计行&…

【深度学习实验】前馈神经网络(四):自定义逻辑回归模型:前向传播、反向传播算法

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入必要的工具包 1. 逻辑回归Logistic类 a. 构造函数__init__ b. __call__(self, x)方法 c. 前向传播forward d. 反向传播backward 2. 模型训练 3. 代码整合 一、实验介绍 实现逻…

JavaWeb 学习笔记 5:JSP

JavaWeb 学习笔记 5&#xff1a;JSP 简单的说&#xff0c;JSP 就是 Java Html&#xff0c;JSP 的出现是为了让 Java Web 应用生成动态页面更容易。 1.快速开始 1.1.依赖 添加 JSP 依赖&#xff1a; <dependency><groupId>javax.servlet.jsp</groupId>&…

华为云云耀云服务器L实例评测|使用docker部署禅道系统

大家好&#xff0c;我是早九晚十二&#xff0c;目前是做运维相关的工作。写博客是为了积累&#xff0c;希望大家一起进步&#xff01; 我的主页&#xff1a;早九晚十二 文章目录 前言准备工作华为云账号注册充值、购买服务器 服务器操作密码修改登录远程工具 禅道部署简介 部署…

【校招VIP】java语言考点之序列化

考点介绍&#xff1a; 将java对象转换为字节序列的过程称为对象的序列化。对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上&#xff0c;通常存放在一个文件中。 2) 在网络上传送对象的字节序列。 java语言考点之序列化-相关题目及解析内容可点击文章末尾链…

PyCharm:No Python interpreter configured for the project

一、问题概述 Your 的 Pycharm 软件创建完项目后&#xff0c;结果无法运行&#xff0c;观察后&#xff0c;在Pycharm代码编辑区上面出现了这样的一个黄色条提示&#xff1a;No Python interpreter configured for the project 【问题】在您的Python项目中无Python解释器…

金融业需要的大模型,是一个系统化工程

今年年初&#xff0c;在AIGC刚刚开始爆火的时候&#xff0c;我们曾经采访过一位AI领域的专家。当我们提问哪个行业将率先落地大模型时&#xff0c;他毫不犹豫地说道&#xff1a;“金融。” 金融行业场景多、数据多、知识多&#xff0c;这样的“三多”特点让其成为AI大模型发挥价…

yarn安装依赖时报错 error An unexpected error occurred:

一切起因是因为前一天安装了volta管理node&#xff0c;第二天启动项目&#xff0c; 显示error An unexpected error occurred: “https://registry.npmmirror.com/webpack-aliyun-oss/-/webpack-aliyun-oss-0.2.6.tgz: Request failed “404 Not Found””. 项目启动时发现报错…