基于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 <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 | 说明 |
|---|---|---|
| id | By.ID | 定位ID属性与搜索值匹配的元素 |
| name | By.NAME | 定位NAME属性与搜索值匹配的元素 |
| class_name | By.CLASS_NAME | 定位具有包含搜索值的类名的元素(不允许使用复合类名) |
| tag_name | By.TAG_NAME | 定位标签名与搜索值匹配的元素 |
| link_text | By.LINK_TEXT | 定位可见文本与搜索值匹配的锚点元素 |
| partial_link_text | By.PARTIAL_LINK_TEXT | 定位可见文本部分与搜索值匹配的锚点元素 |
| css_selector | By.CSS_SELECTOR | 定位与CSS选择器匹配的元素 |
| xpath | By.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 Bydriver = 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
相关文章:
基于Selenium技术方案的爬取界面内容实践
1. 定位页面(多窗口切换) WebDriver提供了处理多个窗口的能力,这是通过使用“WebDriver.switchTo.window()”方法来切换到已知名称的窗口来实现的。如果名称未知,您可以使用“WebDriver.getWindowHandles()”获取已知窗口列表。您…...
线程记录(1)
创建线程: 一、1.继承Thread,重写run(),将操作写入其中 2.创建子类对象,start() 二、1.实现runnable接口,实现run() 2.创建子类对象,将子类对象作为参数传递到thread的构造器中,创建出Thread类…...
requests
操作步骤 安装 requests 发送GET请求 发送POST请求 说明: data: 参数接收form表单数据,后台会⾃动附加form表单请求信息头(data数据格式为字典) json:参数接收json数据,后台会⾃动附加json表单请求信息头&…...
Python 监控 Windows 服务
Python 监控 Windows 服务 Python 在 Windows 系统上可以使用 wmi 模块来实现对 Windows 服务的监控。本文将介绍如何使用 Python 监控 Windows 服务,并实现服务状态的查询和服务启停功能。 安装依赖 在使用 wmi 模块之前,需要先安装 wmi包。可以使用…...
ELK中grok插件、mutate插件、multiline插件、date插件的相关配置
目录 一、grok 正则捕获插件 自定义表达式调用 二、mutate 数据修改插件 示例: ●将字段old_field重命名为new_field ●添加字段 ●将字段删除 ●将filedName1字段数据类型转换成string类型,filedName2字段数据类型转换成float类型 ●将filedNam…...
【C#】静默安装、SQL SERVER静默安装等
可以通过cmd命令行来执行,也可以通过代码来执行,一般都需要管理员权限运行 代码 /// <summary>/// 静默安装/// </summary>/// <param name"fileName">安装文件路径</param>/// <param name"arguments"…...
在vue3中定义组件的5种方式
在vue3中定义组件的5种方式 Vue 正在不断发展,目前在 Vue3 中定义组件的方法有多种。从选项式到组合式再到类API,情况截然不同。本文将会定义一个简单的组件并使用所有可用的方法重构它。 选项式 这是在 Vue 中声明组件的最常见方法。从 Vue1 就开始存…...
算法训练营题目,忘了第几天了
144. 二叉树的前序遍历 给你二叉树的根节点 root ,返回它节点值的 前序 遍历。 输入:root [1,null,2,3] 输出:[1,2,3] var res[]int func preorderTraversal(root *TreeNode) []int {res []int{}traval(root)return res }func traval(no…...
蓝桥杯-统计子矩阵
统计子矩阵 题目链接 思路: 使用前缀和滑动窗口 ,可以先计算出纵向或横向的前缀和,matrix[i][j]表示前i行第j列之和 然后遍历上边界top和下边界buttom,再这个上下边界内使用滑动窗口,由于前面维护了纵向前缀和&…...
在线预览Word、Excel、PowerPoint等文件
在我们工作时,经常会有在线查看各种不同类型的文件的需要,如Word文档、Excel表格、PowerPoint幻灯片和PDF等。可以直接在这里预览:https://www.compdf.com/webviewer/demo Word 文件实现前端预览 方案一: 使用 XDOC 可以实现预…...
准确预测极端降水,哥伦比亚大学推出升级版神经网络 Org-NN
内容一览:随着环境变化加剧,近年来全球极端天气现象频频出现,准确预测降水强度对人类以及自然环境都十分重要。传统模型预测降水的方差较小,偏向小雨,对极端降水预测不足。 关键词:极端天气 内隐学习 神经网…...
【数据结构】反转链表、链表的中间节点、链表的回文结构(单链表OJ题)
正如标题所说,本文会图文详细解析三道单链表OJ题,分别为: 反转链表 (简单) 链表的中间节点 (简单) 链表的回文结构 (较难) 把他们放在一起讲的原因是: 反转链…...
Python爬虫-抓取的目标数据为#x开头,怎么解决?
前言 本文是该专栏的第4篇,后面会持续分享python爬虫案例干货,记得关注。 在做爬虫项目的时候,有时候抓取的平台目标数据为&#x开头,如下图所示: 浏览器显示的正常数据,但通过爬虫协议获取到的网页源码数据却是以&#x开头的隐藏数据,遇到这种情况,爬虫需要怎么处…...
短视频账号矩阵系统/技术开发搭建私有部署
本系统是基于短视频领域的新一代系统,旨在提供一个高效、全面的短视频管理与分发平台。系统采用先进的开发算法和技术,实现了智能化视频分类、推荐和用户互动功能。 目录 一、抖音SEO账号矩阵系统的开发和部署遵循以下原则: 二、账号矩阵绑…...
光致发光二极管光源——荧光效率检测系统
发光二极管(LED)光源已经逐步地取代传统光源,并在生产和生活中得以广泛应用。荧光粉在LED照明设备中起到了至关重要的作用,其功能为将转换芯片所产生的紫外或者蓝光,发射出目标颜色的光。近年来,人们为了提…...
【手撕C语言】多线程
(꒪ꇴ꒪ ),Hello我是祐言QAQ我的博客主页:C/C语言,Linux基础,ARM开发板,软件配置等领域博主🌍快上🚘,一起学习,让我们成为一个强大的攻城狮!送给自己和读者的一句鸡汤🤔&…...
Dubbo2-概述
Dubbo 阿里公司开源的一个高性能,轻量级的javaRPC(远程服务调用方案)框架,提供高性能远程调用方案以及SOA服务治理方案 Dubbo架构 节点角色说明: Provider:服务提供方 Container:服务运行容器 Consumer:调用远程服务…...
【将回声引入信号中】在语音或音频文件中引入混响或简单回声,以研究回声延迟和回波幅度对生成的回波信号感知的影响(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
pythonocc进阶学习:投影projection
1.点 到 线,(直线,曲线)等上的投影 staticmethod # 点到Lin的投影 def Project_Pnt_To_Lin(p: gp_Pnt, lin: gp_Lin):Edge BRepBuilderAPI_MakeEdge(lin).Edge()curve BRep_Tool.Curve(Edge)proPnt GeomAPI_ProjectPointOnCurve(p, curve[0])Neares…...
Scractch3.0_Arduino_ESP32_学习随记_显示网络天气(二)
这里写目录标题 目的器材程序联系我们 目的 通过C02获取网络天气。并在屏上显示 器材 硬件: 齐护机器人C02 购买地址 软件: scratch3.0 下载地址:官网下载 程序 使用的是公开免费的API,对请求间隔和次数有限制,如果连续获取可能会被封IPÿ…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
