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

网页截图指南

截取网页截图看似是一项简单的任务,但当你真正动手去做的时候,就会发现事情远没有那么容易。我在尝试截取一篇很长的 Reddit 帖子时就深有体会。一开始我以为只要调用 browser.TakeImage() 就万事大吉,结果却陷入了浏览器视口、动态内容加载、内存占用等一系列问题。

在这篇文章中,我将分享从一开始的“想当然”到最后找到高效方案的全过程。我们将以 r/dotnet 子版块为案例,探索常见的陷阱以及如何避免这些问题。看完这篇文章后,你将掌握如何稳定、完整地截取包含动态内容与无限滚动的网页截图的方法。

基础截图方式

我们先从最基础的方法开始:不进行任何特殊处理,直接截取截图。在 DotNetBrowser 中,这非常简单:

var image = browser.TakeImage();
var bitmap = ToBitmap(image);
bitmap.Save("screenshot.png", ImageFormat.Png);

由于 DotNetBrowser 返回的是原始位图,我们需要一个工具方法将其转换为 System.Drawing.Bitmap ,以便进行标准的 .NET 操作:

public static Bitmap ToBitmap(DotNetBrowser.Ui.Bitmap bitmap)
{var width = (int)bitmap.Size.Width;var height = (int)bitmap.Size.Height;var data = bitmap.Pixels.ToArray();var bmp = new Bitmap(width, height, PixelFormat.Format32bppRgb);var bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height),ImageLockMode.WriteOnly, bmp.PixelFormat);Marshal.Copy(data, 0, bmpData.Scan0, data.Length);bmp.UnlockBits(bmpData);return bmp;
}

运行这段代码后,我们得到了第一张截图:

使用 DotNetBrowser 制作的简单屏幕截图

使用 [DotNetBrowser](https://teamdev.cn/dotnetbrowser/?utm_source=csdn&utm_medium=article&utm_campaign=taking-screenshots-of-web-pages) 制作的简单屏幕截图

但问题显而易见:我们只截取了页面的一小部分。

这是因为 TakeImage() 方法仅截取浏览器视口内可见的内容,而默认视口大小并不足以显示整个页面。

截取整页截图

我们需要先获取网页的尺寸,并将浏览器调整为相应大小,然后重新尝试截图。可以通过 JavaScript 获取页面的尺寸,方法是取 documentdocument.documentElement 中较大的那个值:

var widthScript = @"Math.max(document.body.scrollWidth,document.documentElement.scrollWidth)";var heightScript = @"Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)";

然后调整浏览器大小以匹配这些尺寸:

var frame = browser.MainFrame;
var width = frame.ExecuteJavaScript<double>(widthScript).Result;
var height = frame.ExecuteJavaScript<double>(heightScript).Result;browser.Size = new Size((uint)width, (uint)height);
var image = browser.TakeImage();

以下是使用这种改进方法得到的结果:

截图区域变大了,但内容尚未加载完成

截图区域变大了,但内容尚未加载完成。

查看完整图片

紧接着出现了另一个问题:页面并未完全加载。这是因为我们在调整浏览器大小后立即进行了截图,没有给浏览器足够的时间来加载和渲染所有内容。从页面底部的加载指示器可以看出这一点。

让我们填加一个暂停等待时间:

browser.Size = new Size((uint)width, (uint)height);
// 通过反复试验得出的任意数字。
Thread.Sleep(2000);
var image = browser.TakeImage();

再试一次:

包含所有内容的完整截图

包含所有内容的完整截图

查看完整图片

终于,我们得到了一张像样的截图!但位图对象变得相当大,而且 Chromium 需要大量资源来渲染大视口,这在实际应用中并不实用。我们可以做得更好。

截取分段截图

使用之前的方法,浏览器会一次性渲染整个页面,并将结果位图传递给 .NET 进程内存。在处理长页面时,这会迅速耗尽系统资源,尤其是 RAM。

与其尝试一次性截取整个页面,不如我们将其分解为更小、更易管理的部分:

  1. 对页面的各个小段进行多次截图。
  2. 在每次截取之间滚动屏幕。
  3. 将各个部分拼接成最终图像。

以下是实现这种方法的代码:

// Reddit 页面是无限滚动的,因此我们需要设置一个固定的截图次数。
var numberOfShots = 15;
var viewportHeight = 1000;
browser.Size = new Size((uint)Width, (uint)viewportHeight);var capturedHeight = 0;
for (var count = 0; count < numberOfShots; count++)
{capturedHeight += viewportHeight;frame.ExecuteJavaScript($"window.scrollTo(0, {capturedHeight})").Wait();// 为了等待内容加载而设定的任意暂停时间。Thread.Sleep(500);var image = browser.TakeImage();var bitmap = ToBitmap(image);bitmap.Save($"screenshot-{count:D3}.png", ImageFormat.Png);
}

在实际应用中,我们会在另一台服务器上的异步任务中拼接这些片段。但为了简单起见,我们选择直接使用这个辅助函数:

public static Bitmap MergeBitmapsVertically(List<Bitmap> bitmaps)var files = Directory.GetFiles("/path/to/directory", "*.png").OrderBy(Path.GetFileName).ToArray();var images = files.Select(f => Image.FromFile(f)).ToArray();int width = images.Max(img => img.Width);int totalHeight = images.Sum(img => img.Height);using var merged = new Bitmap(width, totalHeight);using (var g = Graphics.FromImage(final)){int y = 0;foreach (var img in images){g.DrawImage(img, 0, y);y += img.Height;}}merged.Save("merged.png");
}

让我们看看结果如何:

合并后的截图片段包含重复元素

合并后的截图片段包含重复元素

查看完整图片

又一个新问题出现了:页眉和导航侧边栏在每张分段截图里重复出现,这显然不是截图应有的样子!

处理固定元素

当我们滚动页面时,像页眉和侧边栏这样的固定元素会保持在原位不动。但在进行分段截图时,我们希望这些固定元素只出现在第一段截图中。

让我们通过 CSS 的 position 属性来找出这些元素,并将它们隐藏起来:

var removeFixedElements = @"(() => {document.querySelectorAll('*').forEach(el => {const pos = getComputedStyle(el).position;if (pos === 'fixed' || pos === 'sticky') {el.style.display = 'none';}});})()";for (var count = 0; count < numberOfShots; count++)
{// 仅从第二张截图开始移除固定元素,// 这样可以保留第一张截图中的页眉和导航栏。if (count == 1) {frame.ExecuteJavaScript(removeFixedElements).Wait();}// 继续进行截图操作。
}

另一个常见的固定元素是 Cookie 同意弹窗。由于每个网站的实现方式都不一样,我们需要逐个页面单独处理。

以 Reddit 为例,我们可以使用以下代码识别并隐藏 Cookie 弹窗:

var removeCookieScreen =@"(() => {const dialog = document.querySelector('reddit-cookie-banner');if (dialog) {dialog.style.display = 'none';}})()";
frame.ExecuteJavaScript(removeCookieScreen).Wait();

最终,我们以节省内存的方式截取了一张合适的网页截图。

一张干净、完整的网页截图

一张干净、完整的网页截图

查看完整图片

总结

最初只是一个简单的 browser.TakeImage() 调用,最后演变成一个需要应对无数细节的复杂解决方案。我们解决了以下挑战:

  • 一次性截取整页内容;
  • 将长页面分段截取并拼接;
  • 处理固定元素和 Cookie 弹窗;
  • 优化内存使用和实用性。

需要说明的是,本文介绍的方法并非放之四海而皆准。每个网页都有其独特之处,而优秀的截图工具之所以强大,正是因为它能处理各种边缘场景。尽管如此,本文所展示的方法已经涵盖了使用 DotNetBrowser 进行网页截图所需掌握的所有核心知识。

相关文章:

网页截图指南

截取网页截图看似是一项简单的任务&#xff0c;但当你真正动手去做的时候&#xff0c;就会发现事情远没有那么容易。我在尝试截取一篇很长的 Reddit 帖子时就深有体会。一开始我以为只要调用 browser.TakeImage() 就万事大吉&#xff0c;结果却陷入了浏览器视口、动态内容加载、…...

作为主动唤醒的节点,ECU上电如何请求通讯

一个ECU如果作为主动唤醒的节点&#xff0c;ECU上电时可以通过以下方式请求通信 如上图所示&#xff0c;ECU在上电后&#xff0c;在OS起来后&#xff0c;可以通过在BSWM模块中完成NvM_ReadAll和相关BSW 模块初始化以及Rte_Start后&#xff0c;这个时候周期性Task已经可以正常调…...

应用服务器Tomcat

启动两给tomcat apache-tomcat-9.0.60\bin——> 启动tomcat startup.bat (Windows) / startup.sh&#xff08;Linux&#xff09; 关闭tomcat shutdown.bat&#xff08;Windows&#xff09;/shutdown.sh &#xff08;Linux&#xff09; 复制一个Tomcat为2&#xff0c;先启…...

【安全】端口保护技术--端口敲门和单包授权

【安全】端口保护技术--端口敲门和单包授权 备注一、端口保护二、端口敲门三、单包授权 备注 2025/05/06 星期二 最近学习了端口保护技术总结一下 一、端口保护 为了保护联网设备的安全&#xff0c;一般会尽量减小暴露的攻击面&#xff0c;开放的端口就是最常见的攻击面&…...

金升阳科技:配套AC/DC砖类电源的高性能滤波器

金升阳推出的FC-L15HB是为我司AC砖类电源配套使用的EMC辅助器。将FC-L15HB加装在金升阳AC/DC砖类电源的前端&#xff0c;可以提高电源产品IEC/EN61000—4系列及CISPR32/EN55032标准的EMC性能。 01 产品优势 &#xff08;1&#xff09;高共差模插入损耗 ①DM&CM&#xff1…...

浅谈 - GPTQ为啥按列量化

前言 曾在游戏世界挥洒创意&#xff0c;也曾在前端和后端的浪潮间穿梭&#xff0c;如今&#xff0c;而立的我仰望AI的璀璨星空&#xff0c;心潮澎湃&#xff0c;步履不停&#xff01;愿你我皆乘风破浪&#xff0c;逐梦星辰&#xff01; 先说结论 GPTQ 按列量化 W&#xff0c;…...

引用第三方自定义组件——微信小程序学习笔记

1. 使用 npm 安装第三方包 1.1 下载安装Node.js 工具 下载地址&#xff1a;Node.js — Download Node.js 1.2 安装 npm 包 在项目空白处右键弹出菜单&#xff0c;选择“在外部终端窗口打开”&#xff0c;打开命令行工具&#xff0c;输入以下指令&#xff1a; 1> 初始化:…...

解决android studio 中gradle 出现task list not built

点击 file 选择settings...

UE5 材质淡入淡出

混合模式选择半透明,灯光照明模式选择Surface TranslucencyVolume...

如何用Java读取PDF

在本文中&#xff0c;我将向您展示如何使用JPedal&#xff08;一个用于转换、打印、查看PDF文件的Java库&#xff09;在Java中读取PDF。 如何在Java中读取PDF文件 • 将JPedal添加到您的类或模块路径中&#xff08;下载试用版jar包&#xff09;。 • 使用JPedal库中的&q…...

tinyrenderer笔记(中)

tinyrenderer个人代码仓库&#xff1a;tinyrenderer个人练习代码 前言 原教程的第 4 课与第 5 课主要介绍了坐标变换的一些知识点&#xff0c;但这一篇文章的内容主要是手动构建 MVP 矩阵&#xff0c;LookAt 矩阵以及原教程涉及到的一些知识点&#xff0c;不是从一个图形学小白…...

人工智能对人类的影响

人工智能对人类的影响 近年来&#xff0c;人工智能&#xff08;AI&#xff09;技术以惊人的速度发展&#xff0c;深刻改变了人类社会的方方面面。从医疗、教育到交通、制造业&#xff0c;AI的应用正在重塑我们的生活方式。然而&#xff0c;这一技术革命也带来了机遇与挑战并存…...

LeetCode 220 存在重复元素 III 题解

LeetCode 220 存在重复元素 III 题解 题目描述 给定一个整数数组 nums 和两个整数 k 和 t&#xff0c;请判断数组中是否存在两个不同的索引 i 和 j&#xff0c;使得&#xff1a; abs(nums[i] - nums[j]) < tabs(i - j) < k 方法思路&#xff1a;桶排序 滑动窗口 核…...

0506--01-DA

36. 单选题 在娱乐方式多元化的今天&#xff0c;“ ”是不少人&#xff08;特别是中青年群体&#xff09;对待戏曲的态度。这里面固然存在 的偏见、难以静下心来欣赏戏曲之美等因素&#xff0c;却也有另一个无法回避的原因&#xff1a;一些戏曲虽然与观众…...

单应性估计

单应性估计是计算机视觉中的核心技术&#xff0c;主要用于描述同一平面在不同视角下的投影变换关系。以下从定义、数学原理、估计方法及应用场景等方面进行综合解析&#xff1a; 一、单应性的定义与核心特性 单应性&#xff08;Homography&#xff09;是射影几何中的概念&…...

Missashe考研日记-day33

Missashe考研日记-day33 1 专业课408 学习时间&#xff1a;2h30min学习内容&#xff1a; 今天开始学习OS最后一章I/O管理的内容&#xff0c;听了第一小节的内容&#xff0c;然后把课后习题也做了。知识点回顾&#xff1a; 1.I/O设备分类&#xff1a;按信息交换单位、按设备传…...

YOLO8之学习指南

一、引言 在计算机视觉领域,目标检测是一项核心任务,其应用范围广泛,涵盖安防监控、自动驾驶、智能医疗等众多领域。YOLO(You Only Look Once)系列算法凭借其高效、快速的特点,在目标检测领域占据重要地位。YOLO8 作为 YOLO 系列的最新版本,进一步提升了检测精度和速度…...

中达瑞和便携式高光谱相机:珠宝鉴定领域的“光谱之眼”

在珠宝行业中&#xff0c;真伪鉴定始终是核心需求。随着合成技术与优化处理手段的日益精进&#xff0c;传统鉴定方法逐渐面临挑战。中达瑞和推出的便携式高光谱相机&#xff0c;凭借其独特的“图谱合一”技术&#xff0c;为珠宝真假鉴定提供了科学、高效且无损的解决方案&#…...

C++自动重连机制设计与实现指南

一、为什么需要自动重连 在网络通信场景中&#xff0c;连接中断是不可避免的常见问题&#xff1a; 网络波动&#xff08;移动网络切换、WiFi信号不稳&#xff09; 服务端维护/重启 中间设备故障&#xff08;路由器、负载均衡器&#xff09; 操作系统资源限制 长时间空闲断…...

昇腾Atlas 200I DK A2 开发者套件无法上网问题的解决

目录 引言 USB WiFi网卡 USB以太网卡 结语 引言 今年通过华为的智能基座项目得到了三个Atlas 200I DK A2 开发者套件&#xff0c;很不幸其中有一块是坏的&#xff0c;其上网部分不能使用&#xff1a;2个RJ45的口在Linux系统内都无法识别&#xff0c;而USB口虽然能够识别&a…...

私有仓库 Harbor、GitLab

gitlab 部署资料 Harbor...

极狐GitLab 如何将项目共享给群组?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 共享项目和群组 (BASIC ALL) 在极狐GitLab 16.10 中&#xff0c;更改为在成员页面的成员选项卡上显示被邀请群组成员&#xf…...

QGIS分割平行四边形

需求&#xff1a;四个点确定的平行四边形的范围&#xff0c;我想把他们均分成20份&#xff0c;然后取质心。 解决方案&#xff1a;找了好几个插件&#xff0c;Polygon Divider、Split Polygon发现不好用&#xff0c;不能满足需求。最终找到了Equalyzer&#xff0c;就是比较麻烦…...

NestJS 的核心构建块有哪些?请简要描述它们的作用(例如,Modules, Controllers, Providers)

NestJS 核心构建块解析&#xff08;Modules、Controllers、Providers&#xff09; NestJS 是一个基于 TypeScript 的渐进式 Node.js 框架&#xff0c;核心设计借鉴了 Angular 的模块化思想。下面从实际开发角度解析它的三大核心构建块&#xff0c;并附代码示例和避坑指南。 一…...

Nginx 安全防护与Https 部署实战

目录 一、核心安全配置 1. 编译安装 Nginx 2. 隐藏版本号 3. 限制危险请求方法 4. 请求限制&#xff08;CC 攻击防御&#xff09; &#xff08;1&#xff09;使用 Nginx 的 limit_req 模块限制请求速率 &#xff08;2&#xff09;压力测试验证 5. 防盗链 二、高级防护 …...

电商双十一美妆数据分析

1. 数据读取与基础查看 库导入&#xff1a;使用 import numpy as np 和 import pandas as pd 导入常用数据分析库。数据读取&#xff1a; df pd.read_csv(双十一_淘宝美妆数据.csv) 读取数据文件。数据查看&#xff1a;通过 df.head() 查看数据前几行&#xff1b; df.info() 了…...

高等数学第六章---定积分(§6.1元素法6.2定积分在几何上的应用1)

本文是关于定积分应用的系列讲解的第一讲&#xff0c;主要介绍元素法的基本思想&#xff0c;并重点讲解如何运用定积分计算平面图形的面积&#xff0c;包括直角坐标系和极坐标系下的情况。 6.1 元素法 曲边梯形的面积回顾 我们首先回顾曲边梯形的面积。设函数 f ( x ) ≥ 0 …...

十分钟了解 @MapperScan

MapperScan 是 MyBatis 和 MyBatis-Plus 提供的一个 Spring Boot 注解&#xff0c;用于自动扫描并注册 Mapper 接口&#xff0c;使其能够被 Spring 容器管理&#xff0c;并与对应的 XML 或注解 SQL 绑定。它的核心作用是简化 MyBatis Mapper 接口的配置&#xff0c;避免手动逐个…...

爬虫程序中如何添加异常处理?

在爬虫程序中添加异常处理是确保程序稳定性和可靠性的关键步骤。异常处理可以帮助你在遇到错误时捕获问题、记录日志&#xff0c;并采取适当的措施&#xff0c;而不是让程序直接崩溃。以下是一些常见的异常处理方法和示例&#xff0c;帮助你在爬虫程序中实现健壮的错误处理机制…...

[250506] Auto-cpufreq 2.6 版本发布:带来增强的 TUI 监控及多项改进

目录 Auto-cpufreq 2.6 版本发布&#xff1a;带来增强的 TUI 监控及多项改进 Auto-cpufreq 2.6 版本发布&#xff1a;带来增强的 TUI 监控及多项改进 Auto-cpufreq&#xff0c;一款适用于 Linux 的免费开源自动 CPU 速度与功耗优化器&#xff0c;已发布其最新版本 2.6。该工具…...

探索Hello Robot开源移动操作机器人Stretch 3的技术亮点与市场定位

Hello Robot 推出的 Stretch 3 机器人凭借其前沿技术和多功能性在众多产品中占据优势。Stretch 3 机器人采用开源设计&#xff0c;为开发者提供了灵活的定制空间&#xff0c;能够满足各种不同的需求。其配备的灵活手腕组件和 Intel Realsense D405 摄像头&#xff0c;显著增强了…...

【Harbor v2.13.0 详细安装步骤 安装证书启用 HTTPS】

Harbor v2.13.0 详细安装步骤&#xff08;启用 HTTPS&#xff09; 1. 环境准备 系统要求&#xff1a;至少 4GB 内存&#xff0c;100GB 磁盘空间。 已安装组件&#xff1a; Docker&#xff08;版本 ≥ 20.10&#xff09;Docker Compose&#xff08;版本 ≥ v2.0&#xff09; 域…...

码蹄集——直角坐标到极坐标的转换、射线、线段

目录 MT1052 直角坐标到极坐标的转换 MT1066 射线 MT1067 线段 MT1052 直角坐标到极坐标的转换 思路&#xff1a; arctan()在c中是atan()&#xff0c;结果是弧度要转换为度&#xff0c;即乘与180/PI 拓展&#xff1a;cos()、sin()在c代码中表示方式不变 #include<bits/…...

accept() reject() hide()

1. accept() 用途 确认操作&#xff1a;表示用户完成了对话框的交互并确认了操作&#xff08;如点击“确定”按钮&#xff09;。 关闭模态对话框&#xff1a;结束 exec() 的事件循环&#xff0c;返回 QDialog::Accepted 结果码。适用场景 模态对话框&#xff08;通过 exec()…...

天文探秘学习小结

宇宙 宇宙大爆炸 时间 130亿年前 10-30次方秒内发生大爆炸 发现 20世纪80年代 哈勃发现 通过基于其他星系相对地球的移动速度得出的结论 哈勃发现离地球越远的星系 离开地球的速度越快 得出宇宙加速膨胀的结论 测量造父变星到地球的距离 哈勃测量的是一种恒星 叫造父变星 造…...

游戏引擎学习第261天:切换到静态帧数组

game_debug.cpp: 将ProfileGraph的尺寸初始化为相对较大的值 今天的讨论主要围绕性能分析器&#xff08;Profiler&#xff09;以及如何改进它的可用性展开。当前性能分析器已经能够正常工作&#xff0c;但我们希望通过一些改进&#xff0c;使其更易于使用&#xff0c;特别是在…...

利用 Kali Linux 进行信息收集和枚举

重要提示&#xff1a; 在对任何系统进行信息收集和枚举之前&#xff0c;务必获得明确的授权。未经授权的扫描和探测行为是非法的&#xff0c;并可能导致严重的法律后果。本教程仅用于教育和授权测试目的。 Kali Linux 官方链接&#xff1a; 官方网站&#xff1a; https://www…...

深入解析代理服务器:原理、应用与实战配置指南

一、代理服务器的核心原理与工作机制 1.1 网络通信的中介架构 代理服务器&#xff08;Proxy Server&#xff09;本质上是位于客户端与目标服务器之间的中间层节点&#xff0c;其核心工作机制遵循OSI模型的​​会话层​​与​​应用层​​协议。当客户端发起网络请求时&#x…...

[蓝桥杯 2025 省 B] 水质检测(暴力 )

暴力暴力 菜鸟第一次写题解&#xff0c;多多包涵&#xff01;&#xff01;! 这个题目的数据量很小&#xff0c;所以没必要去使用bfs&#xff0c;直接分情况讨论即可 一共两排数据&#xff0c;我们使用贪心的思想&#xff0c;只需要实现从左往右的过程中每个检测器相互连接即…...

区块链+数据库:技术融合下的应用革新与挑战突围

引言 近年来&#xff0c;区块链技术凭借其去中心化、不可篡改、透明可追溯等特性&#xff0c;逐渐从数字货币领域扩展到更广泛的应用场景&#xff0c;包括供应链管理、医疗健康、政务服务和数字身份等。与此同时&#xff0c;传统数据库系统在应对海量数据、多方协作与安全需求…...

油气地震资料信号处理中的NMO(正常时差校正)

油气地震资料信号处理中的NMO&#xff08;正常时差校正&#xff09;介绍与应用 NMO基本概念 **正常时差校正&#xff08;Normal Moveout Correction&#xff0c;NMO&#xff09;**是地震资料处理中的一项关键技术&#xff0c;主要用于消除由于炮检距&#xff08;source-recei…...

TDengine 车联网案例

简介 随着科技的迅猛发展和智能设备的广泛普及&#xff0c;车联网技术已逐渐成为现代交通领域的核心要素。在这样的背景下&#xff0c;选择一个合适的车联网时序数据库显得尤为关键。车联网时序数据库不仅仅是数据存储的解决方案&#xff0c;更是一个集车辆信息交互、深度分析…...

探索编程世界:从“爱编程的小黄鸭”B站账号启航

探索编程世界&#xff1a;从“爱编程的小黄鸭”B站账号启航 在编程学习的漫漫长路上&#xff0c;你是否常常为寻找优质、易懂的学习资源而烦恼&#xff1f;今天&#xff0c;我想给大家分享一个宝藏B站账号——“爱编程的小黄鸭”&#xff0c;希望能为大家的编程学习之旅提供一…...

使用 git subtree 方法将六个项目合并到一个仓库并保留提交记录

使用 git subtree 方法将六个项目合并到一个仓库并保留提交记录 步骤 1&#xff1a;初始化主仓库步骤 2&#xff1a;逐个添加子项目2.1 添加子项目远程仓库2.2 将子项目合并到主仓库的指定目录2.3 重复操作其他子项目 步骤 3&#xff1a;验证提交历史步骤 4&#xff08;可选&am…...

Django缓存框架API

这里写自定义目录标题 访问缓存django.core.cache.cachesdjango.core.cache.cache 基本用法cache.set(key, value, timeoutDEFAULT_TIMEOUT, versionNone)cache.get(key, defaultNone, versionNone)cache.add(key, value, timeoutDEFAULT_TIMEOUT, versionNone)cache.get_or_se…...

Linux云计算训练营笔记day02(Linux、计算机网络、进制)

Linux 是一个操作系统 Linux版本 RedHat Rocky Linux CentOS7 Linux Ubuntu Linux Debian Linux Deepin Linux 登录用户 管理员 root a 普通用户 nsd a 打开终端 放大: ctrl shift 缩小: ctrl - 命令行提示符 [rootlocalhost ~]# ~ 家目录 /root 当前登录的用户…...

LIO-Livox

用单台Livox Horizon (含内置IMU) 实现高鲁棒性的激光-惯性里程计&#xff0c;可在各类极端场景下鲁棒运行&#xff0c;并达到高精度的定位和建图效果。(城区拥堵、高速公路、幽暗隧道) 注&#xff1a;该系统主要面向大型室外环境中的汽车平台设计。用户可以使用 Livox Horizo…...

VNP46A3灯光遥感数据全球拼接并重采样

感谢Deepseek帮我写代码&#xff0c;本人在此过程中仅对其进行调试和部分修改&#xff1a; 灯光遥感2024年1月全球拼接结果 代码如下&#xff1a; import os import glob import h5py import numpy as np from osgeo import gdal, osr import rasterio from rasterio.merge im…...

CEF格式说明

又是一年护网季&#xff0c;现在甲方hw已经主流采用SIEM平台了&#xff0c;IPS、IDS、WAF、FW、EDR等安全数据经过安全态势感知这个二道贩子展现在蓝队面前&#xff0c;勉强能用&#xff0c;今天来说一下SIEM中常见的CEF格式&#xff0c;Common Event Format&#xff0c;公共事…...

【Trea】Trea国际版|海外版下载

Trea目前有两个版本&#xff0c;海外版和国内版。‌ Trae 版本差异 ‌大模型选择‌&#xff1a; ‌国内版‌&#xff1a;提供了字节自己的Doubao-1.5-pro以及DeepSeek的V3版本和R1版本。海外版&#xff1a;提供了ChartGPT以及Claude-3.5-Sonnet和3.7-Sonnt. ‌功能和界面‌&a…...