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

news/2024/11/8 8:59:53/

接上篇《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 ECelement = 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_Projectsfrom 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_sourceprint(page_source)# 只获取百度搜索按钮的代码element1 = driver.find_element(By.ID, "su")element_html = element1.get_attribute('outerHTML')print("----获取百度搜索按钮的代码----")print(element_html)# 获取当前网络的urlprint("----获取当前网络的url----")url = driver.current_urlprint(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.ppmy.cn/news/1122826.html

相关文章

Docker CMD指令如何覆写

在Dockerfile里,CMD指令是可以被覆盖的。 在构建镜像时,可以通过docker build命令的–cmd选项覆盖Dockerfile的CMD: 例如: FROM ubuntu CMD ["echo","hello"]构建时覆盖CMD: docker build -t test --cmd "echo world" .在创建容器时,可以通过…

C/C++算法入门 | 日期处理

不爱生姜不吃醋⭐️ 如果本文有什么错误的话欢迎在评论区中指正 与其明天开始,不如现在行动! 文章目录 🌴前言🌴日期处理1.题目(codeup 1928)2.思路3.代码实现 🌴总结 🌴前言 日期处…

Django框架介绍和安装

Django框架介绍和安装 组件: 基本配置文件/路由器 模型层(M)/模板层(T)/视图层(v) Cookie和Seesion 分页及发邮件 Admin管理后台 init.py:Python包的初始化文件 wsgi.py:WEB服务网关的配…

《动手学深度学习 Pytorch版》 7.1 深度卷积神经网络(AlexNet)

7.1.1 学习表征 深度卷积神经网络的突破出现在2012年。突破可归因于以下两个关键因素: 缺少的成分:数据 数据集紧缺的情况在 2010 年前后兴起的大数据浪潮中得到改善。ImageNet 挑战赛中,ImageNet数据集由斯坦福大学教授李飞飞小组的研究人…

项目开发过程中遇到了什么困难?

1.需求最初是什么样的? 2.如何挖掘的需求,挖掘后真实的需求是什么样的? 3.我们做了那些调查? 4.我们给出了那些方案,优缺点是什么? 5.根据实际情况,老板的期望,最终我们选择的什…

1022 D进制的A+B

一.问题&#xff1a; 输入两个非负 10 进制整数 A 和 B (≤230−1)&#xff0c;输出 AB 的 D (1<D≤10)进制数。 输入格式&#xff1a; 输入在一行中依次给出 3 个整数 A、B 和 D。 输出格式&#xff1a; 输出 AB 的 D 进制数。 输入样例&#xff1a; 123 456 8输出样…

软件系统的测试方法

软件系统测试是确保软件质量和功能的关键步骤&#xff0c;选择适当的测试方法取决于项目的性质、需求和资源可用性。通常&#xff0c;综合运用多种测试方法可以更全面地评估软件系统的质量和性能。下面列举了一些常见的软件系统测试方法&#xff0c;希望对大家有所帮助。北京木…

【干货】Python注释快捷键

【干货】Python注释快捷键 一级目录二级目录三级目录 一级目录 二级目录 三级目录 https://baijiahao.baidu.com/s?id1774982934322438014&wfrspider&forpc