当前位置: 首页 > news >正文

【Python从入门到进阶】39、使用Selenium自动验证滑块登录

接上篇《38、selenium关于Chrome handless的基本使用》
上一篇我们介绍了selenium中有关Chrome的无头版浏览器Chrome Handless的使用。本篇我们使用selenium做一些常见的复杂验证功能,首先我们来讲解如何进行滑块自动验证的操作。

一、测试用例介绍

我们要通过selenium来实现目前常见的滑块验证码的验证,以豆瓣的登录页面为例:

其操作步骤就是:
(1)打开登录页面https://accounts.douban.com/passport/login:

(2)点击页面上的“密码登录”:

(3)输入账号密码之后,点击“登录豆瓣”按钮:

(4)拼接好弹出的滑块进行登录验证:

二、需要用到的技术

1、python语言

这里不再赘述,本篇主要还是使用python技术来实现。

2、selenium库

selenium是一个用于测试Web应用程序的Python库。它可以模拟用户在浏览器中的操作,例如点击、填写表单等。Selenium可以与各种浏览器交互,并提供了丰富的API来控制浏览器行为和获取网页内容。

3、urllib库

urllib是Python标准库之一,用于处理URL相关的操作。它包含多个子模块,例如urllib.request用于发送HTTP请求并获取响应,urllib.parse用于解析和构建URL,urllib.error用于处理URL相关的错误等。urllib常用于网络数据抓取、访问API等任务。

4、cv2库

cv2是OpenCV(Open Source Computer Vision)库的Python绑定。OpenCV是一个广泛使用的计算机视觉库,提供了丰富的图像处理和计算机视觉算法。cv2库为Python开发者提供了对OpenCV功能的访问,可以进行图像加载、处理、分析以及计算机视觉任务,如人脸识别、目标检测等。
安装注意事项:
如果直接通过pip install cv2安装报错的话,请使用下面的语句安装:
pip install opencv-python

5、random库

random是Python的随机数生成库。它提供了多种随机数生成函数,包括生成伪随机数的函数和从序列中随机选择元素的函数。random库可用于模拟、游戏开发、密码学等领域,以及各种需要随机性的应用程序。

6、re库

re是Python的正则表达式模块,用于对字符串进行模式匹配和处理。正则表达式是一种强大的文本匹配工具,可以用来搜索、替换、提取特定模式的字符串。re库提供了函数和方法来编译正则表达式、执行匹配操作,并返回匹配结果,使得处理文本数据更加灵活和高效。


三、实现步骤

下面我们使用代码来实现滑块的验证。

1、打开登录页切换密码登录

第一步,打开登录页面,并点击页面上的“密码登录”:
代码:

import time  # 事件库,用于硬性等待from selenium import webdriver  # 导入selenium的webdriver模块
from selenium.webdriver.common.by import By  # 引入By类选择器# 创建Chrome WebDriver对象
driver = webdriver.Chrome()try:# 打开豆瓣登录页driver.get("https://accounts.douban.com/passport/login")print(driver.title)  # 打印页面的标题# (1)获取“密码登录”选项元素,并点击它# 使用浏览器的F12开发者工具,使用copy xpath获取该元素的XPATH路径passClick = driver.find_element(By.XPATH, '//*[@id="account"]/div[2]/div[2]/div/div[1]/ul[1]/li[2]')passClick.click()# 整体等待5秒看结果time.sleep(5)finally:# 关闭浏览器driver.quit()

效果:
值得注意的是,这里的“密码登录”的CSS选择器路径,是通过浏览器F12打开开发者选项,使用“copy xpath”功能复制的。
效果:

2、输账密点击登录

第二步,输入账号密码,并点击“登录豆瓣”按钮:

# 使用浏览器隐式等待3秒
driver.implicitly_wait(3)
# 获取账号密码组件并赋值
userInput = driver.find_element(By.ID, "username")
userInput.send_keys("jackzhucoder@126.com")
passInput = driver.find_element(By.ID, "password")
passInput.send_keys("123456")
# 获取登录按钮并点击登录
loginButton = driver.find_element(By.XPATH, '//*[@id="account"]/div[2]/div[2]/div/div[2]/div[1]/div[4]/a')
loginButton.click()

这里的登录按钮的xpath路径,也是使用开发者选项的“copy xpath”功能复制。
效果:

3、切换焦点并下载验证图片

将焦点切换至滑块验证区域,并下载加载好的滑块验证背景图片。
点击登录按钮后,就会出现滑块验证区域,这是一个新增的frame区域,此时我们需要将切换的焦点从主页面转换到这个frame区域上:

代码上我们使用WebDriver的switch_to.frame方法即可,参数就是frame区域的id名“tcaptcha_iframe_dy”。
然后我们需要获取整个需要对其的大图片,获取其路径并下载到本地,准备进行读取验证:

这里图片元素获取比较简单,通过ID名“slideBg”获取即可,但是图片路径需要分析其style属性中的css参数,通过正则表达式将图片src地址解析出来,然后通过urllib访问这个路径将图片下载下来。
解析图片前,一定一定要等待图片元素加载完成之后再获取,否则会什么也解析不到。
代码:

driver.implicitly_wait(5)  # 使用浏览器隐式等待5秒
# 此时需要切换到弹出的滑块区域,需要切换frame窗口
driver.switch_to.frame("tcaptcha_iframe_dy")
# 等待滑块验证图片加载后,再做后面的操作
WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.ID, 'slideBg')))
# 获取滑块验证图片下载路径,并下载到本地
bigImage = driver.find_element(By.ID, "slideBg")
s = bigImage.get_attribute("style")  # 获取图片的style属性
# 设置能匹配出图片路径的正则表达式
p = 'background-image: url\(\"(.*?)\"\);'
# 进行正则表达式匹配,找出匹配的字符串并截取出来
bigImageSrc = re.findall(p, s, re.S)[0]  # re.S表示点号匹配任意字符,包括换行符
print("滑块验证图片下载路径:", bigImageSrc)
# 下载图片至本地
urllib.request.urlretrieve(bigImageSrc, 'bigImage.png')

下载图片的效果:

4、拖动滑块至缺口处
我们接下来要做的,是将小拼图图片,移动到缺口处:

我们需要获取小图片到缺口处的实际距离,一般用到两种方法。
第一种方法是模板匹配,通过openCV分析两个图片的相似度,获取两个相似度很高图片的坐标,从而计算两个图片的距离。
第二种方法是轮廓检测,通过openCV进行轮廓检测,即在大图片中找到缺口位置的坐标,然后计算小图片到缺口位置的距离。
这里因为我们无法单独获取小拼图的单独图片,所以不好使用模板匹配的方法,所以我们选择使用第二种轮廓检测的方法。

(1)得到缺口轮廓位置信息

首先我们计算一下缺口的坐标及面积大概有多大,使用PhotoShop打开下载的图片,单独将缺口按照正方形的尺寸抠出来,发现其长宽各是80像素:

所以这个封闭矩形的面积范围大概是在80*80=6400像素左右。周长是80*4=320像素。但是现实中这里是有缺口的,不是一个完整的图片,所以我们需要给它一定的误差范围,这里我们暂定目标区域面积为5025-7225,周长为300-380。

然后我们将计算距离的逻辑封装为一个方法:

# 封装的计算图片距离的算法
def get_pos(imageSrc):# 读取图像文件并返回一个image数组表示的图像对象image = cv2.imread(imageSrc)# GaussianBlur方法进行图像模糊化/降噪操作。# 它基于高斯函数(也称为正态分布)创建一个卷积核(或称为滤波器),该卷积核应用于图像上的每个像素点。blurred = cv2.GaussianBlur(image, (5, 5), 0, 0)# Canny方法进行图像边缘检测# image: 输入的单通道灰度图像。# threshold1: 第一个阈值,用于边缘链接。一般设置为较小的值。# threshold2: 第二个阈值,用于边缘链接和强边缘的筛选。一般设置为较大的值canny = cv2.Canny(blurred, 0, 100)  # 轮廓# findContours方法用于检测图像中的轮廓,并返回一个包含所有检测到轮廓的列表。# contours(可选): 输出的轮廓列表。每个轮廓都表示为一个点集。# hierarchy(可选): 输出的轮廓层次结构信息。它描述了轮廓之间的关系,例如父子关系等。contours, hierarchy = cv2.findContours(canny, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)# 遍历检测到的所有轮廓的列表for contour in contours:# contourArea方法用于计算轮廓的面积area = cv2.contourArea(contour)# arcLength方法用于计算轮廓的周长或弧长length = cv2.arcLength(contour, True)# 如果检测区域面积在5025-7225之间,周长在300-380之间,则是目标区域if 5025 < area < 7225 and 300 < length < 380:# 计算轮廓的边界矩形,得到坐标和宽高# x, y: 边界矩形左上角点的坐标。# w, h: 边界矩形的宽度和高度。x, y, w, h = cv2.boundingRect(contour)print("计算出目标区域的坐标及宽高:", x, y, w, h)# 在目标区域上画一个红框看看效果cv2.rectangle(image, (x, y), (x+w, y+h), (0, 0, 255), 2)cv2.imwrite("111.jpg", image)return xreturn 0

然后在下载图片后调用该方法:

# 下载图片至本地
urllib.request.urlretrieve(bigImageSrc, 'bigImage.png')
# 计算缺口图像的x轴位置
dis = get_pos('bigImage.png')
# 整体等待5秒看结果
time.sleep(5)

效果:

生成的目标区域画红框的计算图片:

好了,到此为止我们获取到了一个重要的数据,就是缺口的位置信息。

(2)匹配小滑块元素

得到小滑块元素,让其移动位置到上面计算的距离。
这里我们移动的位置,并不是直接拿刚刚我们得到的图片上的x1减去小滑块的x2坐标,因为我们打开F12开发者界面,可以看到整体图片的宽度是小于原来下载下来的图片的(网页开发者为其固定了长宽),所以我们要重新计算一下缺口的x1位置相对于更小的这块图片的位置:

计算的方法就是拿原来的坐标乘以新画布的宽度,再除以原画布的宽度:
新缺口坐标=原缺口坐标*新画布宽度/原画布宽度
原理就是小学数字(见图):

下面开始写代码。
首先获取小滑块的xpath地址,用于获取该元素:

代码:

# 计算缺口图像的x轴位置
dis = get_pos('bigImage.png')
# 获取小滑块元素,并移动它到上面的位置
smallImage = driver.find_element(By.XPATH, '//*[@id="tcOperation"]/div[6]')
# 小滑块到目标区域的移动距离(缺口坐标的水平位置距离小滑块的水平坐标相减的差)
# 新缺口坐标=原缺口坐标*新画布宽度/原画布宽度
newDis = int(dis*340/672-smallImage.location['x'])
driver.implicitly_wait(5)  # 使用浏览器隐式等待5秒
# 按下小滑块按钮不动
ActionChains(driver).click_and_hold(smallImage).perform()
# 移动小滑块,模拟人的操作,一次次移动一点点
i = 0
moved = 0
while moved < newDis:x = random.randint(3, 10)  # 每次移动3到10像素moved += xActionChains(driver).move_by_offset(xoffset=x, yoffset=0).perform()print("第{}次移动后,位置为{}".format(i, smallImage.location['x']))i += 1
# 移动完之后,松开鼠标
ActionChains(driver).release().perform()
# 整体等待5秒看结果
time.sleep(5)

由于大部分网站有检测真人操作的逻辑,所以我们这里要模拟真人进行移动操作,不能一下移动到目标点,需要一点一点的移动。

效果:

selenium自动验证滑块效果

四、完整代码

以下是上面按照步骤编写完毕的完整代码(截止2023年10月6日),后期网站有更新或者元素布局有所变化,需要各位修改优化。
本代码仅供学习参考,切勿用于其他用途。

# _*_ coding : utf-8 _*_
# @Time : 2023-10-06 9:44
# @Author : 光仔December
# @File : 豆瓣登录自动滑动验证
# @Project : Python基础
import random
import re  # 正则表达式匹配库
import time  # 事件库,用于硬性等待
import urllib  # 网络访问
import cv2  # opencv库from selenium import webdriver  # 导入selenium的webdriver模块
from selenium.webdriver.common.by import By  # 引入By类选择器
from selenium.webdriver.support.wait import WebDriverWait  # 等待类
from selenium.webdriver.support import expected_conditions as EC  # 等待条件类
from selenium.webdriver.common.action_chains import ActionChains  # 动作类# 封装的计算图片距离的算法
def get_pos(imageSrc):# 读取图像文件并返回一个image数组表示的图像对象image = cv2.imread(imageSrc)# GaussianBlur方法进行图像模糊化/降噪操作。# 它基于高斯函数(也称为正态分布)创建一个卷积核(或称为滤波器),该卷积核应用于图像上的每个像素点。blurred = cv2.GaussianBlur(image, (5, 5), 0, 0)# Canny方法进行图像边缘检测# image: 输入的单通道灰度图像。# threshold1: 第一个阈值,用于边缘链接。一般设置为较小的值。# threshold2: 第二个阈值,用于边缘链接和强边缘的筛选。一般设置为较大的值canny = cv2.Canny(blurred, 0, 100)  # 轮廓# findContours方法用于检测图像中的轮廓,并返回一个包含所有检测到轮廓的列表。# contours(可选): 输出的轮廓列表。每个轮廓都表示为一个点集。# hierarchy(可选): 输出的轮廓层次结构信息。它描述了轮廓之间的关系,例如父子关系等。contours, hierarchy = cv2.findContours(canny, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)# 遍历检测到的所有轮廓的列表for contour in contours:# contourArea方法用于计算轮廓的面积area = cv2.contourArea(contour)# arcLength方法用于计算轮廓的周长或弧长length = cv2.arcLength(contour, True)# 如果检测区域面积在5025-7225之间,周长在300-380之间,则是目标区域if 5025 < area < 7225 and 300 < length < 380:# 计算轮廓的边界矩形,得到坐标和宽高# x, y: 边界矩形左上角点的坐标。# w, h: 边界矩形的宽度和高度。x, y, w, h = cv2.boundingRect(contour)print("计算出目标区域的坐标及宽高:", x, y, w, h)# 在目标区域上画一个红框看看效果cv2.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2)cv2.imwrite("111.jpg", image)return xreturn 0# 创建Chrome WebDriver对象
driver = webdriver.Chrome()try:# 打开豆瓣登录页driver.get("https://accounts.douban.com/passport/login")print(driver.title)  # 打印页面的标题# (1)获取“密码登录”选项元素,并点击它# 使用浏览器的F12开发者工具,使用copy xpath获取该元素的XPATH路径passClick = driver.find_element(By.XPATH, '//*[@id="account"]/div[2]/div[2]/div/div[1]/ul[1]/li[2]')passClick.click()driver.implicitly_wait(3)  # 使用浏览器隐式等待3秒# 获取账号密码组件并赋值userInput = driver.find_element(By.ID, "username")userInput.send_keys("jackzhucoder@126.com")passInput = driver.find_element(By.ID, "password")passInput.send_keys("123456")# 获取登录按钮并点击登录loginButton = driver.find_element(By.XPATH, '//*[@id="account"]/div[2]/div[2]/div/div[2]/div[1]/div[4]/a')loginButton.click()driver.implicitly_wait(5)  # 使用浏览器隐式等待5秒# 此时需要切换到弹出的滑块区域,需要切换frame窗口driver.switch_to.frame("tcaptcha_iframe_dy")# 等待滑块验证图片加载后,再做后面的操作WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.ID, 'slideBg')))# 获取滑块验证图片下载路径,并下载到本地bigImage = driver.find_element(By.ID, "slideBg")s = bigImage.get_attribute("style")  # 获取图片的style属性# 设置能匹配出图片路径的正则表达式p = 'background-image: url\(\"(.*?)\"\);'# 进行正则表达式匹配,找出匹配的字符串并截取出来bigImageSrc = re.findall(p, s, re.S)[0]  # re.S表示点号匹配任意字符,包括换行符print("滑块验证图片下载路径:", bigImageSrc)# 下载图片至本地urllib.request.urlretrieve(bigImageSrc, 'bigImage.png')# 计算缺口图像的x轴位置dis = get_pos('bigImage.png')# 获取小滑块元素,并移动它到上面的位置smallImage = driver.find_element(By.XPATH, '//*[@id="tcOperation"]/div[6]')# 小滑块到目标区域的移动距离(缺口坐标的水平坐标距离小滑块的水平坐标相减的差)# 新缺口坐标=原缺口坐标*新画布宽度/原画布宽度newDis = int(dis*340/672-smallImage.location['x'])driver.implicitly_wait(5)  # 使用浏览器隐式等待5秒# 按下小滑块按钮不动ActionChains(driver).click_and_hold(smallImage).perform()# 移动小滑块,模拟人的操作,一次次移动一点点i = 0moved = 0while moved < newDis:x = random.randint(3, 10)  # 每次移动3到10像素moved += xActionChains(driver).move_by_offset(xoffset=x, yoffset=0).perform()print("第{}次移动后,位置为{}".format(i, smallImage.location['x']))i += 1# 移动完之后,松开鼠标ActionChains(driver).release().perform()# 整体等待5秒看结果time.sleep(5)finally:# 关闭浏览器driver.quit()

参考:小飞刀2018《Selenium验证码滑动登录》
转载请注明出处:https://guangzai.blog.csdn.net/article/details/133827764

相关文章:

【Python从入门到进阶】39、使用Selenium自动验证滑块登录

接上篇《38、selenium关于Chrome handless的基本使用》 上一篇我们介绍了selenium中有关Chrome的无头版浏览器Chrome Handless的使用。本篇我们使用selenium做一些常见的复杂验证功能&#xff0c;首先我们来讲解如何进行滑块自动验证的操作。 一、测试用例介绍 我们要通过sel…...

利用FPGA和CPLD数字逻辑实现模数转换器

数字系统的嵌入式工程师熟悉如何通过使用FPGA和CPLD在其印刷电路板上将各种处理器&#xff0c;存储器和标准功能组件粘合在一起来实现其数字设计的“剩余”。除了这些数字功能之外&#xff0c;FPGA和CPLD还可以使用LVDS输入&#xff0c;简单的电阻电容器&#xff08;RC&#xf…...

上海亚商投顾:沪指震荡调整跌 减肥药、华为概念股持续活跃

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪 沪指上个交易日低开后震荡调整&#xff0c;深成指、创业板指盘中跌超1%&#xff0c;宁德时代一度跌超3%&#xff…...

间歇性微服务问题...

在Kubernetes环境中&#xff0c;最近由于特定配置导致Pod调度失败。哪种 Kubernetes 资源类型&#xff08;通常与节点约束相关&#xff09;可能导致此故障&#xff0c;尤其是在未正确定义的情况下&#xff1f; 节点选择器资源配额优先级污点Pod 中断预算 已有 201 人回答了该…...

小程序开发平台源码系统+ 带前后端完整搭建教程

大家好&#xff0c;给大家分享一个小程序开发平台源码系统。这款小程序开发平台中有很多功能&#xff0c;今天主要来给大家介绍一下洗车行业小程序制作的功能。以下是部分核心代码图&#xff1a; 系统特色功能&#xff1a; LBS定位&#xff1a;小程序能够自动显示附近的共享洗…...

外部统一设置了::-webkit-scrollbar { display: none; }如何单独给特定元素开启滚动条设置样式-web页面滚动条样式设置

如果你在外部统一设置了​​::-webkit-scrollbar { display: none; }​​​来隐藏滚动条&#xff0c;但是想要在​​.lever​​元素中单独开启滚动条的样式&#xff0c;你可以使用CSS的级联选择器来覆盖外部样式。 以下是一个示例&#xff0c;展示如何给​​.lever​​单独开启…...

【计算机网络】网络原理

目录 1.网络的发展 2.协议 3.OSI七层网络模型 4.TCP/IP五层网络模型及作用 5.经典面试题 6.封装和分用 发送方(封装) 接收方(分用) 1.网络的发展 路由器&#xff1a;路由指的是最佳路径的选择。一般家用的是5个网口&#xff0c;1个WAN口4个LAN口(口&#xff1a;端口)。可…...

力扣第39题 组合总和 c++ 回溯剪枝题

题目 39. 组合总和 中等 相关标签 数组 回溯 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序 返回这些组合。 cand…...

qt软件正常运行的崩溃了定位行号方法

软件&#xff08;debug版exe或者release版exe&#xff09;在正常运行状态下&#xff08;不是gdb调试运行&#xff09;&#xff0c;如果软件崩掉&#xff0c;那么会直接闪退&#xff0c;软件什么也做不了&#xff0c;此时无法保存软件中的状态信息&#xff0c;此外&#xff0c;也…...

软件工程与计算总结(十五)详细设计中面向对象方法下的信息隐藏

软件工程与计算总结&#xff08;十三&#xff09;详细设计中的模块化与信息隐藏 之前的博客中&#xff0c;模块需要隐藏的决策主要由“职责的实现”and“实现的变更”两类&#xff0c;在面向对象方法中&#xff0c;需要做到的就是&#xff1a; 封装类的职责&#xff0c;隐藏职…...

鸿蒙初体验

下载与安装DevEco Studio 在HarmonyOS应用开发学习之前&#xff0c;需要进行一些准备工作&#xff0c;首先需要完成开发工具DevEco Studio的下载与安装以及环境配置。 进入DevEco Studio下载官网&#xff0c;单击“立即下载”进入下载页面。 DevEco Studio提供了Windows版本和…...

hive复合类型的数据查询

hive数据表创建-CSDN博客 --第一个名字以M开头的 访问数组array 数组&#xff08; array) 引用方式 列名 [ 元素索引 _ 以 0 开始 ] select * from emp where emp_name[0] rlike "^M"; -- 出生日期是在 5 几年 访问 Map map 引用方式 列名 ["Key"] selec…...

Notes/Domino 14 Early Access Drop3发布

大家好&#xff0c;才是真的好。 其实上周&#xff0c;就是国庆假期的时候&#xff0c;HCL Notes/Domino 14 Early Access Drop3&#xff08;以下简称EA3&#xff09;就已经发布&#xff0c;而且和传说中的一样&#xff0c;带来了数项惊人的新特性。 我们先讲讲这一版本新特性…...

前端、后端开发者常用到的免费API整理

以下是我整理的前端、后端工程师在开发中经常使用到的API接口&#xff0c;希望能帮到大家~ 手机号码归属地&#xff1a;可根据手机号码查询其省市区、运营商区号行政区划代码等信息。 上亿条数据囊括最新的170、166、147等号段&#xff0c;更新及时、准确度高。空号检测&#…...

【LeetCode高频SQL50题-基础版】打卡第9天:第46~50题

文章目录 【LeetCode高频SQL50题-基础版】打卡第9天&#xff1a;第46~50题⛅前言患某种疾病的患者&#x1f512;题目&#x1f511;题解 第二高的薪水&#x1f512;题目&#x1f511;题解 按日期分组销售产品&#x1f512;题目&#x1f511;题解 列出指定时间段内所有的下单产品…...

中断机制-通过volatile实现线程中断停止

4.1.4 大厂面试题中断机制考点 如何停止中断运行中的线程&#xff1f; 通过一个volatile变量实现 package com.nanjing.gulimall.zhouyimo.test;import java.util.concurrent.TimeUnit;/*** author zhou* version 1.0* date 2023/10/15 2:34 下午*/ public class InterruptD…...

Elasticsearch 8.11 中的合并更少,摄取更快

作者&#xff1a;ADRIEN GRAND Elasticsearch 8.11 改进了管理索引缓存的方式&#xff0c;从而减少了段合并。 我们对 Elasticsearch 8.11 从索引缓存回收内存的方式进行了重大更改&#xff0c;这有助于减少合并开销&#xff0c;从而加快索引速度。 使用我们的日志跟踪&#x…...

算法村开篇

大家好我是苏麟从今天开始我将带来算法的一些习题和心得体会等等...... 算法村介绍 我们一步步地学习算法本专栏会以闯关的方式来学习算法 循序渐进地系统的学习算法并掌握大部分面试知识 , 期待和大家一起进步 . 索大祝大家学有所成 , 前程似锦....

Leetcode—136.只出现一次的数字【简单】

2023每日刷题&#xff08;二&#xff09; Leetcode—136.只出现一次的数字 位运算法 实现代码 int singleNumber(int* nums, int numsSize){int i 0;int res 0;for(; i < numsSize; i) {res ^ nums[i];}return res; }运行结果 之后我会持续更新&#xff0c;如果喜欢我的…...

关于RNNoise、webrtc_ns、三角带通滤波器、对数能量

语音特征参数MFCC提取过程详解 其中讲解了&#xff1a;三角带通滤波器 、计算每个滤波器组输出的对数能量、对数能量、经离散余弦变换&#xff08;DCT&#xff09;得到MFCC系数 推荐阅读某乎这位大佬的全部文章&#xff1a; 下面是几篇出自这位大佬的很好的文章&#xff1a; …...

c语言练习89:链表的使用

链表的使用 虽然有这么多的链表的结构&#xff0c;但是我们实际中最常⽤还是两种结构&#xff1a; 单链表 和 双向带头循环链表 1. ⽆头单向⾮循环链表&#xff1a;结构简单&#xff0c;⼀般不会单独⽤来存数据。实际中更多是作为其他数据结 构的⼦结构&#xff0c;如哈希桶、…...

ArkTS及openHarmony

补充 padding&#xff1a;内边距&#xff0c;也就是盒子边和盒子内部的距离 margin&#xff1a;外边距&#xff0c;也就是盒子和盒子的距离 openHarmony应用开发及UI界面 常用布局 Row 水平线性布局核心代码 子控件会共享同一行&#xff0c;也就是都在同一行内 Preview C…...

Idea怎么配置Maven才能优先从本地仓库获取依赖

网上的方法 : 在设置中搜索 Runner ,在VM Option中设置参数 -DarchetypeCataloginternal删除 解压后的依赖包中的 _remote.repositories m2e-lastUpdated.properties *.lastUpdated 文件。 上边都没有效果 最终的解决方法&#xff0c;修改maven配置文件settings.xml 主要两个…...

聊聊HttpClient的DnsResolver

序 本文主要研究一下HttpClient的DnsResolver DnsResolver org/apache/http/conn/DnsResolver.java /*** Users may implement this interface to override the normal DNS lookup offered* by the OS.** since 4.2*/ public interface DnsResolver {/*** Returns the IP a…...

剑指智能驾驶,智己LS6胜算几何?

监制 | 何玺 排版 | 叶媛 10月12日&#xff0c;IM智己旗下的新车智己LS6宣布上市。 新车型搭载尖端科技多项&#xff0c;其中以“全画幅数字驾舱屏”、和城市高阶智能辅助驾驶为核心的智驾技术&#xff0c;更是引来众多用户关注。 01 新能源新卷王智己LS6 智己LS6一发布就…...

网络工程师知识点5

71、什么是FTP&#xff1f; FTP是文件传输协议。 FTP传输数据时支持两种传输模式&#xff1a;ASCII模式和二进制模式。 需要TCP的21号端口来建立控制连接 需要TCP的20号端口来建立数据连接 72、什么是telnet&#xff1f; Telnet提供了一个交互式操作界面&#xff0c;允许终端远…...

未来展望:大型语言模型与 SQL 数据库集成的前景与挑战

一、前言 随着 GPT-3、PaLM 和 Anthropic 的 Claude 等大型语言模型 (LLM) 的出现引发了自然语言在人工智能领域的一场革命。这些模型可以理解复杂的语言、推理概念并生成连贯的文本。这使得各种应用程序都能够使用对话界面。然而&#xff0c;绝大多数企业数据都存储在结构化 …...

SpringCloud-Hystrix

一、介绍 &#xff08;1&#xff09;避免单个服务出现故障导致整个应用崩溃。 &#xff08;2&#xff09;服务降级&#xff1a;服务超时、服务异常、服务宕机时&#xff0c;执行定义好的方法。&#xff08;做别的&#xff09; &#xff08;3&#xff09;服务熔断&#xff1a;达…...

Ansible脚本进阶---playbook

目录 一、playbooks的组成 二、案例 2.1 在webservers主机组中执行一系列任务&#xff0c;包括禁用SELinux、停止防火墙服务、安装httpd软件包、复制配置文件和启动httpd服务。 2.2 在名为dbservers的主机组中创建一个用户组&#xff08;mysql&#xff09;和一个用户&#x…...

pytorch 模型部署之Libtorch

Python端生成pt模型文件 net.load(model_path) net.eval() net.to("cuda")example_input torch.rand(1, 3, 240, 320).to("cuda") traced_model torch.jit.trace(net, example_input) traced_model.save("model.pt")output traced_model(exa…...

wordpress5.1/外贸推广建站

C进阶-继承零、前言一、继承的概念和定义二、基类和派生类对象赋值转换三、继承中的作用域四、派生类的默认成员函数五、继承和友元六、继承和静态成员七、菱形继承和虚拟继承八、继承和组合九、继承相关面试题零、前言 从本章开始&#xff0c;我们已经达到了C的入门水平&#…...

网站建设专业学什么/搜索引擎优化服务

chidNodes返回的是node的集合&#xff0c;每个node都包含有nodeType属性。 nodeType取值&#xff1a; 元素节点&#xff1a;1 属性节点&#xff1a;2 文本节点&#xff1a;3 注释节点&#xff1a;8页面上是由无数个节点组成&#xff0c;节点分成元素节点、属性节点、文本节点、…...

重庆网站建设哪家专业/郑州seo招聘

很多朋友对于IBM海量的描述信息感觉到束手无策&#xff0c;以下信息均可以在www.unix360.com 中使用快查功能查询到&#xff0c;另外可以查看到具体的配件对应的PN号&#xff0c;查询可以适用于哪些整机&#xff0c;这是单纯本文档无法实现的功能。更多详情请移步www.unix360.c…...

扫码进入网站如何做/广西seo公司

Libvirt-Manager这是一个简单的 Libvirt 虚拟机管理器&#xff0c;使用 PHP 开发。它可以启动、关闭、强制结束或读取虚拟机信息&#xff0c;列出虚拟机列表等。这个项目是为了让开发者管理虚拟机更简单&#xff0c;更轻松。你需要安装 PHP_SSH2 模块来使用此管理器。唔...第一…...

邢台企业做网站找谁/佛山网站开发公司

本节书摘来异步社区《OpenGL ES 3.x游戏开发&#xff08;下卷&#xff09;》一书中的第2章&#xff0c;第2.7节&#xff0c;作者&#xff1a; 吴亚峰 责编&#xff1a; 张涛&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看。 2.7 固定渲染管线与可编程渲染管…...

百度wordpress插件下载地址/佛山外贸seo

最近&#xff0c;有关最新版本的南大核心目录的帖子应该又又又刷屏了。有关北大核心和南大核心目录的帖子&#xff0c;好像已经成了惯例&#xff0c;隔三差五就会被拿出来晾凉晒晒&#xff0c;收割一波阅读量。学术圈的人&#xff0c;对于核心期刊的关注&#xff0c;可能甚于关…...