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

python-selenium 爬虫 由易到难

本质

python第三方库 selenium 控制 浏览器驱动
浏览器驱动控制浏览器

  • 推荐 edge 浏览器驱动(不容易遇到版本或者兼容性的问题)
  • 驱动下载网址:链接: link

1、实战1

(1)安装 selenium 库

pip install selenium

(2)将驱动文件exe放在py文件同级目录下

在这里插入图片描述

(3)初步体验驱动器控制浏览器

# 从selenium库中导入webdriver模块
from selenium import webdriver
# 从selenium.webdriver.common.by模块中导入By类,用于定位元素
from selenium.webdriver.common.by import By
# 从selenium.webdriver.common.keys模块中导入Keys类,用于模拟键盘按键操作
from selenium.webdriver.common.keys import Keys
import time# 若你想用Edge浏览器,使用下面这行代码,前提是msedgedriver.exe路径正确
driver = webdriver.Edge("./msedgedriver.exe")# get方法会一直等到页面被完全加载,然后才会继续程序
driver.get("http://www.baidu.com/")# id="kw" 是百度搜索输入框,输入字符串 "长城"
driver.find_element(By.CSS_SELECTOR, "#kw").send_keys("长城")# id="su" 是百度搜索按钮,click() 是模拟点击
driver.find_element(By.CSS_SELECTOR, "#su").click()# 为了便于观察搜索结果,等待 5 秒
time.sleep(5)
# 关闭浏览器
driver.quit()

(4)元素定位

1.获取单个元素——元素不存在会报错

# 通过 ID 定位元素
element_by_id = driver.find_element(By.ID, "inputOriginal")# 通过 CSS 选择器定位元素 id-#
element_by_css = driver.find_element(By.CSS_SELECTOR, "#inputOriginal")# 通过标签名定位元素
element_by_tag = driver.find_element(By.TAG_NAME, "div")# 通过 name 属性定位元素
element_by_name = driver.find_element(By.NAME, "username")# 通过链接文本定位元素
element_by_link_text = driver.find_element(By.LINK_TEXT, "下一页")

2.获取多个元素——返回列表(元素不存在返回空)

# 通过 ID 定位多个元素
elements_by_id = driver.find_elements(By.ID, "inputOriginal")# 通过 CSS 选择器定位多个元素
elements_by_css = driver.find_elements(By.CSS_SELECTOR, "#inputOriginal")# 通过标签名定位多个元素
elements_by_tag = driver.find_elements(By.TAG_NAME, "div")# 通过 name 属性定位多个元素
elements_by_name = driver.find_elements(By.NAME, "username")# 通过链接文本定位多个元素
elements_by_link_text = driver.find_elements(By.LINK_TEXT, "下一页")# 后续可对定位到的元素列表进行操作,例如遍历元素列表
for element in elements_by_id:print(element.text)

2、实战2:访问有道翻译,获取翻译后的内容

# 从selenium库中导入webdriver模块
from selenium import webdriver
# 从selenium.webdriver.common.by模块中导入By类,用于定位元素
from selenium.webdriver.common.by import By
# 从selenium.webdriver.common.keys模块中导入Keys类,用于模拟键盘按键操作
from selenium.webdriver.common.keys import Keys
import time# 若你想用Edge浏览器,使用下面这行代码,前提是msedgedriver.exe路径正确
driver = webdriver.Edge("./msedgedriver.exe")# 加载有道翻译页面
driver.get("https://fanyi.youdao.com/#/TextTranslate")# 等待页面加载
time.sleep(2)# 获取输入框
input_box = driver.find_element(By.ID, "js_fanyi_input")# 输入内容
input_box.send_keys("hello")# 等待翻译完成
time.sleep(2)# 获取翻译后的内容
transTarget = driver.find_element(By.ID, "js_fanyi_output_resultOutput")
print(transTarget.text)
# 为了便于观察搜索结果,等待 5 秒
time.sleep(5)
# 关闭浏览器
driver.quit()

3、实战3:爬取当当网站商品信息

(1)内容获取

在这里插入图片描述

(2)窗口操作

在这里插入图片描述

(3)实战

# 从selenium库中导入webdriver模块
from selenium import webdriver
# 从selenium.webdriver.common.by模块中导入By类,用于定位元素
from selenium.webdriver.common.by import By
# 从selenium.webdriver.common.keys模块中导入Keys类,用于模拟键盘按键操作
from selenium.webdriver.common.keys import Keys
import time# 若你想用Edge浏览器,使用下面这行代码,前提是msedgedriver.exe路径正确
driver = webdriver.Edge("./msedgedriver.exe")# 加载当当网
driver.get("https://www.dangdang.com/")# 等待页面加载
time.sleep(2)# 获取输入框
key = driver.find_element(By.ID, "key_S")
key.send_keys("科幻")# 获取搜索框,点击搜索
search = driver.find_element(By.CSS_SELECTOR, "#form_search_new .button")
search.click()# 等待搜索结果页面加载
time.sleep(3)# 获取商品标题及价格,循环 5 页
for i in range(5):shoplist = driver.find_elements(By.CSS_SELECTOR, ".bigimg li") # bigimg 下的所有 li标签for li in shoplist:try:title = li.find_element(By.CSS_SELECTOR, "a").get_attribute("title")print(title)except Exception as e:print(f"获取商品标题时出错: {e}")try:price = li.find_element(By.CSS_SELECTOR, ".search_now_price").textprint(price)except Exception as e:print(f"获取商品价格时出错: {e}")# 获取下一页按钮try:next_page = driver.find_element(By.LINK_TEXT, "下一页")next_page.click()# 等待下一页加载time.sleep(3)except Exception as e:print(f"点击下一页时出错: {e}")break# 关闭浏览器
driver.close()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(4)css选择器基本规则

在这里插入图片描述

(5)等待——显式/隐式

1.隐式:全局,只要找元素,没出来就等max_time(自定义)

driver = webdriver.Edge("./msedgedriver.exe")
driver.implicitly_wait(30)

2.显式:特定条件下的等待:webDriverWait+until+(判断条件)

# 程序每 0.5 秒检查,是否满足:标题包含 “百度一下” 这个条件,
# 检查是否满足条件的最长时间为:15 秒,超过 15 秒仍未满足条件则抛出异常
try:WebDriverWait(driver, 15, 0.5).until(EC.title_contains("百度一下"))print("页面标题包含 '百度一下'")
except Exception as e:print(f"等待页面标题时出现异常: {e}")# 假设要定位的元素 CSS 选择器为 ".example-element",需根据实际情况修改
element_selector = ".example-element"# 程序每 0.5 秒检查,是否满足:某定位的元素出现,
# 检查是否满足条件的最长时间为:15 秒,超过 15 秒仍未满足条件则抛出异常
try:WebDriverWait(driver, 15, 0.5).until(EC.visibility_of_element_located((By.CSS_SELECTOR, element_selector)))print(f"元素 {element_selector} 已可见")
except Exception as e:print(f"等待元素可见时出现异常: {e}")# 关闭浏览器
driver.quit()

4、实战4:鼠标及键盘操作(动作链)

在这里插入图片描述
在这里插入图片描述

driver.get("https://www.baidu.com/")
more=driver.find_element(By.LINK_TEXT,"更多")
link_element = driver.find_element(By.CSS_SELECTOR, 'a[name="tj_fanyi"]')
baike = link_element.get_attribute('href')
#将鼠标移动到更多按钮
ActionChains(driver).move_to_element(more).move_to_element(link_element).click().perform()

其他:滚动条,窗口截图

在这里插入图片描述
在这里插入图片描述

5、实战5:爬取知乎数据(应对反爬、滑动验证)

在这里插入图片描述

(1)方法一——opencv轮廓检测,由面积和周长确定起始和终止位置

# 从selenium库中导入webdriver模块
from selenium import webdriver
# 从selenium.webdriver.common.by模块中导入By类,用于定位元素
from selenium.webdriver.common.by import By
# 从selenium.webdriver.common.keys模块中导入Keys类,用于模拟键盘按键操作
from selenium.webdriver import ActionChains
# 导入显式等待类
from selenium.webdriver.support.wait import WebDriverWait
# 导入等待条件类
from selenium.webdriver.support import expected_conditions as EC
# 保存图片
from urllib import request
# 计算机图像识别
import cv2
# 反爬应对
import random
# 反爬应对
import time
# ------------------------------------------
# 1、创建 driver
driver = webdriver.Edge("./msedgedriver.exe")
driver.get("https://www.zhihu.com/")
driver.maximize_window()
# 2、输入用户名、密码(一系列鼠标点击动作)
dl = driver.find_element(By.CSS_SELECTOR, "#root > div > main > div > div > div > div > div.signQr-rightContainer > div > div.SignContainer-content > div > div:nth-child(1) > form > div.SignFlow-tabs > div:nth-child(2)")
ActionChains(driver).move_to_element(dl).click().perform()
dh = driver.find_element(By.CSS_SELECTOR,"#root > div > main > div > div > div > div > div.signQr-rightContainer > div > div.SignContainer-content > div > div:nth-child(1) > form > div.SignFlow-account > div > label > input")
dh.send_keys("15735188768")
mm = driver.find_element(By.CSS_SELECTOR,"#root > div > main > div > div > div > div > div.signQr-rightContainer > div > div.SignContainer-content > div > div:nth-child(1) > form > div.SignFlow-password > div > label > input")
mm.send_keys('wy062600')
login = driver.find_element(By.CSS_SELECTOR,"#root > div > main > div > div > div > div > div.signQr-rightContainer > div > div.SignContainer-content > div > div:nth-child(1) > form > button")
ActionChains(driver).move_to_element(login).click().perform()
# 3、显式等待直到滑动窗口的出现
WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.CSS_SELECTOR,"body > div.yidun_popup--light.yidun_popup.yidun_popup--size-small > div.yidun_modal__wrap > div > div > div.yidun_modal__body > div > div.yidun_panel > div > div.yidun_bgimg")))
pic = driver.find_element(By.CSS_SELECTOR,'body > div.yidun_popup--light.yidun_popup.yidun_popup--size-small > div.yidun_modal__wrap > div > div > div.yidun_modal__body > div > div.yidun_panel > div > div.yidun_bgimg > img.yidun_bg-img')
imgsrc = pic.get_attribute("src")
# 4、获取图片并保存
request.urlretrieve(imgsrc,'img.png')
# 5、定义函数,获取轮廓位置
def get_pos(imageSrc):image = cv2.imread(imageSrc) # 利用cv2读取图片blurred = cv2.GaussianBlur(image, (5, 5), 0, 0)canny = cv2.Canny(blurred, 0, 100)contours, hierarchy = cv2.findContours(canny, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)print(len(contours))for contour in contours:x, y, w, h = cv2.boundingRect(contour)area = cv2.contourArea(contour)zhouchang = cv2.arcLength(contour, True)if 5025 < area < 7225 and 300 < zhouchang < 380:x, y, w, h = cv2.boundingRect(contour)cv2.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2)cv2.imwrite("111.jpg", image)return xreturn 0dis = get_pos('img.png')
smallImage = driver.find_element(By.CSS_SELECTOR,'body > div.yidun_popup--light.yidun_popup.yidun_popup--size-small > div.yidun_modal__wrap > div > div > div.yidun_modal__body > div > div.yidun_panel > div > div.yidun_bgimg > img.yidun_jigsaw')dis = int(dis * 340 / 672 - smallImage.location['x'])
driver.implicitly_wait(2000)
ActionChains(driver).click_and_hold(smallImage).perform()  # 按下按钮
i = 0
moved = 0
while moved < dis:x = random.randint(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()
time.sleep(20000)# 关闭浏览器
driver.close()

canny = cv2.Canny(blurred, 低阈值, 高阈值)

在这里插入图片描述

(2)方法二——opencv灰度检测确定起始和终止位置

def calculate_slide_distance(full_image, slider_image):"""计算滑块需要滑动的距离:param full_image: 完整背景图:param slider_image: 滑块图:return: 滑动距离"""if full_image is None or slider_image is None:print("图片数据为空,无法计算滑动距离")return 0# 灰度化gray_full = cv2.cvtColor(full_image, cv2.COLOR_BGR2GRAY)gray_slider = cv2.cvtColor(slider_image, cv2.COLOR_BGR2GRAY)# 边缘检测edges_full = cv2.Canny(gray_full, 50, 150)edges_slider = cv2.Canny(gray_slider, 50, 150)# 模板匹配,这里使用TM_CCOEFF_NORMED方法result = cv2.matchTemplate(edges_full, edges_slider, cv2.TM_CCOEFF_NORMED)min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)print(f"匹配的相似度值: {max_val}")  # 打印匹配的相似度值distance = max_loc[0]print(f"计算得到的滑块滑动距离: {distance}")  # 打印计算得到的距离return distance# 计算滑动距离
full_image = cv2.imread('img.png')
slider_image = cv2.imread('img2.png')
distance = calculate_slide_distance(full_image, slider_image)

(3)最终结果

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from urllib import request
import cv2
import random
import time
import csv
import os# 1、创建 driver
driver = webdriver.Edge("./msedgedriver.exe")
driver.get("https://www.zhihu.com/")
driver.maximize_window()# 2、输入用户名、密码(一系列鼠标点击动作)
dl = driver.find_element(By.CSS_SELECTOR, "#root > div > main > div > div > div > div > div.signQr-rightContainer > div > div.SignContainer-content > div > div:nth-child(1) > form > div.SignFlow-tabs > div:nth-child(2)")
ActionChains(driver).move_to_element(dl).click().perform()
dh = driver.find_element(By.CSS_SELECTOR, "#root > div > main > div > div > div > div > div.signQr-rightContainer > div > div.SignContainer-content > div > div:nth-child(1) > form > div.SignFlow-account > div > label > input")
dh.send_keys("15735188768")
mm = driver.find_element(By.CSS_SELECTOR, "#root > div > main > div > div > div > div > div.signQr-rightContainer > div > div.SignContainer-content > div > div:nth-child(1) > form > div.SignFlow-password > div > label > input")
mm.send_keys('wy062600')
login = driver.find_element(By.CSS_SELECTOR, "#root > div > main > div > div > div > div > div.signQr-rightContainer > div > div.SignContainer-content > div > div:nth-child(1) > form > button")
ActionChains(driver).move_to_element(login).click().perform()# 3、显式等待直到滑动窗口的出现
WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "body > div.yidun_popup--light.yidun_popup.yidun_popup--size-small > div.yidun_modal__wrap > div > div > div.yidun_modal__body > div > div.yidun_panel > div > div.yidun_bgimg")))
pic = driver.find_element(By.CSS_SELECTOR, 'body > div.yidun_popup--light.yidun_popup.yidun_popup--size-small > div.yidun_modal__wrap > div > div > div.yidun_modal__body > div > div.yidun_panel > div > div.yidun_bgimg > img.yidun_bg-img')
imgsrc = pic.get_attribute("src") # 获取链接
request.urlretrieve(imgsrc,'img1.png')# 下载图片
pic2 = driver.find_element(By.CSS_SELECTOR,'body > div.yidun_popup--light.yidun_popup.yidun_popup--size-small > div.yidun_modal__wrap > div > div > div.yidun_modal__body > div > div.yidun_panel > div > div.yidun_bgimg > img.yidun_jigsaw')
imgsrc2 = pic2.get_attribute("src")
request.urlretrieve(imgsrc2,'img2.png')
# ----------------------------------------------------------
# 4.1、法一:灰度检测
def calculate_slide_distance(full_image, slider_image):"""计算滑块需要滑动的距离:param full_image: 完整背景图:param slider_image: 滑块图:return: 滑动距离"""if full_image is None or slider_image is None:print("图片数据为空,无法计算滑动距离")return 0# 灰度化gray_full = cv2.cvtColor(full_image, cv2.COLOR_BGR2GRAY)gray_slider = cv2.cvtColor(slider_image, cv2.COLOR_BGR2GRAY)# 边缘检测edges_full = cv2.Canny(gray_full, 50, 150)edges_slider = cv2.Canny(gray_slider, 50, 150)# 模板匹配,这里使用TM_CCOEFF_NORMED方法result = cv2.matchTemplate(edges_full, edges_slider, cv2.TM_CCOEFF_NORMED)min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)print(f"匹配的相似度值: {max_val}")  # 打印匹配的相似度值distance = max_loc[0]print(f"计算得到的滑块滑动距离: {distance}")  # 打印计算得到的距离return distance
# 4.1.1、计算滑动距离
full_image = cv2.imread('img1.png')
slider_image = cv2.imread('img2.png')
distance = calculate_slide_distance(full_image, slider_image)
# --------------------------------------
# 4.2、法2:轮廓边界
def get_pos(imageSrc):image = cv2.imread(imageSrc) # 利用cv2读取图片blurred = cv2.GaussianBlur(image, (5, 5), 0, 0)canny = cv2.Canny(blurred, 0, 100)contours, hierarchy = cv2.findContours(canny, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)print(len(contours))for contour in contours:x, y, w, h = cv2.boundingRect(contour)area = cv2.contourArea(contour)zhouchang = cv2.arcLength(contour, True)if 5025 < area < 7225 and 300 < zhouchang < 380:x, y, w, h = cv2.boundingRect(contour)cv2.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2)cv2.imwrite("111.jpg", image)return xreturn 0
# 4.2.1 法2需要计算距离   
dis = get_pos('img.png')
dis = int(dis * 340 / 672 - pic2.location['x'])
driver.implicitly_wait(2000)
ActionChains(driver).click_and_hold(pic2).perform()  # 按下按钮
# 4.2.2 反爬操作:
i = 0
moved = 0
while moved < dis:x = random.randint(3, 10)moved += xActionChains(driver).move_by_offset(xoffset=x, yoffset=0).perform()print("第{}次移动后, 位置为{}".format(i, pic2.location['x']))i += 1
ActionChains(driver).release().perform()# 5、等待页面加载完成
WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.CSS_SELECTOR, ".AppHeader-inner css-11p8nt5")))# 6、定义 CSV 文件路径
csv_file_path = "zhihu_data3.csv"# 7、写入 CSV 文件
def write_to_csv(data):with open(csv_file_path, mode="a", newline="", encoding="utf-8") as file:writer = csv.writer(file)writer.writerow(data)# 8、写入 CSV 表头
if not os.path.exists(csv_file_path):with open(csv_file_path, mode="w", newline="", encoding="utf-8") as file:writer = csv.writer(file)writer.writerow(["author_name", "title", "item_id", "has_image", "upvote_num"])
# 9、滚动加载更多内容
def scroll_to_load_more(max_scrolls=10):scroll_count = 0last_height = driver.execute_script("return document.body.scrollHeight")while scroll_count < max_scrolls:# 滚动到底部driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")time.sleep(2)  # 等待新内容加载# 计算新的页面高度new_height = driver.execute_script("return document.body.scrollHeight")if new_height == last_height:  # 如果没有新内容加载,退出循环breaklast_height = new_heightscroll_count += 1scroll_to_load_more(max_scrolls=30)
# 10、提取数据
articles = driver.find_elements(By.CSS_SELECTOR, ".ContentItem.ArticleItem, .ContentItem.AnswerItem")
for article in articles:try:# 提取 authorNameauthor_name = article.get_attribute("data-zop")if author_name:author_name = eval(author_name).get("authorName", "未知作者")else:author_name = "未知作者"# 提取 titletitle_element = article.find_element(By.CSS_SELECTOR, "h2.ContentItem-title a")title = title_element.text# 提取 itemIditem_id = article.get_attribute("data-zop")if item_id:item_id = eval(item_id).get("itemId", "未知ID")else:item_id = "未知ID"# 提取 has_imagehas_image = False  # 默认值try:image_element = article.find_element(By.CSS_SELECTOR, ".RichContent-inner img")if image_element:has_image = Trueexcept:pass# 提取 upvote_numupvote_num = 0try:upvote_element = article.find_element(By.CSS_SELECTOR, ".VoteButton--up")upvote_num = int(upvote_element.text.replace("赞同", "").strip())except:pass# 打印提取的数据print(f"作者: {author_name}")print(f"标题: {title}")print(f"文章ID: {item_id}")print(f"是否有图片: {has_image}")print(f"点赞数: {upvote_num}")print("-" * 50)# 写入 CSV 文件data = [author_name, title, item_id, has_image, upvote_num]write_to_csv(data)except Exception as e:print(f"提取数据时出错: {e}")
time.sleep(2000)
# 关闭浏览器
driver.quit()

在这里插入图片描述

相关文章:

python-selenium 爬虫 由易到难

本质 python第三方库 selenium 控制 浏览器驱动 浏览器驱动控制浏览器 推荐 edge 浏览器驱动&#xff08;不容易遇到版本或者兼容性的问题&#xff09; 驱动下载网址&#xff1a;链接: link 1、实战1 &#xff08;1&#xff09;安装 selenium 库 pip install selenium&#…...

Execution failed for task ‘:path_provider_android:compileDebugJavaWithJavac‘.

What went wrong: Execution failed for task ‘:path_provider_android:compileDebugJavaWithJavac’. Could not resolve all files for configuration ‘:path_provider_android:androidJdkImage’. Failed to transform core-for-system-modules.jar to match attributes {…...

【Linux 维测专栏 2 -- Deadlock detection介绍】

文章目录 kernel 编译选项配置deadlock 测试代码deadlock 测试 logkernel 编译选项配置 通过 menuconfig 配置下面编译选项 # lockdep CONFIG_LOCK_STAT=y CONFIG_PROVE_LOCKING=y CONFIG_DEBUG_LOCKDEP=y上面配置完成后会定义下面宏: CONFIG_LOCK_DEBUGGING_SUPPORT=y CONF…...

T113-i开发板的休眠与RTC定时唤醒指南

​​在嵌入式系统设计中&#xff0c;休眠与唤醒技术是优化电源管理、延长设备续航的关键。飞凌嵌入式基于全志T113-i处理器开发设计的OK113i-S开发板提供了两种休眠模式&#xff1a;freeze和mem&#xff0c;以满足不同应用场景下的功耗与恢复速度需求。本文将详细介绍如何让OK1…...

Node.js系列(4)--微服务架构实践

Node.js微服务架构实践 &#x1f504; 引言 微服务架构已成为构建大规模Node.js应用的主流选择。本文将深入探讨Node.js微服务架构的设计与实现&#xff0c;包括服务拆分、服务治理、通信机制等方面&#xff0c;帮助开发者构建可扩展的微服务系统。 微服务架构概述 Node.js…...

基于Spring Boot的公司资产网站的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

CSS 中flex - grow、flex - shrink和flex - basis属性的含义及它们在弹性盒布局中的协同作用。

大白话CSS 中flex - grow、flex - shrink和flex - basis属性的含义及它们在弹性盒布局中的协同作用。 在 CSS 的弹性盒布局&#xff08;Flexbox&#xff09;里&#xff0c;flex-grow、flex-shrink 和 flex-basis 这三个属性对弹性元素的尺寸和伸缩性起着关键作用。下面为你详细…...

基于CVX优化器的储能电池调峰调频算法matlab仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 原理概述 4.2 CVX工具箱概述 5.完整工程文件 1.课题概述 基于CVX优化器的储能电池调峰调频算法matlab仿真。CVX 是一种用于求解凸优化问题的强大工具。凸优化问题具有良好的数学性质&#xff0c;能…...

SpringBoot3+Vue3开发学生成绩管理系统

系统介绍 此系统功能包含&#xff1a;首页、课程管理、成绩查询、成绩详情、班级管理、专业管理、用户管理等功能。用户管理又细分为账号管理、学生管理、教师管理、管理员管理。 基础功能包含&#xff1a;登录、退出、修改登录人信息、修改登录人密码。 分为4种角色&#x…...

正则魔法:解码 return /^\d+$/.test(text) ? text : ‘0‘ 的秘密

&#x1f680; 正则魔法&#xff1a;解码 return /^\d$/.test(text) ? text : 0 的秘密 &#x1f31f; 嘿&#xff0c;技术探险家们&#xff01;&#x1f44b; 今天我们要破解一段看似简单的代码&#xff1a;return /^\d$/.test(text) ? text : 0。它藏在一个 Vue 前端组件中…...

基于BClinux8部署Ceph 19.2(squid)集群

#作者&#xff1a;闫乾苓 文章目录 1.版本选择Ceph版本发布历史目前官方在维护的版本 2.部署方法3.服务器规划4.前置配置4.1系统更新4.2配置hosts cat >> /etc/hosts << EOFssh-keygenssh-copy-id ceph01ssh-copy-id ceph02ssh-copy-id ceph034.5 Python34.6 Syst…...

CVPR2025 | 对抗样本智能安全方向论文汇总 | 持续更新中~

汇总结果来源&#xff1a;CVPR 2025 Accepted Papers 若文中出现的 论文链接 和 GitHub链接 点不开&#xff0c;则说明还未公布&#xff0c;在公布后笔者会及时添加. 若笔者未及时添加&#xff0c;欢迎读者告知. 文章根据题目关键词搜索&#xff0c;可能会有遗漏. 若笔者出现…...

[leetcode]1631. 最小体力消耗路径(bool类型dfs+二分答案/记忆化剪枝/并查集Kruskal思想)

题目链接 题意 给定 n m n\times m nm地图 要从(1,1) 走到 (n,m) 定义高度绝对差为四联通意义下相邻的两个点高度的绝对值之差 定义路径的体力值为整条路径上 所有高度绝对差的max 求所有路径中 最小的路径体力值是多少 方法1 这是我一开始自己写的记忆化剪枝 比较暴力 时…...

Linux-Ubuntu 系统学习笔记 | 从入门到实战

&#x1f4d8; Linux-Ubuntu 系统学习笔记 | 从入门到实战 &#x1f4dc; 目录 环境安装基本操作Linux操作系统介绍文件系统常用命令用户权限管理编辑器vimGCC编译器动态库与静态库Makefile 1. 环境安装 &#x1f31f; 下载镜像 推荐使用清华大学开源镜像站下载Ubuntu镜像&a…...

Java学习笔记-XXH3哈希算法

XXH3是由Yann Collet设计的非加密哈希算法&#xff0c;属于XXHash系列的最新变种&#xff0c;专注于极速性能与低碰撞率&#xff0c;适用于对计算效率要求极高的场景。 极速性能 在RAM速度限制下运行&#xff0c;小数据&#xff08;如 1-128 字节&#xff09;处理可达纳秒级&…...

【容器运维】docker搭建私有仓库

一、基础方案&#xff1a;使用 Docker Registry 快速搭建 1. 拉取并启动 Registry 镜像 # 拉取官方镜像 docker pull registry:2# 运行容器&#xff08;数据持久化到宿主机目录&#xff09; docker run -d -p 5000:5000 \--name my-registry \-v /opt/data/registry:/var/lib…...

深入理解 Spring 框架中的 AOP 技术

一、引言 在 Java 开发领域&#xff0c;Spring 框架凭借其强大的功能和丰富的特性&#xff0c;成为了众多开发者构建企业级应用的首选。其中&#xff0c;面向切面编程&#xff08;AOP&#xff09;作为 Spring 框架的核心技术之一&#xff0c;为开发者提供了一种全新的程序结构…...

磁盘清理工具-TreeSize Free介绍

TreeSizeFree是一个磁盘空间管理工具&#xff0c;主要用于分析磁盘使用情况&#xff0c;帮助用户找到占用空间大的文件和文件夹: 特点&#xff1a;按大小排序&#xff1a;快速找到占用空间最大的文件或文件夹 一般可以删除: 扫描 C:\Users\XXX\AppData\Local\Temp 或 C:\Window…...

redis MISCONF Redis is configured to save RDB snapshots报错解决

直接上解决方案 修改redis配置文件 stop-writes-on-bgsave-error no 重启redis...

c#知识点补充2

1.非静态类能否调用静态方法可以 2.对string类型扩展方法&#xff0c;如何进行 类用静态类&#xff0c;参数是this 调用如下 3.out的用法 一定要给a赋值 这种写法不行 这样才行 4.匿名类 5.委托的使用 无论是匿名委托&#xff0c;还是具命委托&#xff0c;委托实例化后一定要…...

循环神经网络(Recurrent Neural Network, RNN)与 Transformer

循环神经网络&#xff08;RNN&#xff09;与 Transformer 1. 循环神经网络&#xff08;RNN&#xff09;简介 1.1 RNN 结构 循环神经网络&#xff08;Recurrent Neural Network, RNN&#xff09;是一种适用于处理序列数据的神经网络。其核心特点是通过隐藏状态&#xff08;Hi…...

力扣45.跳跃游戏

45. 跳跃游戏 II - 力扣&#xff08;LeetCode&#xff09; 代码区&#xff1a; #include<vector> class Solution {public:int jump(vector<int>& nums) {int ans[10005] ;memset(ans,1e4,sizeof(ans));ans[0]0;for(int i0;i<nums.size();i){for(int j1;j…...

招聘面试季--方法论--如何从零到-规划一个新的app产品

规划一个新APP产品的系统化步骤及关键要点&#xff1a; 一、需求验证阶段 ‌明确目标用户与核心需求‌ 通过用户调研&#xff08;问卷、访谈&#xff09;定义目标人群的痛点和场景&#xff0c;例如购物类APP需优先满足浏览、支付等核心需求‌。判断APP的必要性&#xff1a;若功…...

MacOS安装 nextcloud 的 Virtual File System

需求 在Mac上安装next cloud实现类似 OneDrive 那样&#xff0c;文件直接保存在服务器&#xff0c;需要再下载到本地。 方法 在 官网下载Download for desktop&#xff0c;注意要下对版本&#xff0c;千万别下 Mac OS默认的那个。 安装了登录在配置过程中千万不要设置任何同…...

OpenCV Imgproc 模块使用指南(Python 版)

一、模块概述 imgproc 模块是 OpenCV 的图像处理核心&#xff0c;提供从基础滤波到高级特征提取的全流程功能。核心功能包括&#xff1a; 图像滤波&#xff1a;降噪、平滑、锐化几何变换&#xff1a;缩放、旋转、透视校正颜色空间转换&#xff1a;BGR↔灰度 / HSV/Lab 等阈值…...

C/C++蓝桥杯算法真题打卡(Day6)

一、P8615 [蓝桥杯 2014 国 C] 拼接平方数 - 洛谷 方法一&#xff1a;算法代码&#xff08;字符串分割法&#xff09; #include<bits/stdc.h> // 包含标准库中的所有头文件&#xff0c;方便编程 using namespace std; // 使用标准命名空间&#xff0c;避免每次调用…...

ORACLE RAC ASM双存储架构下存储部分LUN异常的处理

早上接到用户电话&#xff0c;出现有表空间不足的告警&#xff0c;事实上此环境经常巡检并且有告警系统&#xff0c;一开始就带着有所疑惑的心理&#xff0c;结果同事在扩大表空间时&#xff0c;遇到报错 ORA-15401/ORA-17505,提示ASM空间满了&#xff1a; ALERT日志&#xff1…...

【设计模式】SOLID 设计原则概述

SOLID 是面向对象设计中的五大原则&#xff0c;不管什么面向对象的语言&#xff0c; 这个准则都很重要&#xff0c;如果你没听说过&#xff0c;赶紧先学一下。它可以提高代码的可维护性、可扩展性和可读性&#xff0c;使代码更加健壮、易于测试和扩展。SOLID 代表以下五个设计原…...

从边缘到核心:群联云防护如何重新定义安全加速边界?

一、安全能力的全方位碾压 1. 协议层深度防护 四层防御&#xff1a; 动态过滤畸形TCP/UDP包&#xff08;如SYN Flood&#xff09;&#xff0c;传统CDN仅限速率控制。技术示例&#xff1a;基于AI的协议指纹分析&#xff0c;拦截异常连接模式。 七层防御&#xff1a; 精准识别业…...

others-rustdesk远程

title: others-rustdesk远程 categories: Others tags: [others, 远程] date: 2025-03-19 10:19:34 comments: false mathjax: true toc: true others-rustdesk远程, 替代 todesk 的解决方案 前篇 官方 服务器 - https://rustdesk.com/docs/zh-cn/self-host/rustdesk-server-o…...