接上篇《35、selenium基本语法学习》
上一篇我们介绍了selenium的基本语法,包括元素定位以及访问元素信息的操作。本篇我们来学习selenium操作网页的动作内容。
动作操作是指使用Selenium调用WebDriver执行与用户交互相关的动作,例如单击、右键单击、悬停、拖放等。通过模拟用户在网页上的行为,可以实现更真实的测试和自动化操作。
动作操作在爬虫领域具有重要的作用和意义。虽然传统的爬虫主要关注数据的抓取和解析,但随着网站的逐渐发展和演变,越来越多的网页采用了动态加载、异步加载或基于 JavaScript 的交互式元素。
在这种情况下,传统的静态页面爬取方法可能无法获取到完整的数据或准确的页面状态。而动作操作则可以模拟人类用户与网页的交互行为,使爬虫能够处理这些动态页面并正确获取所需的数据。
以下是动作操作对爬虫的作用和意义:
1、处理动态加载:许多网页使用AJAX或其他技术进行动态加载内容。通过执行动作操作,爬虫可以模拟用户的滚动、点击等操作,触发页面的动态加载,获取完整的数据。
2、解析交互式元素:某些网页包含需要用户交互才能显示的元素,例如展开更多评论、加载更多图片等。通过模拟用户操作,爬虫可以触发这些元素的显示,并正确解析其中的数据。
3、模拟登录和表单提交:一些网站要求用户登录或填写表单后才能访问所需的数据。通过动作操作,爬虫可以模拟登录操作或填写表单,以获取需要的数据。
4、处理验证码:许多网站为了防止机器人爬取数据而使用验证码。通过动作操作,爬虫可以模拟用户输入验证码或使用其他识别方式来处理验证码验证过程。
综上所述,动作操作在爬虫中的应用可以提高数据的完整性和准确性,使爬虫能够更好地应对动态页面和交互式元素的挑战,从而实现更全面、高效的数据采集任务。
在接下来的章节中,我将详细介绍Selenium中常用的动作操作,并提供示例代码和说明,帮助大家理解和应用这些操作。
看过之前章节的伙伴可以跳过本节。
安装浏览器驱动详见《【Python从入门到进阶】34、selenium基本概念及安装流程》第三章节
使用python包管理工具安装Selenium库。或者在命令行中运行pip安装命令:
pip install selenium
并下载完驱动和设置好驱动路径后,就可以开始使用Selenium库编写脚本程序了,引入selenium的相关库,运行后能打开浏览器(闪一下)则表示配置成功:
from selenium import webdriver
driver = webdriver.Chrome()
使用click()方法实现单击操作:
element = driver.find_element(By.XPATH, 'xpath_expression')
element.click()
示例代码说明:
find_element()方法用于定位目标元素,可使用不同的定位方式(如XPath、CSS选择器、ID、NAME等)。
click()方法将模拟用户单击目标元素。
使用send_keys()方法实现单击操作:
element = driver.find_element(By.XPATH, 'xpath_expression')
element.send_keys("要输入的字符串")
示例代码说明:
find_element()方法用于定位目标元素,可使用不同的定位方式(如XPath、CSS选择器、ID、NAME等),该元素应该是类似input框等可以输入内容的元素。
send_keys()方法将模拟用户在输入框中输入内容。
使用driver.back()方法实现后退操作,driver.forward()方法实现前进操作:
driver = webdriver.Chrome()
# 做几项网络操作,最好是可以前往新页面的操作
driver.back()
driver.forward()
使用execute_script()方法实现鼠标滚动:
driver.execute_script("window.scrollTo(0,document.body.scrollHeight)")
示例代码说明:
execute_script()方法可以执行JavaScript代码,这里使用JavaScript执行了一段可以实现页面滚动至底部的JS代码。
通过修改scrollHeight的值可以调整滚动的位置,如将scrollHeight修改为0则表示滚动至页面顶部。
使用 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代码片段,包括元素本身及其所有子元素。
可以使用该方法将特定元素的代码片段保存到变量中或进行其他处理。
使用current_url属性获取当前网页的 URL:
url = driver.current_url
print(url)
示例代码说明:
current_url属性返回当前网页的完整URL。
可以将URL保存到变量中或进行其他处理。
使用context_click()方法实现右键单击操作:
element = driver.find_element(By.XPATH, 'xpath_expression')
ActionChains(driver).context_click(element).perform()
示例代码说明:
context_click()方法模拟鼠标右键单击操作。
perform()方法执行所有已定义的鼠标操作。
使用move_to_element()方法实现悬停操作:
element = driver.find_element(By.XPATH, 'xpath_expression')
ActionChains(driver).move_to_element(element).perform()
示例代码说明:
move_to_element()方法将鼠标移动到指定元素上。
perform()方法执行所有已定义的鼠标操作。
使用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()方法执行所有已定义的鼠标操作。
(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将等待指定的时间后再进行查找。
使用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 判断页面加载状态,从而确定页面是否加载完成。
关闭网页
使用close()方法关闭当前窗口:
driver.close()
示例代码说明:
close()方法用于关闭当前的浏览器窗口。
当前窗口关闭后,如果还有其他窗口存在,则焦点会切换到最后一个打开的窗口。
使用quit()方法退出整个浏览器会话:
driver.quit()
示例代码说明:
quit()方法将关闭所有打开的浏览器窗口,并终止与WebDriver的连接。
推荐在测试结束后使用quit()方法,以确保资源得到正确释放。
以下是我按照上面的所有操作实例(除异步加载和拖拽外),通过访问百度页面进行操作的验证,完整代码如下,有兴趣的同学可以运行一下试试看:
# _*_ 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