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

使用Python和Selenium打造一个全网页截图工具

无论是归档网站、测试页面设计,还是为报告记录网页内容,一个可靠的截图工具都能大大提升效率。本文将介绍如何使用Python、Selenium和wxPython构建一个用户友好的网页截图工具。该工具能在浏览器中显示网页,自动平滑滚动到底部以触发懒加载内容,并将整个网页截图保存为PNG文件。

C:\pythoncode\new\webpage_screenshot.py

为什么需要一个网页截图工具?

现代网页通常是动态的,会随着用户滚动加载内容(即懒加载)。传统的截图方法只能捕获可见区域,可能会遗漏动态加载的内容。我们的工具解决了以下问题:

  • 显示网页:通过可见的浏览器窗口,让用户可以看到网页加载和滚动的过程。
  • 平滑滚动:自动以平滑动画滚动到底部,确保所有懒加载内容都加载完成。
  • 完整截图:捕获整个网页,包括超出视口的部分。
  • 用户友好界面:提供图形界面,方便输入URL、选择保存路径,并显示进度反馈。

使用技术

  • Python:核心编程语言,用于编写工具逻辑。
  • Selenium:浏览器自动化框架,用于控制Chrome浏览器并捕获截图。
  • wxPython:用于创建跨平台的图形用户界面(GUI)。
  • ChromeDriver:Chrome的WebDriver,通过webdriver_manager自动管理。

工作原理

该工具基于wxPython构建,提供简单的图形界面。用户输入网页URL,选择保存路径,点击按钮即可开始截图。以下是工作流程:

1. 用户界面

工具使用wxPython创建了一个简洁的GUI,包含以下组件:

  • URL输入框:用户输入目标网页的URL(若无http://https://前缀,自动添加https://)。
  • 保存路径选择:允许用户选择截图保存的文件夹,默认路径为用户的“图片”文件夹。
  • 截图按钮:触发网页加载和截图过程。
  • 进度条:实时显示滚动和截图进度。
  • 状态栏:显示当前操作状态(如“正在加载网页”或“截图已保存”)。

2. 网页加载与滚动

  • 非无头模式:工具使用Selenium控制Chrome浏览器,并以可见窗口运行(移除--headless选项),让用户看到网页的加载和滚动过程。
  • 平滑滚动:通过JavaScript的window.scrollTo方法实现平滑滚动(behavior: 'smooth'),每次滚动一小段(基于页面高度和视口高度计算步数),并暂停0.5秒以确保内容加载。
  • 进度反馈:滚动过程中,进度条根据滚动步数更新,增强用户体验。

3. 截图捕获

  • CDP方法:使用Chrome DevTools Protocol(CDP)的Page.captureScreenshot方法,一次性捕获整个网页(captureBeyondViewport: True),无需拼接。
  • 保存为PNG:截图以PNG格式保存,文件名为{域名}_{时间戳}.png,例如example.com_20250516_194023.png

4. 错误处理

  • 验证URL和保存路径的有效性,若无效则弹出提示。
  • 捕获所有异常,确保浏览器在错误发生时正确关闭,并通过弹窗和状态栏向用户反馈详细错误信息。

代码实现

以下是核心代码片段,展示了滚动和截图逻辑:

import wx
import os
import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
import base64
from urllib.parse import urlparse
import threadingclass ScreenshotApp(wx.Frame):def __init__(self, parent, title):super(ScreenshotApp, self).__init__(parent, title=title, size=(600, 300))self.InitUI()self.Centre()self.Show()def InitUI(self):panel = wx.Panel(self)vbox = wx.BoxSizer(wx.VERTICAL)# URL输入区域url_box = wx.BoxSizer(wx.HORIZONTAL)url_label = wx.StaticText(panel, label="网页URL:")self.url_text = wx.TextCtrl(panel, size=(400, -1))url_box.Add(url_label, flag=wx.RIGHT | wx.ALIGN_CENTER_VERTICAL, border=8)url_box.Add(self.url_text, proportion=1)# 保存路径区域path_box = wx.BoxSizer(wx.HORIZONTAL)path_label = wx.StaticText(panel, label="保存路径:")self.path_text = wx.TextCtrl(panel, size=(300, -1))browse_button = wx.Button(panel, label="浏览...")path_box.Add(path_label, flag=wx.RIGHT | wx.ALIGN_CENTER_VERTICAL, border=8)path_box.Add(self.path_text, proportion=1, flag=wx.RIGHT, border=5)path_box.Add(browse_button)# 截图按钮screenshot_button = wx.Button(panel, label="截取网页")# 进度条self.progress_bar = wx.Gauge(panel, range=100, size=(400, 20))self.progress_bar.SetValue(0)# 状态显示区域self.status_text = wx.StaticText(panel, label="")# 添加到垂直布局vbox.Add((-1, 20))vbox.Add(url_box, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=10)vbox.Add((-1, 20))vbox.Add(path_box, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=10)vbox.Add((-1, 30))vbox.Add(screenshot_button, flag=wx.ALIGN_CENTER)vbox.Add((-1, 20))vbox.Add(self.progress_bar, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=10)vbox.Add((-1, 10))vbox.Add(self.status_text, flag=wx.ALIGN_CENTER)# 绑定事件browse_button.Bind(wx.EVT_BUTTON, self.OnBrowse)screenshot_button.Bind(wx.EVT_BUTTON, self.OnScreenshot)# 设置默认保存路径为用户的图片文件夹default_path = os.path.join(os.path.expanduser("~"), "Pictures")self.path_text.SetValue(default_path)panel.SetSizer(vbox)def OnBrowse(self, event):dialog = wx.DirDialog(self, "选择保存截图的文件夹", style=wx.DD_DEFAULT_STYLE)if dialog.ShowModal() == wx.ID_OK:self.path_text.SetValue(dialog.GetPath())dialog.Destroy()def OnScreenshot(self, event):url = self.url_text.GetValue().strip()save_path = self.path_text.GetValue().strip()# 验证URLif not url:wx.MessageBox("请输入有效的URL", "错误", wx.OK | wx.ICON_ERROR)return# 如果URL没有http前缀,添加https://if not url.startswith(('http://', 'https://')):url = 'https://' + urlself.url_text.SetValue(url)# 验证保存路径if not os.path.exists(save_path):try:os.makedirs(save_path)except Exception as e:wx.MessageBox(f"创建保存路径失败: {str(e)}", "错误", wx.OK | wx.ICON_ERROR)returnself.status_text.SetLabel("正在加载网页并滚动,请稍候...")self.progress_bar.SetValue(0)self.Layout()# 使用线程避免界面冻结thread = threading.Thread(target=self.take_screenshot, args=(url, save_path))thread.daemon = Truethread.start()def scroll_page(self, driver):"""滚动页面以触发所有懒加载内容,显示滚动效果"""total_height = driver.execute_script("return document.body.scrollHeight")viewport_height = driver.execute_script("return window.innerHeight")steps = max(1, total_height // viewport_height)  # 计算滚动步数step_height = total_height / stepsfor i in range(steps + 1):scroll_position = int(i * step_height)driver.execute_script(f"window.scrollTo({{top: {scroll_position}, behavior: 'smooth'}});")wx.CallAfter(self.progress_bar.SetValue, int((i + 1) / (steps + 1) * 100))time.sleep(0.5)  # 等待平滑滚动和内容加载time.sleep(1)  # 确保所有内容加载完成def take_screenshot(self, url, save_path):try:# 设置Chrome选项,移除无头模式以显示浏览器chrome_options = Options()chrome_options.add_argument("--disable-gpu")chrome_options.add_argument("--disable-infobars")chrome_options.add_argument("--disable-extensions")chrome_options.add_argument("--window-size=1920,1080")  # 设置初始窗口大小# 启动浏览器service = Service(ChromeDriverManager().install())driver = webdriver.Chrome(service=service, options=chrome_options)# 访问网页driver.get(url)time.sleep(3)  # 等待页面初始加载# 滚动页面以触发懒加载内容self.scroll_page(driver)# 获取域名和时间戳domain = urlparse(url).netloc or "webpage"timestamp = time.strftime("%Y%m%d_%H%M%S")# 使用CDP方法获取完整页面截图result = driver.execute_cdp_cmd('Page.captureScreenshot', {'format': 'png', 'captureBeyondViewport': True})image_data = base64.b64decode(result['data'])save_file = os.path.join(save_path, f"{domain}_{timestamp}.png")with open(save_file, 'wb') as f:f.write(image_data)driver.quit()wx.CallAfter(self.screenshot_complete, save_file)except Exception as e:if 'driver' in locals():driver.quit()wx.CallAfter(self.screenshot_error, str(e))def screenshot_complete(self, filepath):self.status_text.SetLabel(f"截图已保存至: {filepath}")self.progress_bar.SetValue(100)wx.MessageBox(f"截图已保存至:\n{filepath}", "成功", wx.OK | wx.ICON_INFORMATION)def screenshot_error(self, error_msg):self.status_text.SetLabel(f"截图失败: {error_msg}")self.progress_bar.SetValue(0)wx.MessageBox(f"截图失败: {error_msg}", "错误", wx.OK | wx.ICON_ERROR)if __name__ == '__main__':app = wx.App()ScreenshotApp(None, title='网页截图工具')app.MainLoop()

安装与运行

环境要求

  • Python 3.8+
  • 依赖库:pip install wxPython selenium webdriver_manager

运行步骤

  1. 安装依赖库。
  2. 运行代码,打开GUI窗口。
  3. 输入网页URL(如example.com)。
  4. 选择保存路径(或使用默认路径)。
  5. 点击“截取网页”,观察浏览器打开、平滑滚动并截图。
  6. 截图完成后,查看保存的PNG文件。

优势与局限性

优势

  • 直观体验:可见的浏览器窗口和进度条让用户清楚操作进程。
  • 完整截图:支持动态网页,确保捕获所有内容。
  • 易用性:简单的GUI适合非技术用户。
  • 跨平台:wxPython和Selenium支持Windows、macOS和Linux。

局限性

  • 性能:对于超长网页,滚动和加载可能需要较长时间。
  • 依赖性:需要安装Chrome浏览器和ChromeDriver。
  • CDP限制:某些Chrome版本可能不支持CDP截图(可回退到拼接方法)。

运行结果

相关文章:

使用Python和Selenium打造一个全网页截图工具

无论是归档网站、测试页面设计,还是为报告记录网页内容,一个可靠的截图工具都能大大提升效率。本文将介绍如何使用Python、Selenium和wxPython构建一个用户友好的网页截图工具。该工具能在浏览器中显示网页,自动平滑滚动到底部以触发懒加载内…...

自动化脚本开发:Python调用云手机API实现TikTok批量内容发布

在2025年的技术生态下,通过Python实现TikTok批量内容发布的自动化脚本开发需结合云手机API调用、TikTok开放接口及智能调度算法。以下是基于最新技术实践的系统化开发方案: 一、云手机环境配置与API对接 云手机平台选择与API接入 推荐使用比特云手机或丁…...

React Hooks 必须在组件最顶层调用的原因解析

文章目录 前言一、Hooks 的基本概念二、Hooks 的调用规则三、为什么 Hooks 必须在最顶层调用?1. 维护 Hooks 的调用顺序2. 闭包与状态关联3. 实现细节:Hook 的链表结构 四、违反规则的后果五、如何正确使用 Hooks六、示例:正确与错误的用法对…...

西门子 Teamcenter13 Eclipse RCP 开发 1.2 工具栏 开关按钮

西门子 Teamcenter13 Eclipse RCP 开发 1.2 工具栏 开关按钮 1 配置文件2 插件控制3 命令框架 位置locationURI备注菜单栏menu:org.eclipse.ui.main.menu添加到传统菜单工具栏toolbar:org.eclipse.ui.main.toolbar添加到工具栏 style 值含义显示效果push普通按钮(默…...

5.27本日总结

一、英语 复习list2list29 二、数学 学习14讲部分内容 三、408 学习计组1.2内容 四、总结 高数和计网明天结束当前章节,计网内容学完之后主要学习计组和操作系统 五、明日计划 英语:复习lsit3list28,完成07年第二篇阅读 数学&#…...

【持续更新中】架构面试知识学习总结

1.分库分表出现冗余数据: ☆分库分表方法:水平和垂直(业务场景,数据关联性。逻辑要调查清楚) 垂直:将一个表(库)按照列的业务相关性进行拆分,把经常一起使用的列放在一张表(库)&…...

文字溢出省略号显示

一、 单行文字溢出、省略号显示 二、 多行文字溢出,省略号显示 有较大的兼容性问题,适用于Webkit为内核的浏览器软件,或者移动端的(大部分也是webkit) 此效果建议后端人员开发 三、图片底侧空白缝隙的修复技巧&#…...

力扣-283-移动零

1.题目描述 2.题目链接 283. 移动零 - 力扣&#xff08;LeetCode&#xff09; 3.题目代码 class Solution {public void moveZeroes(int[] nums) {int dest-1;int cur0;while(cur<nums.length){if(nums[cur]0){cur;}else if(nums[cur]!0){swap(nums,cur,dest1);cur;dest…...

【001】RenPy打包安卓apk 流程源码级别分析

1. 入口在下图 2. SDK版本及代码入口 &#xff08;renpy-8.3.7-sdk&#xff09; 由于SDK一直在升级&#xff0c;本文采用 标题中的版本进行分析&#xff0c;整体逻辑变化不太大。 实际执行逻辑是调用的rapt 2.1 点击按钮实际执行逻辑 def AndroidIfState(state, needed, acti…...

机器学习-人与机器生数据的区分模型测试-数据处理 - 续

这里继续 机器学习-人与机器生数据的区分模型测试-数据处理1的内容 查看数据 中1的情况 #查看数据1的分布情况 one_ratio_list [] for col in data.columns:if col city or col target or col city2: # 跳过第一列continueelse:one_ratio data[col].mean() # 计算1值占…...

计算机视觉与深度学习 | Python实现EMD-VMD-LSTM时间序列预测(完整源码和数据)

EMD-VMD-LSTM 一、完整代码实现二、代码结构解析三、关键参数说明四、性能优化建议五、工业部署方案以下是用Python实现EMD-VMD-LSTM时间序列预测的完整代码,结合经验模态分解(EMD)、变分模态分解(VMD)与LSTM深度学习模型,适用于复杂非平稳信号的预测任务。代码包含数据生…...

数据结构与算法——双向链表

双向链表 定义链表分类双向链表&#xff1a;带头双向循环链表 初始化打印尾插头插尾删头删查找在pos(指定位置)之后插入结点在pos(指定位置)之前插入结点删除pos(指定位置)的结点销毁顺序表与链表的分析 定义 链表分类 单向和双向 带头和不带头 带头是指存在一个头结点&…...

.NET 中管理 Web API 文档的两种方式

前言 在 .NET 开发中管理 Web API 文档是确保 API 易用性、可维护性和一致性的关键。今天大姚给大家分享两种在 .NET 中管理 Web API 文档的方式&#xff0c;希望可以帮助到有需要的同学。 Swashbuckle Swashbuckle.AspNetCore 是一个流行的 .NET 库&#xff0c;它使得在 AS…...

混合学习:Bagging与Boosting的深度解析与实践指南

引言 在机器学习的世界里&#xff0c;模型的性能优化一直是研究的核心问题。无论是分类任务还是回归任务&#xff0c;我们都希望模型能够在新的数据上表现出色&#xff0c;即具有良好的泛化能力。然而&#xff0c;实际应用中常常遇到模型过拟合&#xff08;高方差&#xff09;…...

基于大疆Mini 3无人机和指定软件工具链的完整3D建模工作

基于大疆Mini 3无人机和指定软件工具链的完整3D建模工作流程关键步骤&#xff1a; 1. 无人机航拍准备 • 设备检查&#xff1a;确保大疆 Mini 3 电量充足&#xff0c;相机设置为 RAW 格式&#xff08;便于后期调色&#xff09;&#xff0c;关闭自动白平衡。 • 飞行规划&…...

开源项目实战学习之YOLO11:12.1 ultralytics-models-sam-blocks.py源码

👉 点击关注不迷路 👉 点击关注不迷路 👉 另外,前些天发现了一个巨牛的AI人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。感兴趣的可以点击相关跳转链接。 点击跳转到网站。 ultralytics-models-sam 1.sam-modules-__init__.py2.sam-modules-blocks.pybl…...

3D个人简历网站 5.天空、鸟、飞机

1.显示天空 models下新建文件Sky.jsx Sky.jsx // 从 React 库中导入 useRef 钩子&#xff0c;用于创建可变的 ref 对象 import { useRef } from "react"; // 从 react-three/drei 库中导入 useGLTF 钩子&#xff0c;用于加载 GLTF 格式的 3D 模型 import { useGLT…...

蓝桥杯-不完整的算式

问题描述 小蓝在黑板上写了一个形如 AopBCAopBC 的算式&#xff0c;其中 AA、BB、CC 都是非负整数&#xff0c;opop 是 、-、*、/、-、*、/&#xff08;整除&#xff09;四种运算之一。不过 AA、opop、BB、CC 这四部分有一部分被不小心的同学擦掉了。 给出这个不完整的算式&a…...

【Python 算法零基础 3.递推】

压抑与痛苦&#xff0c;那些辗转反侧的夜&#xff0c;终会让我们更加强大 —— 25.5.16 一、递推的概念 递推 —— 递推最通俗的理解就是数列&#xff0c;递推和数列的关系就好比 算法 和 数据结构 的关系&#xff0c;数列有点像数据结构中的线性表(可以是顺序表&#xff0c;也…...

计算机视觉与深度学习 | Matlab实现EMD-LSTM和LSTM时间序列预测对比(完整源码和数据)

EMD-LSTM与LSTM 一、数据生成与预处理二、经验模态分解(EMD)三、数据预处理四、模型构建与训练1. 单一LSTM模型2. EMD-LSTM混合模型五、预测与结果对比1. 单一LSTM预测2. EMD-LSTM预测3. 性能评估六、结果可视化七、完整代码说明八、典型输出结果九、改进方向以下是用MATLAB实…...

【爬虫】DrissionPage-6

官方文档: https://www.drissionpage.cn/browser_control/visit https://www.drissionpage.cn/browser_control/page_operation 1. Tab 对象概述 Tab 对象 是 DrissionPage 中用于控制浏览器标签页的主要单位。每个 Tab 对象对应一个浏览器标签页&#xff0c;负责执行各种网页…...

C/C++实践(十)C语言冒泡排序深度解析:发展历史、技术方法与应用场景

一、发展历史 冒泡排序&#xff08;Bubble Sort&#xff09;作为计算机科学领域最基础的排序算法之一&#xff0c;其历史可追溯至计算机编程的早期阶段。尽管具体起源时间难以考证&#xff0c;但它在20世纪50年代至60年代间被广泛讨论和应用。冒泡排序的名称来源于其独特的排序…...

git提交库常用词

新功能 feat修改BUG fix文档修改 docs格式修改 style重构 refactor性能提升 perf测试 test构建系统 build对CI配置文件修改 ci修改构建流程、或增加依赖库、工具 chore回滚版本 revert...

结构化思考力_第一章_明确理念打基础

接收信息的3个步骤 1. 梳理&#xff1a;观点、理由、事实和数据&#xff1b; 2. 画3这的结构图 3. 一句话概括 可套用固定格式。在——的基础上&#xff0c;从——、——、——N个方面&#xff0c;说明了————。 一句话概括主要内容的前提是&#xff0c;一定是结构非常…...

【C语言练习】046. 编写插入排序算法

046. 编写插入排序算法 046. 编写插入排序算法C语言实现插入排序代码说明示例运行输入:输出:插入排序的特点一、插入排序的适用场景二、C语言代码示例及分步讲解代码实现代码解析三、示例执行过程四、性能分析五、总结046. 编写插入排序算法 插入排序(Insertion Sort)是一…...

Kotlin与机器学习实战:Android端集成TensorFlow Lite全指南

本文将手把手教你如何在Android应用中集成TensorFlow Lite模型&#xff0c;实现端侧机器学习推理能力。我们以图像分类场景为例&#xff0c;提供可直接运行的完整代码示例。 环境准备 1. 开发环境要求 Android Studio Arctic Fox以上版本AGP 7.0Kotlin 1.6Minimum SDK 21 2.…...

【Linux笔记】nfs网络文件系统与autofs(nfsdata、autofs、autofs.conf、auto.master)

一、nfs概念 NFS&#xff08;Network File System&#xff0c;网络文件系统&#xff09; 是一种由 Sun Microsystems 于1984年开发的分布式文件系统协议&#xff0c;允许用户通过网络访问远程计算机上的文件&#xff0c;就像访问本地文件一样。它广泛应用于 Unix/Linux 系统&a…...

Redis持久化机制详解:保障数据安全的关键策略

在现代应用开发中&#xff0c;Redis作为高性能的内存数据库被广泛使用。然而&#xff0c;内存的易失性特性使得持久化成为Redis设计中的关键环节。本文将全面剖析Redis的持久化机制&#xff0c;包括RDB、AOF以及混合持久化模式&#xff0c;帮助开发者根据业务需求选择最适合的持…...

经典算法 求C(N, K) % mod,保证mod是质数

求C(N, K) % mod&#xff0c;保证mod是质数 问题描述 给你三个整数N,K,mod保证mod是一个质数&#xff0c;求组合数C(N, K) % mod。 输入描述 输入有多组&#xff0c;输入第一行为两个整数T&#xff0c;mod。接下来2 - T 1行&#xff0c;每行输入N&#xff0c; K。 输出描…...

NY309NY318美光科技颗粒NY319NY320

NY309NY318美光科技颗粒NY319NY320 技术解析&#xff1a;架构创新与性能突围 美光科技的NY系列颗粒&#xff08;如NY309、NY318、NY319、NY320&#xff09;延续了其在存储技术领域的创新基因。以NY319为例&#xff0c;其采用16层BiCS3 3D NAND工艺&#xff0c;通过浮栅&#…...

Buildroot 移植MiniGUI: 编写简单示例(基于君正X2000)

概述 上一篇文章: Buildroot 移植MiniGUI, 在编译打包完文件系统后, 编写一个Demo进一步验证MiniGUI的功能. 目标平台: 键值CPUX2000架构mips内存128MB存储256MBLCD600*1024 MiniGUI 的三种运行模式 在编写第一个 MiniGUI 程序之前&#xff0c;需要了解如下事实&#xff1…...

flutter长列表 ListView、GridView、SingleChildScrollView、CustomScrollView区别

组件名称用途/适合场景是否懒加载支持列表结构用法复杂度SingleChildScrollView适用于内容数量不大、不重复的页面&#xff08;如表单、静态内容&#xff09;❌ 否❌ 否⭐⭐ListView适用于垂直方向的长列表&#xff0c;自动滚动&#xff1b;适合展示大量数据✅ 支持✅ 是⭐⭐Li…...

OpenCV透视变换

概念 OpenCV 透视变换是将图像从一个视平面投影到另一个视平面的过程&#xff0c;也叫投影映射 &#xff0c;属于空间立体三维变换。它基于透视原理&#xff0c;通过 33 的变换矩阵作用于图像像素坐标来实现映射转换 &#xff0c;能模拟人眼或相机镜头观看三维空间物体时的透视…...

Node.js 实战四:数据库集成最佳实践

你写了个登录接口&#xff0c;用上了 JWT&#xff1b;然后&#xff0c;产品来了句&#xff1a; “用户数据能分页查吗&#xff1f;能关联公司信息吗&#xff1f;我们这边还有多语言字段…” 你发现&#xff1a;SQL 写得越来越长&#xff0c;关联越来越绕&#xff0c;字段越来越…...

【JDBC】JDBC概述、历史版本及特征

1_JDBC概述 什么是JDBC JDBC&#xff08;Java DataBase Connectivity, Java数据库连接&#xff09; ,是一种用于执行SQL语句的Java API&#xff0c;为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成 有了JDBC&#xff0c;程序员只需用JDBC API写一个程序…...

redis的pipline使用结合线程池优化实战

文章目录 代码讲解与事务 (MULTI/EXEC) 的区别在你这段代码里的价值可能的坑实战建议 代码 /*** 批量根据用户 ID 查询用户信息** param findUsersByIdsReqDTO* return*/Overridepublic Response<List<FindUserByIdRspDTO>> findByIds(FindUsersByIdsReqDTO findUs…...

【RabbitMQ】整合 SpringBoot,实现工作队列、发布/订阅、路由和通配符模式

文章目录 工作队列模式引入依赖配置声明生产者代码消费者代码 发布/订阅模式引入依赖声明生产者代码发送消息 消费者代码运行程序 路由模式声明生产者代码消费者代码运行程序 通配符模式声明生产者代码消费者代码运行程序 工作队列模式 引入依赖 我们在创建 SpringBoot 项目的…...

MySQL初阶:sql事务和索引

索引&#xff08;index&#xff09; 可以类似理解为一本书的目录&#xff0c;一个表可以有多个索引。 索引的意义和代价 在MySQL中使用select进行查询时会经过&#xff1a; 1.先遍历表 2.将条件带入每行记录中进行判断&#xff0c;看是否符合 3.不符合就跳过 但当表中的…...

使用教程:8x16模拟开关阵列可级联XY脚双向导通自动化接线

以下通过点亮LED进行基本使用流程演示&#xff0c;实际可以连接复杂外设&#xff08;SPI、CAN、ADC等&#xff09; 单模块使用 RX、TX、5V和GND接到串口模块&#xff1b;X5接5V&#xff1b;Y2接LED;LED-接GND 串口模块插上电脑后&#xff0c;LED没有亮&#xff1b;因为此时模…...

很啰嗦,再次总结 DOM

DOM (文档对象模型) 详解 一、DOM 基础概念 1. 定义与作用 DOM&#xff08;Document Object Model&#xff09;即文档对象模型&#xff0c;是一种用于 HTML 和 XML 文档的编程接口。它将文档解析为一个由节点和对象组成的树状结构&#xff0c;允许程序和脚本动态访问、修改文…...

文件读取漏洞路径与防御总结

文件读取漏洞路径与防御总结 文件读取漏洞允许攻击者通过路径遍历等手段访问未授权的文件。以下是Linux和Windows系统中常见敏感路径的归纳及防御建议&#xff1a; Linux 系统常见敏感路径 系统关键文件&#xff1a; /etc/passwd&#xff1a;用户账户信息&#xff08;可被用来…...

电池的充放电电流中C的含义

充电电池的充放电电流标注为 -0.2C、1C、2C 等参数时&#xff0c;其含义与电池的容量和充放电速率直接相关。以下是详细解释&#xff1a; 1. 什么是 “C” 值&#xff1f; • C 是电池的 额定容量&#xff08;Capacity&#xff09; 的缩写&#xff0c;单位为 Ah&#xff08;安时…...

文章记单词 | 第91篇(六级)

一&#xff0c;单词释义 stride /straɪd/- v. 大步走&#xff1b;跨越&#xff1b;迈进 /n. 大步&#xff1b;进展&#xff1b;步幅diplomatic /ˌdɪpləˈmtɪk/- adj. 外交的&#xff1b;有手腕的conquer /ˈkɒŋkə(r)/- v. 征服&#xff1b;战胜&#xff1b;克服geogra…...

Nginx应用场景详解与配置指南

1. 什么是Nginx&#xff1f; Nginx&#xff08;发音为"engine-x"&#xff09;是一个高性能的HTTP和反向代理服务器&#xff0c;也是一个IMAP/POP3/SMTP代理服务器。它以高性能、稳定性、丰富的功能集、简单的配置和低资源消耗而闻名。 2. Nginx的主要应用场景 2.1 …...

【Ubuntu】Waydroid-Linux安卓模拟器安装

✅ 1. 安装 Waydroid sudo apt update sudo apt install curl ca-certificates gnupg git -y curl -s https://repo.waydro.id | sudo bash sudo apt install waydroid -y sudo apt install dbus-x11✅ 2. 初始化 Waydroid 使用普通system版本&#xff1a; sudo waydroid in…...

设计模式 - 单例模式 - Tips

为什么双重检查会带来空指针异常问题&#xff1f; if (instance null) { synchronized (Singleton.class) { if (instance null) { instance new Singleton(); } } …...

设计模式7大原则与UML类图详解

设计模式7大原则与UML类图详解 引言 &#x1f31f; 在软件工程领域&#xff0c;设计模式和UML&#xff08;统一建模语言&#xff09;是提高代码质量、增强系统可维护性的重要工具。设计模式提供了解决软件设计中常见问题的通用方案&#xff0c;而UML则为我们提供了一种可视化的…...

如何分析动态采样引起的计划不稳定 | OceanBase SQL 调优实践

这篇博客涉及两个知识点&#xff0c;一个是动态采样&#xff0c;另一个是 DAS 执行。 用户的问题和相关结论 我们看看用户在OceanBase 社区论坛发帖中提出的疑问及其所得出的结论。 问题&#xff1a;收集统计信息之前&#xff0c;为什么会出现计划不稳定的情况&#xff1f; …...

NY321NY322美光闪存芯片NY323NY336

NY321NY322美光闪存芯片NY323NY336 在存储技术飞速发展的今天&#xff0c;美光科技的闪存芯片凭借其创新架构与高性能表现&#xff0c;已成为工业自动化、智能终端等领域的核心组件。本文将围绕技术解析、产品评测、行业趋势、应用案例及市场动态五大维度&#xff0c;深入探讨…...

HMDB51数据集划分

生成训练集、验证集和测试集 每个split文件应该包含&#xff1a; 训练集(id1): 70个视频测试集(id2): 30个视频未使用(id0): 剩余视频 这是一个70/30的训练/测试分割比例。标记为0的视频被排除在当前实验之外。实际上训练集&#xff08;id1&#xff09;&#xff0c;验证集&am…...