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

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&#…...

希尔排序

希尔排序是一种改进的插入排序算法&#xff0c;它通过将原始数据分成多个子序列来改善插入排序的性能&#xff0c;每个子序列的元素间隔为 d&#xff08;增量&#xff09;。随着算法的进行&#xff0c;d 逐渐减小&#xff0c;最终减为 1&#xff0c;此时整个序列就被排序好了。…...

Pydantic Mixin:构建可组合的验证系统体系

title: Pydantic Mixin:构建可组合的验证系统体系 date: 2025/3/22 updated: 2025/3/22 author: cmdragon excerpt: Pydantic的Mixin模式通过继承组合实现校验逻辑复用,遵循以Mixin后缀命名、不定义初始化方法等设计原则。支持基础校验模块化封装与多策略组合,如电话号码…...

策略模式 vs. 工厂模式:对比与分析

相同点 解耦思想 两者都通过接口/抽象类将实现与调用方解耦&#xff0c;降低模块间的直接依赖。 符合开闭原则 新增策略或产品时&#xff0c;只需扩展新类&#xff0c;无需修改已有代码。 封装变化 策略模式封装算法的变化&#xff0c;工厂模式封装对象创建的变化。 不同…...

RK3568 I2C底层驱动详解

前提须知&#xff1a;I2C协议不懂的话就去看之前的内容吧&#xff0c;这个文章需要读者一定的基础。 RK3568 I2C 简介 RK3568 支持 6 个独立 I2C: I2C0、I2C1、I2C2、I2C3、I2C4、I2C5。I2C 控制器支持以下特性: ① 兼容 i2c 总线 ② AMBA APB 从接口 ③ 支持 I2C 总线主模式…...

【大语言模型_8】vllm启动的模型通过fastapi封装增加api-key验证

背景&#xff1a; vllm推理框架启动模型不具备api-key验证。需借助fastapi可以实现该功能 代码实现&#xff1a; rom fastapi import FastAPI, Header, HTTPException, Request,Response import httpx import logging# 创建 FastAPI 应用 app FastAPI() logging.basicConfig(…...

hadoop-HDFS操作

1. 使用的是hadoop的用户登录到系统&#xff0c;那么 cd ~ 是跳转到/home/hadoop下。 2. 在操作hdfs时&#xff0c;需要在hadoop用户下的/usr/local/hadoop&#xff0c;此时是在根目录下。 cd /usr/local/hadoop或者cd / cd usr/local/hadoop 3. 回到Linux的操作目录 我们把…...

Mysql 安装教程和Workbench的安装教程以及workbench的菜单栏汉化

Mysql 安装教程和Workbench的安装教程 详细请参考我的文件 Mysql 安装教程和Workbench的安装教程 或者下载我的资源Mysql 安装教程和Workbench的安装教程 汉化菜单 英文版菜单文件&#xff1a;下载链接 汉化版菜单文件&#xff1a;下载链接 默认情况下&#xff0c;安…...

失物招领|校园失物招领系统|基于Springboot的校园失物招领系统设计与实现(源码+数据库+文档)

校园失物招领系统目录 目录 基于Springboot的校园失物招领系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、 管理员功能实现 (1) 失物招领管理 (2) 寻物启事管理 (3) 公告管理 (4) 公告类型管理 2、用户功能实现 (1) 失物招领 (2) 寻物启事 (3) 公告 …...

一条不太简单的TEX学习之路

目录 rule raisebox \includegraphics newenviro 、\vspace \stretch \setlength 解释&#xff1a; 总结&#xff1a; 、\linespread newcommand \par 小四 \small simple 、mutiput画网格 解释&#xff1a; 图案解释&#xff1a; xetex pdelatex etc index 报…...

如何为AI开发选择合适的服务器?

选择适合的服务器可以为您的AI项目带来更高的效率&#xff0c;确保最佳性能、可扩展性和可靠性&#xff0c;从而实现无缝的开发与部署。 选择适合的AI开发服务器可能并不容易。您需要一台能够处理大量计算和大型数据集的服务器&#xff0c;同时它还需要符合您的预算并易于管理…...

doris:审计日志

Doris 提供了对于数据库操作的审计能力&#xff0c;可以记录用户对数据库的登陆、查询、修改操作。在 Doris 中&#xff0c;可以直接通过内置系统表查询审计日志&#xff0c;也可以直接查看 Doris 的审计日志文件。 开启审计日志​ 通过全局变量 enable_audit_plugin 可以随时…...

CSS中的transition与渐变

目录 一、CSS transition 1. 核心属性 简写语法 2. 子属性详解 2.1 transition-property 2.2 transition-duration 2.3 transition-timing-function 2.4 transition-delay 3. 使用场景示例 3.1 悬停效果&#xff08;Hover&#xff09; 3.2 展开/收起动画 3.3 动态移…...

AI + 医疗 Qwq大模型离线本地应用

通义千问Qwq-32b-FP16可用于社区医院、乡镇卫生院、诊所等小型医疗机构&#xff0c;替代专业合理用药系统&#xff0c;作为药品知识库&#xff0c;实现以下功能&#xff1a; 药品信息智能查询&#xff1a;检索药品的详细说明书、适应症、禁忌症、不良反应及药物相互作用等关键信…...

大数据环境搭建

目录 一&#xff1a;虚拟机:VirtualBox 二&#xff1a;Shell工具:MobaXterm 三&#xff1a;安装脚本 四&#xff1a;JDK和Hadoop 4.1&#xff1a;安装 4.2&#xff1a;启动 4.3&#xff1a;Hadoop可视化访问 4.4&#xff1a;关机 一&#xff1a;虚拟机:VirtualBox Virt…...

七天免登录 为什么不能用seesion,客户端的http请求自动携带cookei的机制(比较重要)涉及HTTP规范

如果是七天免登录,和session肯定没关系,因为session不能持久化,主要是客户端一旦关闭,seesion就失效了/// 所以必须是能持久化的&#xff0c;这就清晰了&#xff0c;要莫在的服务器保存&#xff0c;要摸在客户端设置 cook机制 1. 使用Cookie实现七天免登录 前端&#xff08;登…...

从PGC到AIGC:海螺AI多模态内容生成系统的技术革命

一、内容生产的范式迁移&#xff1a;从PGC到AIGC的进化之路 在数字内容生产的历史长河中&#xff0c;人类经历了三次重大范式转变&#xff1a;专业生成内容&#xff08;PGC&#xff09;的工业化生产、用户生成内容&#xff08;UGC&#xff09;的全民创作浪潮&#xff0c;以及当…...

常考计算机操作系统面试习题(三上)

目录 1. 为何要引入与设备的无关性&#xff1f;如何实现设备的独立性&#xff1f; 2. 页面置换先进先出算法 3. 页面置换先进先出算法&#xff0c;4个页框 4. 进程优先级调度算法 5. 短作业优先调度策略 6. 平均内存访问时间计算 7. 页式存储和段式存储的物理地址计算 …...

数据结构之双向链表-初始化链表-头插法-遍历链表-获取尾部结点-尾插法-指定位置插入-删除节点-释放链表——完整代码

数据结构之双向链表-初始化链表-头插法-遍历链表-获取尾部结点-尾插法-指定位置插入-删除节点-释放链表——完整代码 #include <stdio.h> #include <stdlib.h>typedef int ElemType;typedef struct node{ElemType data;struct node *next, *prev; }Node;//初化链表…...

一键部署 GPU Kind 集群,体验 vLLM 极速推理

随着 Kubernetes 在大模型训练和推理领域的广泛应用&#xff0c;越来越多的开发者需要在本地环境中搭建支持 GPU 的 Kubernetes 集群&#xff0c;以便进行测试和开发。大家都知道&#xff0c;本地搭建 Kubernetes 集群通常可以使用 Kind&#xff08;Kubernetes IN Docker&#…...

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

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

【C++】入门

1.命名空间 1.1 namespace的价值 在C/C中&#xff0c;变量&#xff0c;函数和后面要学到的类都是大量存在的&#xff0c;这些变量&#xff0c;函数和类的名称将存在于全局作用域中&#xff0c;可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化&#xff0c;…...

CUDA 学习(2)——CUDA 介绍

GeForce 256 是英伟达 1999 年开发的第一个 GPU&#xff0c;最初用作显示器上渲染高端图形&#xff0c;只用于像素计算。 在早期&#xff0c;OpenGL 和 DirectX 等图形 API 是与 GPU 唯一的交互方式。后来&#xff0c;人们意识到 GPU 除了用于渲染图形图像外&#xff0c;还可以…...

构建自定义MCP天气服务器:集成Claude for Desktop与实时天气数据

构建自定义MCP天气服务器:集成Claude for Desktop与实时天气数据 概述 本文将指导开发者构建一个MCP(Model Control Protocol)天气服务器,通过暴露get-alerts和get-forecast工具,为Claude for Desktop等客户端提供实时天气数据支持。该方案解决了传统LLM无法直接获取天气…...

[Lc_2 二叉树dfs] 布尔二叉树的值 | 根节点到叶节点数字之和 | 二叉树剪枝

目录 1.计算布尔二叉树的值 题解 2.求根节点到叶节点数字之和 3. 二叉树剪枝 题解 1.计算布尔二叉树的值 链接&#xff1a;2331. 计算布尔二叉树的值 给你一棵 完整二叉树 的根&#xff0c;这棵树有以下特征&#xff1a; 叶子节点 要么值为 0 要么值为 1 &#xff0c;其…...

搜广推校招面经五十六

字节推荐算法 一、Attention的复杂度是多少&#xff1f; 见【搜广推校招面经三十八】 二、如何对普适性强的物品&#xff08;如新华字典&#xff09;设计指标进行降权 2.1. 问题背景 普适性强的物品&#xff08;如新华字典&#xff09;在推荐系统或搜索排序中可能频繁出现…...

ZYNQ的cache原理与一致性操作

在Xilinx Zynq SoC中&#xff0c;Cache管理是确保处理器与外部设备&#xff08;如FPGA逻辑、DMA控制器&#xff09;之间数据一致性的关键。Zynq的ARM Cortex-A9处理器包含L1 Cache&#xff08;指令/数据&#xff09;和L2 Cache&#xff0c;其刷新&#xff08;Flush/Invalidate&…...

安装React开发者工具

我们在说组件之前&#xff0c;需要先安装一下React官方推出的开发者工具&#xff0c;首先我们分享在线安装方式 首先打开谷歌网上应用商店(针对谷歌浏览器)&#xff0c;在输入框内搜索react&#xff0c;安装如下插件&#xff1a; 注意安装提供方为Facebook的插件&#xff0c;这…...

多层感知机

多层感知机&#xff08;Multilayer Perceptron&#xff0c;简称 MLP&#xff09;是一种基于前馈神经网络&#xff08;Feedforward Neural Network&#xff09;的深度学习模型&#xff0c;由多个神经元层组成&#xff0c;每一层与前一层全连接。它包括至少一个隐藏层&#xff08…...

2025年渗透测试面试题总结- PingCAP安全工程师(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 PingCAP安全工程师 一、SQL注入判断数据库类型技术分析 1. 常规判断方法 2. 盲注场景下的判断 3. 补…...

CAD模型导入Geant4

CADMesh是一个开源项目&#xff0c;专门用于将STL格式的CAD模型导入Geant4。以下是使用CADMesh操作STL模型的步骤&#xff1a; 准备工作 下载CADMesh开源代码&#xff1a;可以从GitHub或Gitee下载CADMesh的开源代码。 将CAD模型转换为STL格式&#xff1a;在CAD软件中创建几何…...

DeepSORT 目标追踪算法详解

DeepSORT&#xff08;Deep Simple Online and Realtime Tracking&#xff09;是 多目标追踪&#xff08;MOT&#xff09; 领域的经典算法&#xff0c;通过结合目标检测、运动预测和外观特征匹配&#xff0c;实现了高效、稳定的实时追踪。其核心思想是通过 检测驱动追踪&#xf…...

mne溯源后的数据初步处理方法

文章目录 导入库 Yeo2011_7Networks_N1000绘制一些圆球来代表区域大小和强度 单网络绘制和扩展的方式AI补充一下背景知识&#x1f4da; **背景与研究来源**&#x1f9e0; **7 个功能网络的定义**&#x1f4c2; **标签数据获取**&#x1f50d; **标签文件内容解析**&#x1f6e0…...

基于STM32进行FFT滤波并计算插值DA输出

文章目录 一、前言背景二、项目构思1. 确定FFT点数、采样率、采样点数2. 双缓存设计 三、代码实现1. STM32CubeMX配置和HAL库初始化2. 核心代码 四、效果展示和后话五、项目联想与扩展1. 倍频2. 降频3. 插值3.1 线性插值3.2 样条插值 一、前言背景 STM32 对 AD 采样信号进行快…...

【用 Trace读源码】PlanAgent 执行流程

前提条件 在 Trae 中打开 OpenManus 工程&#xff0c;使用 build 模式&#xff0c;模型选择 claude-sonnet-3.7 提示词 分析 agent/planning.py 中 main 方法及相关类的执行流程&#xff0c;以流程图的方式展示PlanningAgent 执行流程图 以下流程图展示了 PlanningAgent 类…...

AI代码编辑器:Cursor和Trae

Cursor 定义&#xff1a;Cursor 是一款基于AI的代码编辑器&#xff0c;它继承了VS Code的核心功能&#xff0c;并在此基础上增加了深度AI支持。它支持代码生成、优化、重构以及调试等功能&#xff0c;提供直观的Diff视图和自动补全功能&#xff0c;是一款功能强大的编程工具。…...

LSM-Tree(Log-Structured Merge-Tree)详解

1. 什么是 LSM-Tree? LSM-Tree(Log-Structured Merge-Tree)是一种 针对写优化的存储结构,广泛用于 NoSQL 数据库(如 LevelDB、RocksDB、HBase、Cassandra)等系统。 它的核心思想是: 写入时只追加写(Append-Only),将数据先写入内存缓冲区(MemTable)。内存数据满后…...

介绍一个测试boostrap表格插件的好网站!

最近在开发一个物业管理系统。用到bootstrap的表格插件bootstrap table&#xff0c;官方地址&#xff1a; https://bootstrap-table.com/ 因为是英文界面&#xff0c;对国人不是很友好。后来发现了IT小书童网站 IT小书童 - 为程序员提供优质教程和文档 网站&#xff1a; IT…...

虚拟路由与单页应用(SPA):详解

在单页应用&#xff08;SPA&#xff0c;Single Page Application&#xff09;中&#xff0c;虚拟路由&#xff08;也称为前端路由&#xff09;是一种关键的技术&#xff0c;用于管理页面导航和状态变化&#xff0c;而无需重新加载整个页面。为了帮助你更好地理解这一概念&#…...

基于树莓派3B+的人脸识别实践:Python与C联合开发

基于树莓派3B的人脸识别实践&#xff1a;Python与C联合开发 引言 树莓派因其小巧的体积和丰富的扩展性&#xff0c;成为嵌入式开发的理想平台。本文将分享如何通过Python与C语言联合开发&#xff0c;在树莓派3B上实现从硬件控制、摄像头拍照到百度API人脸比对的完整流程。项目…...

尝试使用Tauri2+Django+React项目(2)

前言 尝试使用tauri2DjangoReact的项目-CSDN博客https://blog.csdn.net/qq_63401240/article/details/146403103在前面笔者不知道怎么做&#xff0c;搞了半天 笔者看到官网&#xff0c;原来可以使用二进制文件&#xff0c;好好好 嵌入外部二进制文件 | Taurihttps://v2.taur…...

Qt桌面客户端跨平台开发实例

在Windows平台上&#xff0c;桌面客户端软件通常使用C/C语言和Qt跨平台开发框架进行开发。因此&#xff0c;大部分代码可以运行于不同平台环境&#xff0c;但是程序运行依赖的三方库以及代码中一些平台相关的头文件和接口需要进行平台兼容。本文以windows桌面端应用迁移到Linux…...

c++进阶之------红黑树

一、概念 红黑树&#xff08;Red-Black Tree&#xff09;是一种自平衡二叉查找树&#xff0c;它在计算机科学的许多领域中都有广泛应用&#xff0c;比如Java中的TreeMap和C中的set/map等数据结构的底层实现。红黑树通过在每个节点上增加一个颜色属性&#xff08;红色或黑色&am…...

政安晨【超级AI工作流】—— 使用Dify通过工作流对接ComfyUI实现多工作流协同

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 目录 一、准备工作 Dify跑起来 ollama局域网化配置 Dify配置并验证 启动ComfyUI 二、…...

javaweb开发以及部署

先说一个阿里云学生无门槛免费领一年2核4g服务器的方法&#xff1a; 阿里云服务器学生无门槛免费领一年2核4g_阿里云学生认证免费服务器-CSDN博客 Java Web开发是使用Java编程语言开发Web应用程序的过程&#xff0c;通常涵盖了使用Java EE&#xff08;Java Enterprise Edition…...

树莓派5介绍与系统安装

简介 Raspberry Pi 5采用运行频率为2.4GHz的64位四核Arm Cortex-A76处理器&#xff0c;与Raspberry Pi 4相比&#xff0c; CPU性能提高了2至3倍。此外&#xff0c;它还配备了一个800MHz的VideoCore VII GPU&#xff0c;可以提供大幅度的图形 性能提升&#xff0c;通过HDMI实现…...

菜鸟之路Day25一一前端工程化(二)

菜鸟之路Day25一一前端工程化&#xff08;二&#xff09; 作者&#xff1a;blue 时间&#xff1a;2025.3.19 文章目录 菜鸟之路Day25一一前端工程化&#xff08;二&#xff09;1.概述2.Element快速入门3.综合案例一.布局二.组件三.Axios异步加载数据1. 生命周期钩子概述2. mo…...

vue如何获取 sessionStorage的值,获取token

// 使用Axios发送请求并处理下载 import axios from axios;const handleDownload () > {const params {warehouseId: selectedWarehouseId.value};const apiUrl /api/materials/wmMatCheck/export-wmMatCheckDetail;axios.get(apiUrl, {params,responseType: blob, // 接…...

图解AUTOSAR_CP_DiagnosticLogAndTrace

AUTOSAR 诊断日志和跟踪(DLT)模块详解 AUTOSAR 经典平台中的诊断和调试关键组件 目录 1. 概述2. DLT模块架构 2.1 模块位置2.2 内部组件2.3 接口定义 3. DLT操作流程 3.1 初始化流程3.2 日志和跟踪消息处理3.3 控制命令处理 4. 数据结构与配置模型 4.1 配置类4.2 消息格式4.3 …...

微调实战 - 使用 Unsloth 微调 QwQ 32B 4bit (单卡4090)

本文参考视频教程&#xff1a;赋范课堂 – 只需20G显存&#xff0c;QwQ-32B高效微调实战&#xff01;4大微调工具精讲&#xff01;知识灌注问答风格微调&#xff0c;DeepSeek R1类推理模型微调Cot数据集创建实战打造定制大模型&#xff01; https://www.bilibili.com/video/BV1…...