基于Selenium技术方案的爬取界面内容实践

1. 定位页面(多窗口切换)

WebDriver提供了处理多个窗口的能力,这是通过使用“WebDriver.switchTo.window()”方法来切换到已知名称的窗口来实现的。如果名称未知,您可以使用“WebDriver.getWindowHandles()”获取已知窗口列表。您可以将句柄传递给switchTo.window()。

  • 获取当前窗口句柄
    driver.current_window_handle

  • 返回的所有窗口的句柄到当前会话
    driver.window_handles

  • 切换窗口,可以实现在不同的窗口之间切换。
    switch_to.window()

示例代码:

# 模拟按下回车键进行搜索
search_box.send_keys(Keys.RETURN)
# 等待页面加载
driver.implicitly_wait(15)
# 切换新窗口
window_handles = driver.window_handles
driver.switch_to.window(window_handles[1])

2. 定位界面元素

WebDriver中的find_element() 方法用来查找元素,并返回 WebElement 对象。其中,find_element是直接WebElement 对象,find_elements是直接WebElement 对象的列表(list),也就是多个对象(需要注意)。

详细内容参考官方文档,https://www.selenium.dev/documentation/webdriver/elements/。举例介绍如下:

在这里插入图片描述

<html>
<body>
<style>
.information {
  background-color: white;
  color: black;
  padding: 8px;
}
</style>

<h2>Contact Selenium</h2>

<form action="/action_page.php">
  <input type="radio" name="gender" value="m" />Male &nbsp;
  <input type="radio" name="gender" value="f" />Female <br>
  <br>
  <label for="fname">First name:</label>
  <input class="information" type="text" id="fname" name="fname" value="Jane"><br><br>
  <label for="lname">Last name:</label>
  <input class="information" type="text" id="lname" name="lname" value="Doe"><br><br>
  <label for="newsletter">Newsletter:</label>
  <input type="checkbox" name="newsletter" value="1" /><br><br>
  <input type="submit" value="Submit">
</form> 

<p>To know more about Selenium, visit the official page 
<a href ="www.selenium.dev">Selenium Official Page</a> 
</p>

<div id='adddiv'>增加div看看</div>

</body>
</html>
定位方式By说明
idBy.ID定位ID属性与搜索值匹配的元素
nameBy.NAME定位NAME属性与搜索值匹配的元素
class_nameBy.CLASS_NAME定位具有包含搜索值的类名的元素(不允许使用复合类名)
tag_nameBy.TAG_NAME定位标签名与搜索值匹配的元素
link_textBy.LINK_TEXT定位可见文本与搜索值匹配的锚点元素
partial_link_textBy.PARTIAL_LINK_TEXT定位可见文本部分与搜索值匹配的锚点元素
css_selectorBy.CSS_SELECTOR定位与CSS选择器匹配的元素
xpathBy.XPATH定位与XPath表达式匹配的元素

class name

HTML页面的Web元素可以具有class属性。在上面的HTML代码片段中可以看到一个示例。我们可以使用Selenium中的class name定位器来识别这些元素。

    driver = webdriver.Chrome()
	driver.find_element(By.CLASS_NAME, "information")
  

css selector

CSS是用于样式化HTML页面的语言。我们可以使用css selector定位器策略来识别页面上的元素。如果元素具有id,则创建定位器为css = #id。否则,我们遵循的格式是css =[attribute=value]。让我们从上面的HTML代码片段中看一个示例。我们将使用css为First Name文本框创建定位器。

	driver.find_element(By.CSS_SELECTOR, "#fname")

xpath

HTML文档可以被视为XML文档,然后我们可以使用xpath来定位感兴趣的元素。XPath是从文档的根开始遍历的路径,可以是绝对XPath或相对XPath。例如,/html/form/input[1]将返回男性单选按钮。或者XPath也可以是相对的,例如//input[@name=‘fname’]将返回名字文本框。让我们使用xpath为女性单选按钮创建定位器。

	driver.find_element(By.XPATH, "//input[@value='f']")

3. 操作

3.1. 键盘操作

键盘操作是指与网页交互的任何键输入设备的一种表示。使用键盘只能完成两项操作:按下一个键和释放按下的键。除了支持ASCII字符外,每个键盘按键都有指定的序列来表示可以按下或释放。

例如,输入关键字,按下回车键搜索。

	# 在搜索框中输入关键词
	search_box.send_keys("selenium")
	# 模拟按下回车键进行搜索
	search_box.send_keys(Keys.RETURN)

3.2. 鼠标键操作

鼠标操作是指与网页交互的任何指针设备的一种表示。使用鼠标只能完成三项操作:按下一个按钮、释放按下的按钮和移动鼠标。Selenium提供了方便的方法,将这些动作以最常见的方式组合在一起。

这种方法结合了将鼠标移动到元素的中心并按下和释放鼠标左键的动作,否则称为“点击”。

	# 模拟用鼠标点击链接操作
	clickable = driver.find_element(By.LINK_TEXT, "哈尔滨")
	ActionChains(driver).click(clickable ).perform()

3.3. 界面加载等待

driver.implicitly_wait(n),n是设置时长,单位为秒。

隐性等待设置了一个时间,在一段时间内网页是否加载完成,如果完成了,就进行下一步,在设置的时间内没有加载完成,则会报超时加载。

另外一点,隐性等待的设置是全局性的,在开头设置过之后,整个的程序运行过程中都会有效,都会等待页面加载完成,不需要每次设置一遍。

4. 小结

完整代码示例:

from selenium import webdriver
from selenium.webdriver import Keys, ActionChains
from selenium.webdriver.common.by import By

driver = webdriver.Chrome() 

url = 'https://www.****'
driver.get(url)
driver.maximize_window()

search_box = driver.find_element(By.LINK_TEXT, "哈尔滨")
ActionChains(driver).click(search_box).perform()
driver.implicitly_wait(10)

# 获取搜索框元素
search_box = driver.find_element(By.ID ,"search-input")   # 按ID查询

# 在搜索框中输入关键词
search_box.send_keys("群力家园(C区)")
# 模拟按下回车键进行搜索
search_box.send_keys(Keys.RETURN)

# 切换新窗口
window_handles = driver.window_handles
driver.switch_to.window(window_handles[1])
# 定位详细链接
xpath = "//*[@id='esfMain']/section/div/div/a"
driver.find_element(By.XPATH, xpath).click()
# 再切换窗口
window_handles = driver.window_handles
driver.switch_to.window(window_handles[3])
# 获取详细数据
selector2 = "#__layout > div > div.props-main.w-1170 > div.props-body > div.props-right > div.maininfo > div.info > div"
search_results2 = driver.find_element(By.CSS_SELECTOR, selector2)
search_results2.text

使用Selenium工具可以模拟人工操作应用,完成相应工作,以此提高工作效率。从技术角度来看,Selenium还是比较容易实现的。

参考:

测试界的飘柔. Selenium实现多页面切换. CSDN博客. 2023.07
肖永威. 基于Selenium技术方案的爬虫入门实践. CSDN博客. 2023.08

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

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

相关文章

【论文阅读】EULER:通过可扩展时间链接预测检测网络横向移动(NDSS-2022)

作者&#xff1a;乔治华盛顿大学-Isaiah J. King、H. Howie Huang 引用&#xff1a;King I J, Huang H H. Euler: Detecting Network Lateral Movement via Scalable Temporal Graph Link Prediction [C]. Proceedings 2022 Network and Distributed System Security Symposium…

k8s基础

k8s基础 文章目录 k8s基础一、k8s组件二、k8s组件作用1.master节点2.worker node节点 三、K8S创建Pod的工作流程&#xff1f;四、K8S资源对象1.Pod2.Pod控制器3.service && ingress 五、K8S资源配置信息六、K8s部署1.K8S二进制部署2.K8S kubeadm搭建 七、K8s网络八、K8…

数据库--MySQL

一、什么是范式&#xff1f; 范式是数据库设计时遵循的一种规范&#xff0c;不同的规范要求遵循不同的范式。 最常用的三大范式 第一范式(1NF)&#xff1a;属性不可分割&#xff0c;即每个属性都是不可分割的原子项。(实体的属性即表中的列) 第二范式(2NF)&#xff1a;满足…

打造专属花店展示小程序

在当今社会&#xff0c;微信小程序已经成为了各行各业拓展客户资源的利器&#xff0c;而花店行业也不例外。通过打造一个独特的花店小程序&#xff0c;你可以为你的花店带来更多的曝光和客户资源。那么&#xff0c;如何制作一个专属的花店小程序呢&#xff1f;下面我们就来一步…

【Mysql】数据库基础与基本操作

&#x1f307;个人主页&#xff1a;平凡的小苏 &#x1f4da;学习格言&#xff1a;命运给你一个低的起点&#xff0c;是想看你精彩的翻盘&#xff0c;而不是让你自甘堕落&#xff0c;脚下的路虽然难走&#xff0c;但我还能走&#xff0c;比起向阳而生&#xff0c;我更想尝试逆风…

flask-----初始项目架构

1.初始的项目目录 -apps 包 ------存放app -user文件夹 -------就是一个app -models.py --------存放表模型 -views.py -------存放主代码 -ext包 -init.py -------实例化db对象 -manage.py -----运行项目的入口 -setting.py -----配置文件 2.各文件内容 manage…

什么是DNS的缓存?

DNS 缓存是一个临时的数据库&#xff0c;存储在计算机或网络设备&#xff08;如路由器&#xff09;上&#xff0c;用于保存最近的 DNS 查询结果。这种缓存机制可以加速后续的相同查询&#xff0c;因为设备可以直接从缓存中提取先前的查询结果&#xff0c;而不需要再次到外部的 …

程序员怎么利用ChatGPT解放双手=摸鱼?

目录 1. 当你遇到问题时为你生成代码ChatGPT 最明显的用途是根据查询编写代码。我们都会遇到不知道如何完成任务的情况&#xff0c;而这正是人工智能可以派上用场的时候。例如&#xff0c;假设我不知道如何使用 Python 编写 IP 修改器&#xff0c;只需查询 AI&#xff0c;它就…

日常BUG ——乱码

&#x1f61c;作 者&#xff1a;是江迪呀✒️本文关键词&#xff1a;日常BUG、BUG、问题分析☀️每日 一言 &#xff1a;存在错误说明你在进步&#xff01; 一、问题描述 A系统使用Feign调用B系统时&#xff0c;传递的String字符串&#xff0c;到了B系统中变为了乱…

企业服务器数据库中了devos勒索病毒怎么办如何解决预防勒索病毒攻击

随着科学技术的不断发展&#xff0c;计算机可以帮助我们完成很多重要的工作&#xff0c;但是随之而来的网络威胁也不断提升。近期&#xff0c;我们收到很多企业的求助&#xff0c;企业的服务器数据库遭到了devos勒索病毒攻击&#xff0c;导致系统内部的许多重要数据被加密无法正…

不同路径数

希望这篇题解对你有用&#xff0c;麻烦动动手指点个赞或关注&#xff0c;感谢您的关注~ 不清楚蓝桥杯考什么的点点下方&#x1f447; 考点秘籍 想背纯享模版的伙伴们点点下方&#x1f447; 蓝桥杯省一你一定不能错过的模板大全(第一期) 蓝桥杯省一你一定不能错过的模板大全…

Zebec Protocol 将进军尼泊尔市场,通过 Zebec Card 推动地区金融平等

流支付正在成为一种全新的支付形态&#xff0c;Zebec Protocol 作为流支付的主要推崇者&#xff0c;正在积极的推动该支付方案向更广泛的应用场景拓展。目前&#xff0c;Zebec Protocol 成功的将流支付应用在薪酬支付领域&#xff0c;并通过收购 WageLink 将其纳入旗下&#xf…

MySQL 慢查询探究分析

目录 背景&#xff1a; mysql 整体结构&#xff1a; SQL查询语句执行过程是怎样的&#xff1a; 知道了mysql的整体架构&#xff0c;那么一条查询语句是怎么被执行的呢&#xff1a; 什么是索引&#xff1a; 建立索引越多越好吗&#xff1a;   如何发现慢查询&#xff1…

工厂老化设备维护的重要性及如何维护老化设备?

工业领域的老化设备问题日益凸显&#xff0c;对于保持生产稳定和效率至关重要。本文将探讨工厂老化设备维护的重要性&#xff0c;并介绍如何通过PreMaint设备数字化平台实现对老化设备的高效维护&#xff0c;从而确保工厂持续高效运转。 一、工厂老化设备的重要性 随着时间的推…

【办公自动化】使用Python一键提取PDF中的表格到Excel

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

单芯片3路CC管理的VR转接器解决方案

VR眼镜即VR头显&#xff0c;也称虚拟现实头戴式显示设备&#xff0c;随着元宇宙概念的传播&#xff0c;VR眼镜的热度一直只增不减&#xff0c;但是头戴设备的续航一直被人诟病&#xff0c;如果增大电池就会让头显变得笨重影响体验&#xff0c;所以目前最佳的解决方案还是使用VR…

【C++】const_cast基本用法(详细讲解)

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

第R3周 - 天气预测

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 我的环境&#xff1a; 语言环境&#xff1a;Python3.10.7编译器&#xff1a;VScode深度学习环境&#xff1a;TensorFlow 2.13.0 数据集&#xff1a; 一、前期…

【Opencv入门到项目实战】(九):项目实战|信用卡识别|模板匹配|(附代码解读)

所有订阅专栏的同学可以私信博主获取源码文件 文章目录 0.背景介绍1.模板处理1.1模板读取1.2预处理1.3轮廓计算 2.输入图像处理2.1图形读取2.2预处理2.3轮廓计算2.4计算匹配得分 3.小结 0.背景介绍 接下来我们正式进入项目实战部分&#xff0c;这一章要介绍的是一个信用卡号识…

【二】SPI IP核的使用

【一】SPI IP核使用&#xff1a;传送门 基于qsys通过spi外部总线协议对sd卡进行读写操作 一、实验平台与实验的目的&#xff1a; ​ 正点原子开拓者、芯片型号&#xff1a;EP4CE10F17C8&#xff1b;还需要一张sd卡。 ​ 该实验主要是利用SPI IP核驱动SD卡来实现读写实验&am…