Selenium自动化:轻松实现网页操控

selenium自动化

1 什么是 Selenium 自动化

Selenium 是一个用于 Web 应用程序测试的工具,支持多种浏览器(如 Chrome、Firefox、Edge 等)。WebDriver 是 Selenium 的核心组件,用于控制浏览器行为并执行自动化操作。元素定位是通过各种方式(如 ID、Class Name、XPath 等)在网页上找到特定元素。

2 为什么要使用 Selenium 自动化

Selenium 可以用于自动化测试,减少人工测试的工作量。Selenium 可以用于抓取动态加载的数据,这些数据通常无法通过简单的 HTTP 请求获取。Selenium 支持多种浏览器,确保应用在不同浏览器上的一致性。

3 什么时候使用 Selenium 自动化

当网页内容是通过 JavaScript 动态加载时,Selenium 是抓取这些数据的理想工具。当需要模拟复杂的用户交互(如点击、输入、滚动等)时,Selenium 非常有用。在需要频繁进行回归测试或跨浏览器测试时,Selenium 是首选工具。

4 如何使用 Selenium 自动化

安装 Selenium 库和浏览器驱动(如 ChromeDriver)。打开浏览器、导航到 URL、定位元素、点击、输入等。处理弹出窗口、等待元素加载、执行 JavaScript 等。处理元素未找到、超时等异常情况。

安装与配置

安装 Selenium 库

pip install selenium==4.5.0

下载浏览器驱动(如 ChromeDriver)

将浏览器驱动程序的路径添加到系统环境变量中。

注意:不同版本的浏览器驱动程序支持的浏览器版本也不同,在下载浏览器驱动程序之前,先查看当前浏览器的版本号。

查看 Chrome 浏览器版本

单击 Chrome 浏览器右上角的图标打开 “自定义及控制 Google Chrome” 菜单,在该菜单中选择 “帮助”→“关于 Google Chrome” 打开关于 Chrome 页面。

访问 chromedriver 官网

根据 Chrome 浏览器的版本号,到 chromedriver官网 官方网站或者到 最新最全的外网

chromedriver驱动网站与Chrome浏览器版本对应的chromedriver的下载列表,下载对应版本的 ChromeDriver。

下载 chromedriver

单击与浏览器相应版本的 ChromeDriver 链接,进入下载页面,下载 ZIP 格式的压缩包到本地,解压后得到 chromedriver.exe。

WebDriver 的配置

将 WebDriver 配置到系统环境变量后,程序中再次使用 WebDriver 时,就不需要重复指定 WebDriver 的执行路径了。

5 代码演示:selenium 的基本使用

from selenium import webdriver
​
url = 'https://www.baidu.com'
​
# 创建浏览器操作对象
browser = webdriver.Chrome()
​
# 打开网页
browser.get(url)
# 获取源码(同requests.text)
print(browser.page_source)
input('用户按下回车键退出')
# 退出
browser.quit()

6 Selenium 元素定位

元素定位首先要找到它们,WebDriver 提供很多定位元素的方法:

定位方式By 标识符示例
IDBy.IDfind_element(By.ID, "kw")
Name 属性By.NAMEfind_element(By.NAME, "wd")
Class nameBy.CLASS_NAMEfind_element(By.CLASS_NAME, "s_ipt")
标签名By.TAG_NAMEfind_elements(By.TAG_NAME, "input")
链接文本By.LINK_TEXTfind_element(By.LINK_TEXT, "新闻")
部分链接文本By.PARTIAL_LINK_TEXTfind_element(By.PARTIAL_LINK_TEXT, "新")
CSS 选择器By.CSS_SELECTORfind_element(By.CSS_SELECTOR, "#su")
XPathBy.XPATHfind_element(By.XPATH, '//input[@id="su"]')

6.1 代码演示:selenium 的元素定位

from selenium import webdriver
# 定位元素,必须要导入By
from selenium.webdriver.common.by import By
​
url = 'https://www.baidu.com'
​
# 创建浏览器操作对象
browser = webdriver.Chrome()
​
# 打开网页
browser.get(url)
​
# 通过id获取输入框
res1 = browser.find_element(By.ID,'kw')
print(res1)
​
# 通过name获取输入框
res2 = browser.find_element(By.NAME,'wd')
print(res2)
​
# 通过XPath获取输入框
res3 = browser.find_element(By.XPATH,"//*/input[@id='kw']")
print(res3)
print(res1==res2 and res2==res3)# True
​
# 通过类名获取输入框
res4 = browser.find_element(By.CLASS_NAME,"s_ipt")
​
# 通过css选择器来获取输入框
res5 = browser.find_element(By.CSS_SELECTOR,"#kw")
print(res3==res4 and res4==res5)# True
​
# 通过通过链接文本获取标签
res6 = browser.find_element(By.LINK_TEXT,"新闻")
​
# 通过部分链接文本获取标签
res7 = browser.find_element(By.PARTIAL_LINK_TEXT,"闻")
print(res6==res7)# True
​
# 通过标签名,并且由复数的形式获取a标签
res8 = browser.find_elements(By.TAG_NAME,"a")
print(res8)
​
input('用户按下回车键退出~')
# 退出
browser.quit()

7 访问元素信息

获取元素属性 .get_attribute('class'),获取元素文本 .text,获取标签名.tag_name

8 代码演示:元素信息获取

from selenium import webdriver
from selenium.webdriver.common.by import By
​
# 创建浏览器操作对象
browser = webdriver.Chrome()
​
url = "https://www.baidu.com"
# 打开网页
browser.get(url)
​
# 获取到新闻文本的a链接(通过链接文本内容)
a = browser.find_element(By.LINK_TEXT,"新闻")
​
# 获取href
a_href = a.get_attribute('href')
print(f"href:{a_href}")
# 结果:href:http://news.baidu.com/
​
# 获取class
a_class = a.get_attribute('class')
print(f"class:{a_class}")
# 结果:class:mnav c-font-normal c-color-t
​
# 获取文本内容
a_text = a.text
print(a_text)
# 结果:新闻
​
# 获取标签名称
a_tag_name = a.tag_name
print(a_tag_name)
# 结果:a

9 交互操作

点击、send_keys()、后退操作、前进操作、模拟 JS 滚动、执行 JS 代码、获取网页代码 page_source、退出。

9.1 代码演示:selenium 元素交互

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
​
# 创建浏览器操作对象
browser = webdriver.Chrome()
# 将窗口最大化
# browser.maximize_window()
​
url = 'https://www.baidu.com'
# 打开浏览器
browser.get(url)
​
# 获取输入框
get_input = browser.find_element(By.ID,"kw")
# 输入周杰伦
get_input.send_keys('周杰伦')
​
# 获取点击按钮
get_button = browser.find_element(By.CSS_SELECTOR,"input[type='submit']")
# 执行点击操作
get_button.click()
​
def scoll():# 这里要进行等待,否则后面的滑动页面没有反应,目的是等待页面加载time.sleep(2)# 执行滑动js = 'document.documentElement.scrollTop=100000'browser.execute_script(js)
def next_page():scoll()time.sleep(2)# 获取下一页按钮next_button = browser.find_element(By.PARTIAL_LINK_TEXT,"下一页")# 执行点击操作next_button.click()
for i in range(3):next_page()
# 导航操作
browser.back()  # 回退
time.sleep(2)
browser.forward() # 前进
input('回车键退出程序~')
browser.quit()

10 案例练习

12306 注册下拉框功能实现

# 导入模块
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select  # 专门处理下拉框
​
# 目标网站
url = 'https://kyfw.12306.cn/otn/regist/init'
​
# 创建浏览器操作对象
browser = webdriver.Chrome()
​
# 打开网页
browser.get(url)
​
# 获取下拉框对象
get_selector = browser.find_element(By.ID,'cardType')
# 实例化Selectors对象
selector = Select(get_selector)
time.sleep(2)
# 使用value来选定
# selector.select_by_value('B')
# 使用索引来选择
selector.select_by_index(5)
input('回车键退出程序~')
browser.quit()

11 案例实战

目标

开发一个爬虫程序,从苏宁易购网站抓取口红商品信息,并保存为 CSV 文件。

目标网址

苏宁易购(Suning.com)-换新到苏宁 省钱更省心!

要求
  1. 商品信息采集:实现苏宁易购平台特定商品(口红)信息的自动化采集,支持多页数据连续采集。

  2. 用户交互模拟:实现浏览器自动化操作,模拟真实用户搜索行为,处理页面动态加载内容。

  3. 数据存储与分析:结构化存储商品信息,支持后续数据分析处理,提供可扩展的数据存储方案。

需求

商品信息包括:商品名、评论数、价格、店铺名、详情页链接。

页面结构分析

通过分析,每个商品都是一个 <li> 标签,这一页的所有数据都在一个 <ul> 标签里面。

实现思路分析
  1. 打开网站

  2. 输入内容(口红)

  3. 点击搜索

  4. 拖动滚轮到底部

  5. 爬取数据 / 解析数据

  6. 翻页处理

实现代码:

# 导入模块
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
import csv# 目标网站
url = 'https://www.suning.com/'# 创建浏览器操作对象
browser = webdriver.Chrome()browser.maximize_window()
# 打开网页
browser.get(url)# 获取输入框对象
input_element = browser.find_element(By.ID,"searchKeywords")
# 执行输入
input_element.send_keys('口红')
time.sleep(1)# 获取点击按钮
button_element = browser.find_element(By.ID,"searchSubmit")
# 执行点击
button_element.click()
time.sleep(1)
# 下滑
def drop_down():time.sleep(6)for x in range(1,12,2):time.sleep(1)j = x / 9js = f'document.documentElement.scrollTop = document.documentElement.scrollHeight * {j}'browser.execute_script(js)
# 获取数据
def get_info():# 先执行下拉drop_down()# 构建字典info_dict = {'商品名称':"",'商品价格':"",'评论数':"",'店铺名称':"",'详情链接':"",'图片url':""}# 获取每一个盒子list_box = browser.find_elements(By.CLASS_NAME,"product-box ")if list_box:for box in list_box:# 获取商品名称title = box.find_element(By.CSS_SELECTOR,".title-selling-point > a").textinfo_dict['商品名称'] = title# 获取商品价格price = box.find_element(By.CSS_SELECTOR,".def-price").textinfo_dict['商品价格'] = price# 获取评论数comment = box.find_element(By.CSS_SELECTOR,".info-evaluate > a").textinfo_dict['评论数'] = comment# 获取店铺名称dianpu = box.find_element(By.CSS_SELECTOR,".store-stock > a").textinfo_dict['店铺名称'] = dianpu# 获取详情链接detail_url = box.find_element(By.CSS_SELECTOR,".title-selling-point > a").get_attribute('href')info_dict['详情链接'] = detail_url# 获取图片urlphoto_url = box.find_element(By.CSS_SELECTOR,".sellPoint > img").get_attribute('src')info_dict['图片url'] = photo_urlcsv_writer.writerow(info_dict)print(info_dict)else:print('没有获取到所有盒子')
flag = True
i = 1
with open('苏宁易购_口红.csv','w',newline='',encoding='utf-8') as f:field_list = ['商品名称','商品价格','评论数','店铺名称','详情链接','图片url']csv_writer = csv.DictWriter(f,fieldnames=field_list)csv_writer.writeheader()while flag:try:print(f'正在获取第{i}页内容')# 调用获取内容函数get_info()# # 获取下一页按钮# next_page_btn = browser.find_element(By.ID,"nextPage")# # 执行点击下一页# next_page_btn.click()# 翻页browser.execute_script('document.querySelector("#nextPage").click()')time.sleep(2)  # 等待页面加载i += 1except Exception as e:flag = Falseprint('已经是最后一页了')input('回车键结束')browser.quit()

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

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

相关文章

又开发了一个优雅的小工具!

在开源项目中&#xff0c;Issues是一个强大的功能&#xff0c;用于跟踪bug、功能请求和任务。然而&#xff0c;随着项目的发展&#xff0c;Issues可能会变得难以管理&#xff0c;特别是当你需要离线访问或进行深入分析时。 当然GitHub Issues除了上述功能以外&#xff0c;做在线…

【安装教程】Docker Desktop 安装与使用教程

文章目录一、环境要求二、安装步骤2.1 安装 WSL 2&#xff08;适用于非专业版 Windows 10 及 Windows 11&#xff09;2.2 安装 Docker Desktop2.3 汉化 DDocker Desktop2.4 卸载 Docker Desktop三、使用 Docker3.1验证安装3.2. 拉取镜像3.3. 运行容器3.4. 查看容器3.5.更改容器…

Hutool 的 WordTree(敏感词检测)

package cn.hutool.dfa;WordTree 继承自 HashMap<Character, WordTree>&#xff0c;表示一个字符到子树的映射&#xff0c;构成一颗“词树”&#xff08;类似 Trie 树&#xff09;&#xff0c;用于快速匹配字符串中的词语&#xff08;敏感词检测、关键词匹配等&#xff0…

Makefile 从入门到精通:自动化构建的艺术

引入 在软件开发的世界里&#xff0c;“编译” 是绕不开的环节&#xff0c;但手动编译大型项目时&#xff0c;重复输入编译命令的痛苦&#xff0c;相信每个开发者都深有体会。Makefile 作为自动化构建的基石&#xff0c;能让编译过程“一键完成”&#xff0c;甚至智能判断文件变…

利用DeepSeek将Rust程序的缓冲输出改写为C语言实现提高输出效率

在前面多语言测试中&#xff0c;遇到一个难以置信的问题&#xff0c;rust的输出到文件比c语言还快&#xff0c;这是不合情理的&#xff0c;通过对两者输出语句的比较&#xff0c;发现了不同。 rust程序在输出到stdout前有这么一句 let mut writer BufWriter::with_capacity(6…

Java Optional 类教程详解

一、Optional 类核心定位Optional 是 Java 8 引入的函数式容器类&#xff08;java.util.Optional&#xff09;&#xff0c;专为​​显式空值处理​​设计。其核心价值在于&#xff1a;消除 60% 以上的传统 null 检查代码通过类型系统强制空值声明&#xff0c;降低 NPE 风险支持…

Agent X MCP 把想法编译成现实

多模态GUI智能体协作型AI魔搭社区MCPMCP 硬件

cv快速input

效果<view class"miniWhether-box-lss"><view class"content-inp-text">快递单号</view><input class"content-inp-input" type"text"v-model"expressInfo.expressNo" placeholder"填写快递单号&…

[AI8051U入门第十二步]W5500-Modbus TCP从机

学习目标: 1、了解Modbus Tcp协议 2、学习Modbus Tcp 从机程序驱动 3、使用 Modbus Pull调试一、Modbus TCP介绍? Modbus TCP 是一种基于 TCP/IP 网络的工业通信协议,是 Modbus 协议家族中的一员,专门为以太网环境设计。它是 Modbus RTU(串行通信)协议的扩展,将 Modbus…

Python编程基础与实践:Python循环结构基础

循环结构 学习目标 通过本课程的学习&#xff0c;学员可以掌握Python中for循环和while循环的基本使用方法&#xff0c;了解如何利用循环结构来重复执行代码块&#xff0c;以及如何使用break和continue语句来控制循环的执行流程。 相关知识点 循环结构 学习内容 1 循环结构 1.1 …

趣谈设计模式之模板方法模式-老板,你的数字咖啡制作好了,请享用!

模板方法模式 定义了一套算法的骨架&#xff0c;讲某些具体的步骤延迟到子类中实现。 主要用于不改变算法结构的情况下重新定义算法的某些步骤&#xff0c;以适应新的需求。 模板方法的角色 抽象类&#xff1a; 作为算法的骨架&#xff0c;该抽象类中包含了算法的核心部分和…

技术栈:基于Java语言的搭子_搭子社交_圈子_圈子社交_搭子小程序_搭子APP平台

一、市场背景1、社会发展与生活方式转变城市化进程加快&#xff1a;随着城市化不断推进&#xff0c;大量人口涌入城市&#xff0c;人们生活的物理空间距离拉近了&#xff0c;但人际关系却在一定程度上变得疏离。传统的基于血缘、地缘建立起的紧密社交关系难以满足城市生活中的多…

字典在VBA与VB.NET的区别,举例说明

简述&#xff1a;在VBA中&#xff0c;字典通常使用Scripting.Dictionary对象&#xff0c;通过CreateObject("Scripting.Dictionary")创建。它需要引用Microsoft Scripting Runtime库&#xff08;scrrun.dll&#xff09;。VBA字典的方法包括Exists、Add、Remove等&…

2024年网络安全案例

以下是2024年造成严重损失的网络安全典型案例&#xff0c;涵盖市政系统、金融交易、区块链平台、国家级攻击及全球性IT故障五大领域&#xff0c;按损失规模和技术危害性综合排序&#xff1a;---一、市政基础设施攻击 1. 加拿大汉密尔顿市勒索软件事件 - 损失&#xff1a;183…

PINN+贝叶斯:深度学习中的魔改新思路

2025深度学习发论文&模型涨点之——PINN贝叶斯PINN通过将物理定律&#xff08;如偏微分方程PDEs&#xff09;嵌入神经网络的损失函数中&#xff0c;使得模型能够利用已知的物理规律来指导学习过程&#xff0c;从而在数据有限或噪声较多的情况下实现更高的准确性。然而&…

零基础-动手学深度学习-8.3. 语言模型和数据集

很至关重要的一章: 8.3.1. 学习语言模型 8.3.2. 马尔可夫模型与n元语法 n元语法看的序列长度是固定的&#xff0c; 存储的序列长是有限且可控的&#xff0c;使用统计方法的时候通常使用这个模型&#xff01;&#xff01;&#xff01;统计方法&#xff01;&#xff01;&#x…

C++ 模板初阶

什么是模板&#xff1f; 模板&#xff08;Template&#xff09;是 C 中实现泛型编程的核心工具。它允许我们编写与具体数据类型无关的代码&#xff0c;从而实现代码复用和类型安全。为什么需要模板&#xff1f; 举个生活中的例子&#xff1a;如果你要造一个能装水的杯子&#x…

DockerFile文件执行docker bulid自动构建镜像

文章目录一、Dockerfile介绍二、Dockerfile镜像制作和流程使用三、Dockerfile文件的制作镜像的分层结构四、Dockerfile文件格式五、Dockerfile相关指令5.1 FROML&#xff1a;指定基础镜像5.2 LABEL&#xff1a;指定镜像元数据5.3 RUN&#xff1a;执行shell指令5.4 ENV&#xff…

osloader!DoGlobalInitialization函数分析之HW_CURSOR--NTLDR源代码分析之设置光标

第一部分&#xff1a; VOID DoGlobalInitialization(IN PBOOT_CONTEXT BootContextRecord){//// Turn the cursor off//HW_CURSOR(0,127);D:\srv03rtm\base\boot/inc/bldrx86.h:258:#define HW_CURSOR (*ExternalServicesTable->HardwareCursor)第二部分&#xff…

Elasticsearch 索引及节点级别增删改查技术

以下是针对 Elasticsearch 索引及节点级别增删改查技术做的简短总结&#xff1a; 一、索引操作创建索引 功能&#xff1a;指定分片、副本数及映射规则[2][4]。示例&#xff1a;PUT /<index_name>​&#xff0c;可定义 settings&#xff08;如分片数&#xff09;和 mappin…