(6)python爬虫--selenium
文章目录
- 前言
- 一、初识selenium
- 二、安装selenium
- 2.1 查看chrome版本并禁止chrome自动更新
- 2.1.1 查看chrome版本
- 2.1.2 禁止chrome更新自动更新
- 2.2 安装对应版本的驱动程序
- 2.3安装selenium包
- 三、selenium关于浏览器的使用
- 3.1 创建浏览器、设置、打开
- 3.2 打开/关闭网页及浏览器
- 3.3 浏览器的最大/小化
- 3.4 浏览器打开位置、尺寸
- 3.5 浏览器截图、网页刷新
- 四、selenium关于元素的使用
- 4.1 元素定位
- 4.2 元素交互操作
- 4.3 元素八种定位方式
- 4.3.1 元素定位-ID
- 4.3.2 元素定位-NAME
- 4.3.3 元素定位-CLASS_NAME
- 4.3.4 元素定位-TAG_NAME
- 4.3.5 元素定位-LINK_TEXT
- 4.3.6 元素定位-PARTIAL_LINK_TEXT
- 4.3.7 元素定位-CSS_SELECTOR
- 4.3.8 元素定位-XPATH
- 4.4 元素定位的隐式等待
- 案例一: 获取表单元素并修改
- 案例二:重复填写表单
- 五、三种浏览器获取框(警告框、确认框、提示框)
- 5.1 警告框
- 5.2 确认框
- 5.3 提示框
- 六、 iframe嵌套网页内部元素获取
- 七、获取元素以及判断可见性
- 八、 网页前进、后退
- 总结
前言
在当今快速发展的互联网时代,自动化测试和网络爬虫技术已经成为开发者和测试工程师不可或缺的技能。Python 作为一门简洁、高效的编程语言,凭借其丰富的生态库和易用性,成为了自动化测试和爬虫开发的首选工具之一。而 Selenium,作为一款强大的浏览器自动化工具,不仅能够模拟用户操作,还能处理动态加载的网页内容,为开发者提供了极大的便利。
无论是进行 Web 应用的自动化测试,还是从复杂的网站中抓取数据,Selenium 都能胜任。它支持多种浏览器(如 Chrome、Firefox、Edge 等),并提供了灵活的 API,使得开发者可以轻松实现页面元素的定位、交互和验证。此外,结合 Python 的简洁语法,Selenium 让自动化任务的编写变得更加高效和直观。
本文将带你深入探索 Python 与 Selenium 的结合使用,从基础的环境搭建到高级的实战技巧,帮助你快速掌握这一强大工具。无论你是刚入门的新手,还是希望进一步提升技能的开发者,相信本文都能为你提供有价值的参考和启发。
一、初识selenium
- 自动化测试:快速完成重复性网页测试,提高效率
- 处理动态内容:完美支持JavaScript渲染的现代网页
- 跨浏览器支持:Chrome/Firefox/Edge等主流浏览器都兼容
- Python绝配:配合Requests/BeautifulSoup等库更强大
- 数据采集:解决普通爬虫无法处理的交互式网站
- 就业优势:Web自动化的必备技能,提升职场竞争力
简而言之:Selenium让网页自动化变得简单高效!
二、安装selenium
注意: 这里所有的举例都采用chrome浏览器。对于其他浏览器大致步骤一致。
2.1 查看chrome版本并禁止chrome自动更新
2.1.1 查看chrome版本
步骤: 设置
➡ ➡ 关于chrome
➡ ➡ 查看版本
2.1.2 禁止chrome更新自动更新
chrome自动更新会导致chrome驱动出现失效问题,因而需要禁止自动更新。
详细步骤:
Win+ R 打开输入services.msc
找到所有关于Google更新的相关程序,双击打开改为禁用即可
重新打开chrome 出现该效果即表示成功
2.2 安装对应版本的驱动程序
网址:
https://storage.googleapis.com/chrome-for-testing-public/你的版本号/win64/chromedriver-win64.zip
安装好对应的zip包之后,将其解压,复制一份chromedriver.exe程序
2.3安装selenium包
安装方式:通过之前安装(lxml,jsonpath等)操作来安装selenium,这里不再介绍。
三、selenium关于浏览器的使用
3.1 创建浏览器、设置、打开
注意:第一步先将复制的文件粘贴到对应的项目下面
测试:
# 用于操作浏览器
# from selenium import webdriver
# 用于设置谷歌浏览器
# from selenium.webdriver.chrome.options import Options
# 用于管理谷歌驱动
# from selenium.webdriver.chrome.service import Service# (1)导包
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service# 创建浏览器对象
options = Options()
# 禁用沙盒模式(增加兼容性)--- 如果没有出现秒闪退问题,可以不填入
options.add_argument('--no-sandbox')
# 保持浏览器打开状态(默认执行完之后会自动关闭)
options.add_experimental_option("detach", True)
# 创建并启动浏览器
browse = webdriver.Chrome(service=Service('chromedriver.exe'),options=options)
3.2 打开/关闭网页及浏览器
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
import time# 封装
def setup():options = Options()options.add_experimental_option("detach", True)browser = webdriver.Chrome(service=Service('chromedriver.exe'),options=options)return browserbrowser = setup()
# 打开指定的网址
browser.get('https://www.baidu.com')
# 打印源码
print(browser.page_source)
time.sleep(3)
# 关闭当前的标签页
browser.close()
# 退出浏览器并释放驱动
browser.quit()
3.3 浏览器的最大/小化
import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Servicedef setup():options = Options()options.add_experimental_option("detach", True)browser = webdriver.Chrome(service=Service('chromedriver.exe'),options=options)return browserbrowser = setup()browser.get('https://www.baidu.com')
time.sleep(2)
# 浏览器最大化
browser.maximize_window()
time.sleep(2)
# 浏览器最小化
browser.minimize_window()
time.sleep(2)
# 重新返回最大化
browser.maximize_window()
time.sleep(2)
# 关闭浏览器
browser.quit()
3.4 浏览器打开位置、尺寸
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Servicedef setup():options = Options()options.add_experimental_option('detach', True)browser = webdriver.Chrome(service=Service('chromedriver.exe'), options=options)return browserbrowser = setup()# 单位均为像素
# 设置浏览器打开的位置(相对于左上角)
browser.set_window_position(100,100)
# 设置宽高px
browser.set_window_size(800,600)
# 关闭浏览器
browser.quit()
3.5 浏览器截图、网页刷新
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
import time
def setup():options = Options()options.add_experimental_option('detach', True)browser = webdriver.Chrome(service=Service('chromedriver.exe'), options=options)return browserbrowser = setup()
browser.get('https://www.baidu.com')
# 浏览器截图(尽量保存为png的格式)
browser.get_screenshot_as_file('baidu.png')
time.sleep(3)
# 刷新当前页
browser.refresh()
time.sleep(3)
# 关闭
browser.quit()
四、selenium关于元素的使用
4.1 元素定位
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
import time
def setup():options = Options()options.add_experimental_option('detach', True)browser = webdriver.Chrome(service=Service('chromedriver.exe'), options=options)return browserbrowser = setup()
browser.get('https://www.baidu.com')
# 使用元素定位需要先导入对应的包
# from selenium.webdriver.common.by import By# 例如根据ID查找百度首页的输入框
# <input id="kw" name="wd"># find_element用来查找一个元素时使用
# 找不到时会直接报错
# 类似于根据id查找的,使用该方法即可,id是元素的唯一标识
input = browser.find_element(By.ID, 'kw')
# 获取class
print(input.get_attribute('class'))
# 获取标签名
print(input.tag_name)# find_elements用来查找多个元素时使用
# 返回的是列表,找不到时不会报错会返回一个空列表
inputs = browser.find_elements(By.ID, 'kw')
print(inputs)# 提示一下:也可以在浏览器的控制台输入
# document.getElementById('kw') 来先查找一下# 关闭浏览器
browser.quit()
4.2 元素交互操作
import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import Bydef setup():options = Options()options.add_experimental_option('detach',True)browser = webdriver.Chrome(service=Service('chromedriver.exe'),options=options)return browserbrowser = setup()# 获取指定的网址
browser.get('https://www.baidu.com')
input = browser.find_element(By.ID,'kw')
# 元素输入
input.send_keys('fasgfagasgasg')
time.sleep(3)
# 元素清空
input.clear()
time.sleep(2)
# 元素再次输入
input.send_keys('古诗文')
time.sleep(2)
# 获取搜索按钮
button = browser.find_element(By.ID,'su')
# 调用按钮的点击方法
button.click()
time.sleep(2)
# 关闭浏览器
browser.quit()
4.3 元素八种定位方式
4.3.1 元素定位-ID
通过id定位元素结果基本上就是我们想要的元素,准确性比较高。
input = browser.find_element(By.ID, 'kw')
4.3.2 元素定位-NAME
通过name属性来获取元素,也是比较精准的。
input = browser.find_element(By.ID, 'kw')
4.3.3 元素定位-CLASS_NAME
使用class属性来查找元素,容易出现多个元素,因而往往需要用切片处理方式
注意:如果class属性值中包含空格是无法正常获取的
element = browser.find_element(By.CLASS_NAME, 'bg s_btn')
4.3.4 元素定位-TAG_NAME
通过tag标签来查找元素,缺点是获取的元素比较多,需要切片找到需要的元素
element = browser.find_element(By.TAG_NAME, 'input')
4.3.5 元素定位-LINK_TEXT
只标识a标签中的链接文字,根据链接文字查找元素
element = browser.find_element(By.LINK_TEXT, '新闻')
4.3.6 元素定位-PARTIAL_LINK_TEXT
与LINK_TEXT区别是,虽然都是通过链接文本获取元素,但是PARTIAL_LINK_TEXT是在LINK_TEXT的基础上增加了模糊匹配
element = browser.find_element(By.PARTIAL_LINK_TEXT, '地')
4.3.7 元素定位-CSS_SELECTOR
# 通过id等位
element = browser.find_element(By.CSS_SELECTOR, '#kw')
# 通过class定位
element = browser.find_element(By.CSS_SELECTOR, '.s_ipt')
# 不加修饰符(输入标签名)
element = browser.find_element(By.CSS_SELECTOR, 'input')
# 通过任意类型定位
# 精确匹配
element = browser.find_element(By.CSS_SELECTOR, '[value="百度一下"]')
# 模糊匹配
element = browser.find_element(By.CSS_SELECTOR, '[value*="百度"]')
# 匹配开头
element = browser.find_element(By.CSS_SELECTOR, '[value^="百"]')
# 匹配结尾
element = browser.find_element(By.CSS_SELECTOR, '[value$="一下"]')
以上都属于理论定位法,可以直接通过谷歌浏览器复制唯一的selector来确定元素
element = browser.find_element(By.CSS_SELECTOR, '#su')
4.3.8 元素定位-XPATH
打开谷歌浏览器,直接复制该元素的XPATH即可,与上述操作基本一致
当一个无法获取到指定元素的时候,采用第二个完整xpath
写法
# Xpath
element = browser.find_element(By.XPATH, '//*[@id="su"]')
# 完成Xpath
element = browser.find_element(By.XPATH, '/html/body/div[1]/div[1]/div[5]/div/div/form/span[2]/input')
4.4 元素定位的隐式等待
隐式等待的作用是为了防止,当我们进入到一个页面时,该元素未第一时间加载出来,到底找不到元素而引发的报错。
import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import Bydef setup():options = Options()options.add_experimental_option("detach", True)browser = webdriver.Chrome(service=Service('chromedriver.exe'),options=options)# 设置性代码,只要获取元素都会先等待10s 10s之后才会出现异常# 并且只需要设置一次即可browser.implicitly_wait(10)return browserbrowser = setup()browser.get(r'本地文件的绝对路径')
# time.sleep(4)
div = browser.find_element(By.CSS_SELECTOR,'#delayed-element')
print(div)
对应的html文件
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>隐式等待测试页面</title>
</head>
<body><h1>隐式等待测试</h1><div id="immediate-element">这个元素是立即存在的</div><script>// 5秒后动态添加一个元素setTimeout(function() {let newElement = document.createElement("div");newElement.id = "delayed-element";newElement.textContent = "这个元素是5秒后出现的";document.body.appendChild(newElement);}, 3000);</script>
</body>
</html>
案例一: 获取表单元素并修改
import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import Bydef setup():options = Options()options.add_experimental_option("detach", True)browser = webdriver.Chrome(service=Service('chromedriver.exe'), options=options)# 设置性代码,只要获取元素都会先等待10s 10s之后才会出现异常# 并且只需要设置一次即可browser.implicitly_wait(10)return browserbrowser = setup()browser.get(r'HTML文件绝对路径')# 单选
browser.find_element(By.XPATH, '/html/body/form/div[1]/label[2]').click()# 多选
browser.find_element(By.XPATH, '/html/body/form/div[2]/label[1]').click()
browser.find_element(By.XPATH, '/html/body/form/div[2]/label[2]').click()
browser.find_element(By.XPATH, '/html/body/form/div[2]/label[3]').click()# 下拉
browser.find_element(By.XPATH, '/html/body/form/div[3]/select/option[2]').click()# 日期框
browser.find_element(By.XPATH, '/html/body/form/div[4]/div/input').send_keys('20210912')# 上传文件
browser.find_element(By.XPATH, '/html/body/form/div[5]/input').send_keys(r'D:\Python-learning\pythonProject\02-homework\12-test\baidu.png')# 提交
browser.find_element(By.XPATH, '/html/body/form/button').click()
对应的HTML文件
test.html
<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>表单示例</title><style>body {font-family: Arial, sans-serif;max-width: 600px;margin: 0 auto;padding: 20px;}.form-group {margin-bottom: 20px;padding: 15px;border: 1px solid #ddd;border-radius: 5px;}.form-group h3 {margin-top: 0;margin-bottom: 15px;}.rating {display: flex;flex-direction: column;gap: 10px;}.rating-item {display: flex;align-items: center;}.rating-label {width: 100px;}.date-input {display: flex;align-items: center;}.date-input input {width: 120px;margin-right: 10px;}.date-format {color: #666;}</style>
</head>
<body><form action="ok.html" method="post"><!-- 单选框 --><div class="form-group"><h3>单选框</h3><label><input type="radio" name="language" value="Python" checked> Python</label><br><label><input type="radio" name="language" value="Java"> Java</label><br><label><input type="radio" name="language" value="C++"> C++</label></div><!-- 多选框 --><div class="form-group"><h3>多选框</h3><label><input type="checkbox" name="device" value="手机"> 手机</label><br><label><input type="checkbox" name="device" value="电脑"> 电脑</label><br><label><input type="checkbox" name="device" value="网页"> 网页</label></div><!-- 下拉菜单 --><div class="form-group"><h3>下拉</h3><select name="city"><option value="北京" selected>北京</option><option value="上海">上海</option><option value="广州">广州</option></select></div><!-- 日期选择 --><div class="form-group"><h3>日期</h3><div class="date-input"><input type="text" id="dateInput" placeholder="输入年月日如20240521" maxlength="8"><span id="dateDisplay" class="date-format">年 / 月 / 日</span></div><input type="hidden" id="formattedDate" name="date"></div><!-- 附件上传 --><div class="form-group"><h3>附件</h3><input type="file" name="attachment"></div><!-- 提交按钮 --><button type="submit">提交</button></form><script>document.getElementById('dateInput').addEventListener('input', function(e) {let value = e.target.value.replace(/\D/g, ''); // 移除非数字字符if (value.length > 8) {value = value.substring(0, 8); // 限制最大长度为8}e.target.value = value; // 更新输入框值if (value.length === 8) {// 格式化为YYYY/MM/DDconst year = value.substring(0, 4);const month = value.substring(4, 6);const day = value.substring(6, 8);// 验证月份和日期是否有效const validMonth = parseInt(month) >= 1 && parseInt(month) <= 12;const validDay = parseInt(day) >= 1 && parseInt(day) <= 31;if (validMonth && validDay) {const formattedDate = `${year}/年${month}/月${day}日`;document.getElementById('dateDisplay').textContent = formattedDate;document.getElementById('formattedDate').value = formattedDate;} else {document.getElementById('dateDisplay').textContent = '日期无效';document.getElementById('formattedDate').value = '';}} else {document.getElementById('dateDisplay').textContent = '年 / 月 / 日';document.getElementById('formattedDate').value = '';}});</script>
</body>
</html>
ok.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h1>提交成功!!!</h1>
<a href="./test.html" target="_blank">跳转到填写页面</a>
</body>
</html>
案例二:重复填写表单
提示:需要使用到句柄
import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import Bydef setup():options = Options()options.add_experimental_option("detach", True)browser = webdriver.Chrome(service=Service('chromedriver.exe'), options=options)# 设置性代码,只要获取元素都会先等待10s 10s之后才会出现异常# 并且只需要设置一次即可browser.implicitly_wait(10)return browserbrowser = setup()browser.get(r'HTML文件绝对路径')# 循环重复
for x in range(2):time.sleep(2)# 单选browser.find_element(By.XPATH, '/html/body/form/div[1]/label[2]').click()# 多选browser.find_element(By.XPATH, '/html/body/form/div[2]/label[1]').click()browser.find_element(By.XPATH, '/html/body/form/div[2]/label[2]').click()browser.find_element(By.XPATH, '/html/body/form/div[2]/label[3]').click()# 下拉browser.find_element(By.XPATH, '/html/body/form/div[3]/select/option[2]').click()# 日期框browser.find_element(By.XPATH, '/html/body/form/div[4]/div/input').send_keys('20210912')# 上传文件browser.find_element(By.XPATH, '/html/body/form/div[5]/input').send_keys(r'上传文件绝对路径')time.sleep(2)# 提交browser.find_element(By.XPATH, '/html/body/form/button').click()# 点击返回browser.find_element(By.XPATH, '/html/body/a').click()# 打开了新页面之后,我们要获取到全部的句柄(也就是所有的标签页)handles = browser.window_handles# print(handles)# 关闭之前的标签页browser.close()# 通过句柄切换到新的标签页browser.switch_to.window(handles[1])# 获取当前页句柄# print(browser.current_window_handle)
五、三种浏览器获取框(警告框、确认框、提示框)
➡➡➡测试网址
5.1 警告框
示例代码:
def setup():options = Options()options.add_experimental_option("detach", True)browser = webdriver.Chrome(service=Service('chromedriver.exe'), options=options)# 设置性代码,只要获取元素都会先等待10s 10s之后才会出现异常# 并且只需要设置一次即可browser.implicitly_wait(10)return browserbrowser = setup()browser.get('https://sahitest.com/demo/alertTest.htm')# 清空输入框的默认值
browser.find_element(By.XPATH,"/html/body/form/input[1]").clear()
time.sleep(2)# 修改输入框的值
browser.find_element(By.XPATH,"/html/body/form/input[1]").send_keys('大家一起学Python')# 点击按钮
browser.find_element(By.XPATH,"/html/body/form/input[2]").click()# 获取弹窗的内容
print(browser.switch_to.alert.text)time.sleep(2)
# 点击确认按钮
browser.switch_to.alert.accept()
5.2 确认框
➡➡➡测试网址
5.3 提示框
示例代码
def setup():options = Options()options.add_experimental_option("detach", True)browser = webdriver.Chrome(service=Service('chromedriver.exe'), options=options)# 设置性代码,只要获取元素都会先等待10s 10s之后才会出现异常# 并且只需要设置一次即可browser.implicitly_wait(10)return browserbrowser = setup()browser.get('https://sahitest.com/demo/confirmTest.htm')# 点击按钮browser.find_element(By.XPATH,'/html/body/form/input[1]').click()time.sleep(2)
# 点击确认按钮
# browser.switch_to.alert.accept()# 点击取消按钮
browser.switch_to.alert.dismiss()
➡➡➡测试网址
示例代码:
def setup():options = Options()options.add_experimental_option("detach", True)browser = webdriver.Chrome(service=Service('chromedriver.exe'), options=options)# 设置性代码,只要获取元素都会先等待10s 10s之后才会出现异常# 并且只需要设置一次即可browser.implicitly_wait(10)return browserbrowser = setup()browser.get('https://sahitest.com/demo/promptTest.htm')# 点击按钮
browser.find_element(By.XPATH,'/html/body/form/input[1]').click()time.sleep(2)# 输入内容
browser.switch_to.alert.send_keys("123456")
time.sleep(2)# 点击确认按钮
browser.switch_to.alert.accept()
六、 iframe嵌套网页内部元素获取
➡➡➡测试网址
示例代码:
def setup():options = Options()options.add_experimental_option("detach", True)browser = webdriver.Chrome(service=Service('chromedriver.exe'), options=options)# 设置性代码,只要获取元素都会先等待10s 10s之后才会出现异常# 并且只需要设置一次即可browser.implicitly_wait(10)return browserbrowser = setup()browser.get('https://sahitest.com/demo/iframesTest.htm')# iframe嵌套网页 里面的元素 不能够直接获取 因为不在同一个框架里面# 1. 获取iframe元素
iframe = browser.find_element(By.XPATH, '/html/body/iframe')# 2. 进入到iframe里面
browser.switch_to.frame(iframe)# 获取元素并点击
browser.find_element(By.XPATH, '/html/body/table/tbody/tr/td[1]/a[1]').click()
time.sleep(2)
# 此时如果想要获取原页面中的元素就必须退出iframe
browser.switch_to.default_content()time.sleep(2)
# 获取原页面元素
browser.find_element(By.XPATH, '/html/body/input[2]').click()
七、获取元素以及判断可见性
selenium提供了一些基础的爬虫方式。
示例代码:
def setup():options = Options()options.add_experimental_option("detach", True)browser = webdriver.Chrome(service=Service('chromedriver.exe'), options=options)# 设置性代码,只要获取元素都会先等待10s 10s之后才会出现异常# 并且只需要设置一次即可browser.implicitly_wait(10)return browserbrowser = setup()browser.get('https://content-static.cctvnews.cctv.com/snow-book/video.html?item_id=932400080038356852')# 获取元素内容 text
content = browser.find_element(By.XPATH,"/html/body/div/div/div/div[2]/div[1]/div[1]/div/div[5]/div/article/p[1]").text
print(content)# 获取元素可见性
# 简单来说 就是判断这个元素我们能否在页面上看见
flag = browser.find_element(By.XPATH,"/html/head/meta[2]").is_displayed()
print(flag)
八、 网页前进、后退
示例代码:
def setup():options = Options()options.add_experimental_option("detach", True)browser = webdriver.Chrome(service=Service('chromedriver.exe'), options=options)# 设置性代码,只要获取元素都会先等待10s 10s之后才会出现异常# 并且只需要设置一次即可browser.implicitly_wait(10)return browserbrowser = setup()browser.get('https://www.baidu.com')input = browser.find_element(By.ID, 'kw')
input.send_keys('selenium')button = browser.find_element(By.ID, 'su')
button.click()time.sleep(3)
# 网页后退
browser.back()
time.sleep(2)
# 网页前进
browser.forward()
time.sleep(2)
# 关闭
browser.quit()
总结
通过本文的学习,我们系统地了解了 Python 与 Selenium 的结合使用,涵盖了从基础配置到实际应用的多个方面。Selenium 不仅简化了 Web 自动化测试的流程,还为数据采集和动态网页交互提供了强大的支持。借助 Python 的灵活性和 Selenium 的丰富功能,开发者能够高效地完成复杂的任务,无论是自动化测试、爬虫开发,还是网页监控。
当然,Selenium 的强大功能也伴随着一定的学习曲线,尤其是在处理动态内容、反爬机制或复杂的页面结构时,可能需要更多的技巧和经验积累。但只要你掌握了核心的定位与交互方法,并学会利用等待机制、多窗口切换等高级功能,就能应对绝大多数场景的需求。
希望本文能为你打开 Selenium 世界的大门,让你在自动化测试或数据抓取的道路上更加得心应手。技术的进步永无止境,不断实践和探索,你将发现更多 Selenium 与 Python 结合的奇妙用法。继续加油,愿你在自动化的世界中创造更多可能!
相关文章:

(6)python爬虫--selenium
文章目录 前言一、初识selenium二、安装selenium2.1 查看chrome版本并禁止chrome自动更新2.1.1 查看chrome版本2.1.2 禁止chrome更新自动更新 2.2 安装对应版本的驱动程序2.3安装selenium包 三、selenium关于浏览器的使用3.1 创建浏览器、设置、打开3.2 打开/关闭网页及浏览器3…...

Python之两个爬虫案例实战(澎湃新闻+网易每日简报):附源码+解释
目录 一、案例一:澎湃新闻时政爬取 (1)数据采集网站 (2)数据介绍 (3)数据采集方法 (4)数据采集过程 二、案例二:网易每日新闻简报爬取 (1&#x…...
HarmonyOS NEXT~鸿蒙系统与mPaaS三方框架集成指南
HarmonyOS NEXT~鸿蒙系统与mPaaS三方框架集成指南 1. 概述 1.1 鸿蒙系统简介 鸿蒙系统(HarmonyOS)是华为开发的分布式操作系统,具备以下核心特性: 分布式架构:支持跨设备无缝协同微内核设计:提高安全性和性能一次开…...
系统安全及应用学习笔记
系统安全及应用学习笔记 一、账号安全控制 (一)账户管理策略 冗余账户处理 非登录账户:Linux 系统中默认存在如 bin、daemon 等非登录账户,其登录 Shell 应为 /sbin/nologin,需定期检查确保未被篡改。冗余账户清理&…...
STC89C52RC/LE52RC
STC89C52RC 芯片手册原理图扩展版原理图 功能示例LED灯LED灯的常亮效果LED灯的闪烁LED灯的跑马灯效果:从左到右,从右到左 数码管静态数码管数码管计数App.cApp.hCom.cCom.hDir.cDir.hInt.cInt.hMid.cMid.h 模板mian.cApp.cApp.hCom.cCom.hDir.cDir.hInt.…...

✨ PLSQL卡顿优化
✨ PLSQL卡顿优化 1.📂 打开首选项2.🔧 Oracle连接配置3.⛔ 关闭更新和新闻 1.📂 打开首选项 2.🔧 Oracle连接配置 3.⛔ 关闭更新和新闻...
yum命令常用选项
刷新仓库列表 sudo yum repolist清理 Yum 缓存并生成新的缓存 sudo yum clean all sudo yum makecache验证 EPEL 源是否已正确启用 sudo yum repolist enabled安装软件包 sudo yum install <package-name> -y更新软件包 sudo yum update -y仅更新指定的软件包。 su…...

python+vlisp实现对多段线范围内土方体积的计算
#在工程中,经常用到计算土方回填、土方开挖的体积。就是在一个范围内,计算土被挖走,或者填多少,这个需要测量挖填前后这个范围内的高程点。为此,我开发一个app,可以直接在autocad上提取高程点,然…...
鸿蒙Flutter实战:25-混合开发详解-5-跳转Flutter页面
概述 在上一章中,我们介绍了如何初始化 Flutter 引擎,本文重点介绍如何添加并跳转至 Flutter 页面。 跳转原理 跳转原理如下: 本质上是从一个原生页面A 跳转至另一个原生页面 B,不过区别在于,页面 B是一个页面容器…...

APM32小系统键盘PCB原理图设计详解
APM32小系统键盘PCB原理图设计详解 一、APM32小系统简介 APM32微控制器是国内半导体厂商推出的一款高性能ARM Cortex-M3内核微控制器,与STM32高度兼容,非常适合DIY爱好者用于自制键盘、开发板等电子项目。本文将详细讲解如何基于APM32 CBT6芯片设计一款…...
【C/C++】多线程开发:wait、sleep、yield全解析
文章目录 多线程开发:wait、sleep、yield全解析1 What简要介绍详细介绍wait() — 条件等待(用于线程同步)sleep() — 睡觉,定时挂起yield() — 自愿让出 CPU 2 区别以及建议区别应用场景建议 3 三者协作使用示例 多线程开发&#…...
uint8_t是什么数据类型?
一、引言 在C语言编程中,整数类型是最基本的数据类型之一。然而,你是否真正了解这些看似简单的数据类型?本文将深入探索C语言中的整数类型,在编程中更加得心应手。 二、C语言整数类型的基础 2.1 标准整数类型 C语言提供了多种…...
SystemUtils:你的Java系统“探照灯“——让环境探测不再盲人摸象
各位Java系统侦探们好!今天要介绍的是Apache Commons Lang3中的SystemUtils工具类。这个工具就像编程界的"雷达系统",能帮你一键获取所有系统关键信息,再也不用满世界找System.getProperty()了! 一、为什么需要SystemU…...

对象存储(Minio)使用
目录 1.安装 MinIO(Windows) 2.启动minio服务: 3.界面访问 4.进入界面 5.前后端代码配置 1)minio前端配置 2)minio后端配置 1.安装 MinIO(Windows) 官方下载地址:[Download High-Perform…...

yolov11使用记录(训练自己的数据集)
官方:Ultralytics YOLO11 -Ultralytics YOLO 文档 1、安装 Anaconda Anaconda安装与使用_anaconda安装好了怎么用python-CSDN博客 2、 创建虚拟环境 安装好 Anaconda 后,打开 Anaconda 控制台 创建环境 conda create -n yolov11 python3.10 创建完后&…...
历史数据分析——宁波港
个股走势 公司简介: 货物吞吐量和集装箱吞吐量持续保持全球港口前列。 经营分析: 码头开发经营、管理;港口货物的装卸、堆存、仓储、包装、灌装;集装箱拆拼箱、清洗、修理、制造、租赁;在港区内从事货物驳运,国际货运代理;铁路货物运输代理,铁路工程承建,铁路设备…...

知识宇宙:技术文档该如何写?
名人说:博观而约取,厚积而薄发。——苏轼《稼说送张琥》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、技术文档的价值与挑战1. 为什么技术文档如此重要2. 技术文档面临的挑战 二、撰…...
DeepSeek 赋能数字农业:从智慧种植到产业升级的全链条革新
目录 一、数字农业的现状与挑战二、DeepSeek 技术解析2.1 DeepSeek 的技术原理与优势2.2 DeepSeek 在人工智能领域的地位与影响力 三、DeepSeek 在数字农业中的应用场景3.1 精准种植决策3.2 病虫害监测与防治3.3 智能灌溉与施肥管理3.4 农产品质量追溯与品牌建设 四、DeepSeek …...

技嘉主板怎么开启vt虚拟化功能_技嘉主板开启vt虚拟化教程(附intel和amd开启方法)
最近使用技嘉主板的小伙伴们问我,技嘉主板怎么开启vt虚拟。大多数可以在Bios中开启vt虚拟化技术,当CPU支持VT-x虚拟化技术,有些电脑会自动开启VT-x虚拟化技术功能。而大部分的电脑则需要在Bios Setup界面中,手动进行设置ÿ…...

Java 并发编程高级技巧:CyclicBarrier、CountDownLatch 和 Semaphore 的高级应用
Java 并发编程高级技巧:CyclicBarrier、CountDownLatch 和 Semaphore 的高级应用 一、引言 在 Java 并发编程中,CyclicBarrier、CountDownLatch 和 Semaphore 是三个常用且强大的并发工具类。它们在多线程场景下能够帮助我们实现复杂的线程协调与资源控…...

PT5F2307触摸A/D型8-Bit MCU
1. 产品概述 ● PT5F2307是一款51内核的触控A/D型8位MCU,内置16K*8bit FLASH、内部256*8bit SRAM、外部512*8bit SRAM、触控检测、12位高精度ADC、RTC、PWM等功能,抗干扰能力强,适用于滑条遥控器、智能门锁、消费类电子产品等电子应用领域。 …...
矩阵方程$Ax=b$的初步理解.
对于矩阵方程 A x b A\textbf{\textit{x}}\textbf{\textit{b}} Axb,可能就是一学而过,也可能也就会做做题,但是从如何直观地理解它呢? 这个等式可以用多种理解方式,这里就从向量变换角度浅谈一下。其中的 A A A是矩阵&#…...

线性代数中的向量与矩阵:AI大模型的数学基石
🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C、C#等开发语言,熟悉Java常用开…...
[特殊字符] 使用增量同步+MQ机制将用户数据同步到Elasticsearch
在开发用户搜索功能时,我们通常会将用户信息存储到 Elasticsearch(简称 ES) 中,以提高搜索效率。本篇文章将详细介绍我们是如何实现 MySQL 到 Elasticsearch 的增量同步,以及如何通过 MQ 消息队列实现用户信息实时更新…...
LeetCode 2942.查找包含给定字符的单词:使用库函数完成
【LetMeFly】2942.查找包含给定字符的单词:使用库函数完成 力扣题目链接:https://leetcode.cn/problems/find-words-containing-character/ 给你一个下标从 0 开始的字符串数组 words 和一个字符 x 。 请你返回一个 下标数组 ,表示下标在数…...
【mediasoup】MS_DEBUG_DEV 等日志形式转PLOG输出
输出有问题 MS_DEBUG_DEV("[pacer_updated pacing_kbps:%" PRIu32 ",padding_budget_kbps:%" PRIu32 "]",pacing_bitrate_kbps_,/*cc给出的目标码率 * 系数*/padding_rate_bps / 1000 /*设置值*/);...

打卡第27天:函数的定义与参数
知识点回顾: 1.函数的定义 2.变量作用域:局部变量和全局变量 3.函数的参数类型:位置参数、默认参数、不定参数 4.传递参数的手段:关键词参数 5.传递参数的顺序:同时出现三种参数类型时 作业: 题目1&a…...

python训练营day34
知识点回归: CPU性能的查看:看架构代际、核心数、线程数GPU性能的查看:看显存、看级别、看架构代际GPU训练的方法:数据和模型移动到GPU device上类的call方法:为什么定义前向传播时可以直接写作self.fc1(x) 作业 复习今…...

人工智能在医疗影像诊断上的最新成果:更精准地识别疾病
摘要:本论文深入探讨人工智能在医疗影像诊断领域的最新突破,聚焦于其在精准识别疾病方面的显著成果。通过分析深度学习、多模态影像融合、三维重建与可视化以及智能辅助诊断系统等关键技术的应用,阐述人工智能如何提高医疗影像诊断的准确性和…...

塔能节能平板灯:点亮苏州某零售工厂节能之路
在苏州某零售工厂的运营成本中,照明能耗占据着一定比例。为降低成本、提升能源利用效率,该工厂与塔能科技携手,引入塔能节能平板灯,开启了精准节能之旅,并取得了令人瞩目的成效。 一、工厂照明能耗困境 苏州该零售工厂…...