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

爬虫知识:补环境相关知识

学习目标:知道为什么要补环境,知道要补什么环境(使用Proxy检测)。没有讲解怎么补

本章没有动手去实操,只是纯理论知识

补环境介绍

DOM与BOM

DOM主要关注文档内容和结构,而BOM关注浏览器窗口和功能。在浏览器中,window对象既是BOM的核心,也是全局对象,而document对象(DOM的核心)是window对象的一个属性。

浏览器环境:指JS代码在浏览器中的运行时环境

  1. V8引擎自动构建的对象(即ECMAScript规范的内容,如Date、Array)
  2. 浏览器(内置)提供给V8引擎用于操作DOM和BOM的对象(如document、navigator)

Node环境:基于V8引擎的JavaScript运行时环境

  1. V8引擎提供的核心JavaScript功能
  2. Node.js自身的API,如fs(文件系统), http(网络请求), path(路径处理)等

环境对比

浏览器环境Node环境
JavaScript引擎V8(Chrome)V8
全局对象windowglobal
DOM API无(可通过第三方库模拟)
BOM API无(可通过第三方库模拟)
文件系统访问文件系统访问完全访问(fs模块)
网络功能XMLHttpRequest, Fetchhttp, https模块
定时器setTimeout, setIntervalsetTimeout, setInterval
console浏览器控制台终端输出
模块系统ES Modules, CommonJSCommonJS, ES Modules
典型用途前端Web开发服务器端开发,工具脚本

"补浏览器环境" :实际上是指补充浏览器环境中存在而Node环境中缺失的部分,主要是BOM(浏览器对象模型)和DOM(文档对象模型)相关的对象和API。

当我们成功提取出网站中的JavaScript加密算法代码,并确认其在浏览器环境中能够正确执行后,下一步是将其迁移到Node环境中执行。然而,由于Node环境与浏览器环境之间存在差异,可能会导致某些JavaScript代码在这两种环境中的执行结果不一致,这可能会影响我们的逆向工程成果。

window对象

window对象是JavaScript中的全局对象,在浏览器环境中代表了当前打开的浏览器窗口。它是所有全局JavaScript对象、函数和变量的顶层容器。以下是window对象的一些重要特性和用途:

在爬虫和反爬context中,window对象尤为重要:

  • 许多网站使用window对象的属性来检测是否在真实浏览器环境中运行。
  • 一些反爬措施会检查window对象的特定属性或方法是否存在或行为是否正常。
  • 在补环境时,常常需要模拟window对象及其众多属性和方法,以欺骗网站的检测机制。

需要注意的是,在Node.js等非浏览器环境中,默认是没有window对象的。在这些环境中补充window对象是模拟浏览器环境的重要步骤。

常见对象

  1. document对象:代表整个HTML文档
    • 包含了操作DOM的方法和属性
    • 例如:getElementById(), createElement(), querySelector(),cookie等
  2. location对象:包含有关当前URL的信息
    • 如href, protocol, host, pathname, search, hash等
    • 还有方法如assign(), replace(), reload()等
  3. history对象:包含浏览器的历史记录信息
    • 方法如back(), forward(), go()等
  4. navigator对象:包含有关浏览器的信息
    • 如userAgent, platform, language等
  5. screen对象:包含有关用户屏幕的信息
    • 如width, height, availWidth, availHeight等
  6. localStorage对象:提供本地存储功能
  7. sessionStorage对象:提供会话存储功能
  8. console对象:提供控制台调试功能
    • 如log(), error(), warn()等方法
  9. setTimeout和setInterval:用于设置定时器的函数
  10. alert(), confirm(), prompt():用于创建对话框的方法
  11. JSON对象:用于JSON数据的解析和序列化
  12. Math对象:提供数学计算相关的方法和常量
  13. Date对象:用于日期和时间操作
  14. Array, String, Number等基本对象的构造函数
  15. XMLHttpRequest或fetch:用于网络请求
  16. performance对象:用于性能相关的测量
  17. WebSocket:用于全双工通信

爬虫重点关注的对象

  1. document对象
    • 用于解析和操作页面内容
    • 重要方法:querySelector(), getElementById(), getElementsByClassName(),cookie 等
    • 用于提取目标数据
  2. location对象
    • 用于获取和操作URL
    • 重要属性:href, pathname, search, hash
    • 用于页面导航和URL解析
  3. navigator对象
    • 用于伪造浏览器信息
    • 重要属性:userAgent, platform, language
    • 常用于反爬绕过
  4. history对象
    • 模拟浏览历史
    • 方法如back(), forward()
    • 用于模拟真实用户行为
  5. localStorage 和 sessionStorage
    • 用于存储和获取网站可能用于验证的数据
    • 模拟持久化存储
  6. XMLHttpRequest 或 fetch
    • 用于发送网络请求
    • 模拟AJAX调用
  7. setTimeout 和 setInterval
    • 用于处理异步操作和定时任务
    • 模拟页面加载和动态内容
  8. window.crypto
    • 用于处理加密操作
    • 某些网站可能用于生成特定的加密参数
  9. performance对象
    • 用于模拟真实的页面加载性能指标
  10. screen对象
    • 用于模拟屏幕分辨率等信息
  11. console对象
    • 用于调试和日志输出
    • 某些网站可能会检查console的行为

在爬虫中,这些对象主要用于以下目的:

  1. 数据提取:使用document对象解析页面结构,提取所需信息。
  2. 请求伪造:使用navigator和其他对象伪造浏览器特征,绕过反爬检测。
  3. 模拟交互:使用history、setTimeout等模拟用户行为。
  4. 处理动态内容:应对JavaScript渲染的页面,需要模拟完整的浏览器环境。
  5. 绕过反爬措施:某些反爬技术会检查这些对象的存在性和行为,需要精确模拟。

在实际爬虫开发中,根据目标网站的特性和反爬措施,可能需要重点关注和模拟其中的一部分对象。通常,越是复杂的网站,需要模拟的对象和行为就越多。


Proxy对象

从上面的知识点可以看出,我们本地模拟浏览器需要各式各样的对象属性,而怎么确定使用什么对象,就要使用Proxy来进行观察了。

为什么使用Proxy

a) 环境模拟:Node.js环境与浏览器环境不同,缺少许多浏览器特有的对象和方法(如window、document等)。使用Proxy可以模拟这些缺失的对象和方法。

b) 动态监控:Proxy允许我们拦截和自定义对象的基本操作,如属性查找、赋值、枚举等。这使我们能够动态地监控和修改JS代码的行为。

c) 按需补充:我们可以只补充代码实际需要的部分,而不是完整模拟整个浏览器环境,这样更加高效。

d) 灵活性:Proxy提供了一种灵活的方式来处理未知的属性访问,这在处理复杂的反爬逻辑时非常有用。

Proxy如何工作

Proxy对象用于创建一个对象的代理,从而实现基本操作的拦截和自定义。在补充JS环境时,我们通常会这样使用它:

  • 这段代码创建了一个假的window对象。当代码尝试访问window的属性时,Proxy会:
    • 首先检查自己是否有这个属性
    • 如果没有,检查全局对象是否有这个属性
    • 如果全局对象也没有,返回一个空函数,防止代码报错

优势

a) 精确控制:我们可以精确控制每个属性的行为,包括读取、写入和方法调用。

b) 调试便利:通过Proxy,我们可以轻松记录所有被访问的属性,这对于理解和调试目标JS代码非常有帮助。

c) 性能优化:相比完全模拟整个浏览器环境,使用Proxy按需模拟可以显著提高性能。

d) 适应性强:对于未知或复杂的环境依赖,Proxy提供了一种灵活的处理方式。

实际应用

在爬虫中,我们通常会遇到需要执行目标网站JS代码的情况,特别是在处理加密参数时。使用Proxy可以让我们在Node.js环境中"骗过"这些JS代码,使其以为自己是在浏览器中运行,从而正确执行并得到我们需要的结果。

Proxy对象的基本语法

let proxy = new Proxy(target, handler);

这里有两个主要参数:

  1. target: 这是要代理的原始对象。可以是任何类型的对象,包括数组、函数,甚至另一个代理。
  2. handler: 这是一个对象,其属性是定义代理行为的函数。这些函数被称为"捕获器"(traps)。

handler对象可以定义以下主要的捕获器:

  • get(target, property, receiver): 用于拦截对象属性的读取操作。
  • set(target, property, value, receiver): 用于拦截对象属性的设置操作。
  • has(target, prop): 用于拦截 in 操作符。
  • deleteProperty(target, property): 用于拦截删除操作。
  • apply(target, thisArg, argumentsList): 用于拦截函数调用。
  • construct(target, argumentsList, newTarget): 用于拦截 new 操作符。

代码示例

在这个例子中:

  1. target 是我们要代理的原始对象。
  2. handler 定义了如何拦截对对象的操作。
  3. 我们定义了 get 和 set 捕获器来拦截读取和设置属性的操作。
  4. 当我们通过代理对象访问或修改属性时,相应的捕获器会被调用。
// 目标对象
let target = {name: "John",age: 30
};// 处理器对象
let handler = {// 拦截读取属性操作get: function(obj, prop) {console.log(`正在获取 ${prop} 属性`);return prop in obj ? obj[prop] : `${prop} 不存在`;},// 拦截设置属性操作set: function(obj, prop, value) {console.log(`正在设置 ${prop} 属性为 ${value}`);obj[prop] = value;return true;}
};// 创建代理
let proxy = new Proxy(target, handler);// 使用代理
console.log(proxy.name);  // 输出: 正在获取 name 属性 \n John
console.log(proxy.age);   // 输出: 正在获取 age 属性 \n 30
console.log(proxy.job);   // 输出: 正在获取 job 属性 \n job 不存在proxy.name = "Jane";      // 输出: 正在设置 name 属性为 Jane
console.log(proxy.name);  // 输出: 正在获取 name 属性 \n Jane

 这就是Proxy的基本工作原理。在更复杂的场景中,比如模拟浏览器环境,我们可以使用这种机制来创建看起来像浏览器对象(如window、document等)的对象,并控制对这些对象的访问和修改。

Proxy实验

运行测试

创建demo.js,打开命令行终端,导航到您保存 demo.js 文件的目录,然后运行以下命令:

node demo.js

// 创建一个模拟的window对象
const fakeWindow = new Proxy({}, {get: function(target, property) {console.log(`Accessing property: ${property}`);if (property in target) {return target[property];} else if (typeof global[property] !== 'undefined') {return global[property];} else {// 模拟缺失的属性或方法return () => console.log(`Called method: ${property}`);}},set: function(target, property, value) {console.log(`Setting property: ${property} = ${value}`);target[property] = value;return true;}});// 测试访问属性console.log(fakeWindow.navigator);// 测试设置属性fakeWindow.location = 'https://example.com';// 测试调用方法fakeWindow.alert('Hello, world!');// 测试访问真实的全局属性console.log(fakeWindow.console === console);  // 应该返回 true// 测试访问不存在的属性fakeWindow.nonExistentMethod();

观察结果

这个输出展示了Proxy如何拦截和处理各种操作:

  • 访问属性(navigator, console)
  • 设置属性(location)
  • 调用方法(alert, nonExistentMethod)
  • 处理存在和不存在的属性
Accessing property: navigator
undefined
Setting property: location = https://example.com
Accessing property: alert
Called method: alert
Accessing property: console
true
Accessing property: nonExistentMethod
Called method: nonExistentMethod

更多的检测功能

代码包含了以下功能:

  1. 模拟window对象
  2. 模拟document对象
  3. 处理cookie的特殊逻辑
  4. 记录所有属性的访问和设置
  5. 模拟不存在的方法
  6. 访问真实的全局属性
// 创建一个模拟的window对象
const fakeWindow = new Proxy({document: new Proxy({_cookie: '',}, {get: function(target, property) {console.log(`Accessing document property: ${property}`);if (property === 'cookie') {console.log('Reading cookie');return target._cookie;}return target[property];},set: function(target, property, value) {console.log(`Setting document property: ${property} = ${value}`);if (property === 'cookie') {console.log(`Setting cookie: ${value}`);target._cookie = value;} else {target[property] = value;}return true;}})
}, {get: function(target, property) {console.log(`Accessing window property: ${property}`);if (property in target) {return target[property];} else if (typeof global[property] !== 'undefined') {return global[property];} else {// 模拟缺失的属性或方法return () => console.log(`Called window method: ${property}`);}},set: function(target, property, value) {console.log(`Setting window property: ${property} = ${value}`);target[property] = value;return true;}
});// 测试访问window属性
console.log(fakeWindow.navigator);// 测试设置window属性
fakeWindow.location = 'https://example.com';// 测试调用window方法
fakeWindow.alert('Hello, world!');// 测试访问真实的全局属性
console.log(fakeWindow.console === console);  // 应该返回 true// 测试访问不存在的window属性
fakeWindow.nonExistentMethod();// 测试document.cookie
fakeWindow.document.cookie = 'user=john';
console.log(fakeWindow.document.cookie);// 测试访问其他document属性
fakeWindow.document.title = 'Test Page';
console.log(fakeWindow.document.title);

相关文章:

爬虫知识:补环境相关知识

学习目标:知道为什么要补环境,知道要补什么环境(使用Proxy检测)。没有讲解怎么补 本章没有动手去实操,只是纯理论知识 补环境介绍 DOM与BOM DOM主要关注文档内容和结构,而BOM关注浏览器窗口和功能。在浏…...

Crontab命令详解:轻松驾驭Linux定时任务,提升系统效率

​🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》《MYSQL》 💪🏻 制定明确可量化的目标,坚持默默的做事。 引言: crond是Linux系统中用来定期执行命令或指定程序任务的一种服务或软件…...

【Python】探索 Pandas 中的 where 方法:条件筛选的利器

那年夏天我和你躲在 这一大片宁静的海 直到后来我们都还在 对这个世界充满期待 今年冬天你已经不在 我的心空出了一块 很高兴遇见你 让我终究明白 回忆比真实精彩 🎵 王心凌《那年夏天宁静的海》 在数据分析中,Pandas 是一个强大且…...

Pikachu靶场--Sql Inject

参考借鉴 pikachu靶场练习(详细,完整,适合新手阅读)-CSDN博客 数字型注入(post) 这种类型的SQL注入利用在用户输入处插入数值,而不是字符串。攻击者试图通过输入数字来修改SQL查询的逻辑,以执行恶意操作。…...

【Python从入门到进阶】59、Pandas库中Series对象的操作(二)

接上篇《58、Pandas库中Series对象的操作(一)》 上一篇我们讲解了Pandas库中Series对象的基本概念、对象创建和操作,本篇我们来继续学习Series对象的运算、函数应用、时间序列操作,以及Series的案例实践。 一、Series对象的运算 1. 数值型数据的算术运…...

【PYG】使用datalist定义数据集,创建一个包含多个Data对象的列表并使用DataLoader来加载这些数据

为了使用你提到的封装方式来创建一个包含多个 Data 对象的列表并使用 DataLoader 来加载这些数据,我们可以按照以下步骤进行: 创建数据:生成节点特征矩阵、边索引矩阵和标签。封装数据:使用 Data 对象将这些数据封装起来。使用 D…...

【设计模式】【创建型5-2】【工厂方法模式】

文章目录 工厂方法模式工厂方法模式的结构示例产品接口具体产品工厂接口具体工厂客户端代码 实际的使用 工厂方法模式 工厂方法模式的结构 产品(Product):定义工厂方法所创建的对象的接口。 具体产品(ConcreteProduct&#xff0…...

python API自动化(Pytest+Excel+Allure完整框架集成+yaml入门+大量响应报文处理及加解密、签名处理)

1.pytest数据参数化 假设你需要测试一个登录功能,输入用户名和密码后验证登录结果。可以使用参数化实现多组输入数据的测试: 测试正确的用户名和密码登录成功 测试正确的用户名和错误的密码登录失败 测试错误的用户名和正确的密码登录失败 测试错误的用户名和密码登…...

【Postman学习】

Postman是一个非常流行的API开发和测试工具,广泛用于Web服务的开发、测试和调试。它提供了一个图形界面,允许用户轻松地构建、发送和管理HTTP(S)请求,同时查看和分析响应。下面是对Postman接口测试工具的详细解释: 1. Postman简介…...

【Linux】IO多路复用——select,poll,epoll的概念和使用,三种模型的特点和优缺点,epoll的工作模式

文章目录 Linux多路复用1. select1.1 select的概念1.2 select的函数使用1.3 select的优缺点 2. poll2.1 poll的概念2.2 poll的函数使用2.3 poll的优缺点 3. epoll3.1 epoll的概念3.2 epoll的函数使用3.3 epoll的优点3.4 epoll工作模式 Linux多路复用 IO多路复用是一种操作系统的…...

IBCS 虚拟专线——让企业用于独立IP

在当今竞争激烈的商业世界中,企业的数字化运营对网络和服务器的性能有着极高的要求。作为一家企业的 IT 主管,我深刻体会到了在网络和服务器配置方面所面临的种种挑战,以及 IBCS 虚拟专线带来的革命性改变。 我们企业在业务扩张的过程中&…...

驾驭巨龙:Perl中大型文本文件的处理艺术

驾驭巨龙:Perl中大型文本文件的处理艺术 Perl,这门被亲切称为“实用提取和报告语言”的编程语言,自从诞生之日起,就以其卓越的文本处理能力闻名于世。在面对庞大的文本文件时,Perl的强大功能更是得到了充分的体现。本…...

Kafka~特殊技术细节设计:分区机制、重平衡机制、Leader选举机制、高水位HW机制

分区机制 Kafka 的分区机制是其实现高吞吐和可扩展性的重要特性之一。 Kafka 中的数据具有三层结构,即主题(topic)-> 分区(partition)-> 消息(message)。一个 Kafka 主题可以包含多个分…...

springcloud-config 客户端启用服务发现client的情况下使用metadata中的username和password

为了让spring admin 能正确获取到 spring config的actuator的信息,在eureka的metadata中添加了metadata.user.user metadata.user.password eureka.instance.metadata-map.user.name${spring.security.user.name} eureka.instance.metadata-map.user.password${spr…...

云计算 | 期末梳理(中)

1. 经典虚拟机的特点 多态(Polymorphism):支持多种类型的OS。重用(Manifolding):虚拟机的镜像可以被反复复制和使用。复用(Multiplexing):虚拟机能够对物理资源时分复用。2. 系统接口 最基本的接口是微处理器指令集架构(ISA)。应用程序二进制接口(ABI)给程序提供使用硬件资源…...

pytest测试框架pytest-order插件自定义用例执行顺序

pytest提供了丰富的插件来扩展其功能,本章介绍插件pytest-order,用于自定义pytest测试用例的执行顺序。pytest-order是插件pytest-ordering的一个分支,但是pytest-ordering已经不再维护了,建议大家直接使用pytest-order。 官方文…...

吴恩达机器学习 第三课 week2 推荐算法(上)

目录 01 学习目标 02 推荐算法 2.1 定义 2.2 应用 2.3 算法 03 协同过滤推荐算法 04 电影推荐系统 4.1 问题描述 4.2 算法实现 05 总结 01 学习目标 (1)了解推荐算法 (2)掌握协同过滤推荐算法(Collabo…...

MySQL CASE 表达式

MySQL CASE表达式 一、CASE表达式的语法二、 常用场景1,按属性分组统计2,多条件统计3,按条件UPDATE4, 在CASE表达式中使用聚合函数 三、CASE表达式出现的位置 一、CASE表达式的语法 -- 简单CASE表达式 CASE sexWHEN 1 THEN 男WHEN 2 THEN 女…...

Unity3D 游戏数据本地化存储与管理详解

在Unity3D游戏开发中,数据的本地化存储与管理是一个重要的环节。这不仅涉及到游戏状态、玩家信息、游戏设置等关键数据的保存,还关系到游戏的稳定性和用户体验。本文将详细介绍Unity3D中游戏数据的本地化存储与管理的技术方法,并给出相应的代…...

昇思25天学习打卡营第1天|初学教程

文章目录 背景创建环境熟悉环境打卡记录学习总结展望未来 背景 参加了昇思的25天学习记录,这里给自己记录一下所学内容笔记。 创建环境 首先在平台注册账号,然后登录,按下图操作,创建环境即可 创建好环境后进入即可&#xff0…...

ctfshow-web入门-命令执行(web59-web65)

目录 1、web59 2、web60 3、web61 4、web62 5、web63 6、web64 7、web65 都是使用 highlight_file 或者 show_source 1、web59 直接用上一题的 payload: cshow_source(flag.php); 拿到 flag:ctfshow{9e058a62-f37d-425e-9696-43387b0b3629} 2、w…...

Websocket在Java中的实践——最小可行案例

大纲 最小可行案例依赖开启Websocket,绑定路由逻辑类 测试参考资料 WebSocket是一种先进的网络通信协议,它允许在单个TCP连接上进行全双工通信,即数据可以在同一时间双向流动。WebSocket由IETF标准化为RFC 6455,并且已被W3C定义为…...

python请求报错::requests.exceptions.ProxyError: HTTPSConnectionPool

在发送网页请求时,发现很久未响应,最后报错: requests.exceptions.ProxyError: HTTPSConnectionPool(hostsvr-6-9009.share.51env.net, port443): Max retries exceeded with url: /prod-api/getInfo (Caused by ProxyError(Unable to conne…...

【Unity】Excel配置工具

1、功能介绍 通过Excel表配置表数据,一键生成对应Excel配置表的数据结构类、数据容器类、已经二进制数据文件,加载二进制数据文件获取所有表数据 需要使用Excel读取的dll包 2、关键代码 2.1 ExcelTool类 实现一键生成Excel配置表的数据结构类、数据…...

001 线性查找(lua)

文章目录 迭代器主程序 迭代器 -- 定义一个名为 linearSearch 的函数,它接受两个参数:data(一个数组)和 target(一个目标值) function linearSearch(data, target) -- 使用 for 循环遍历数组 data&…...

数据结构之链表

储备知识: 线性表 :一对一的数据所组成的关系称为线性表。 线性表是一种数据内部的逻辑关系,与存储形式无关线性表既可以采用连续的顺序存储(数组),也可以采用离散的链式存储(链表)顺序表和链表都称为线性表 顺序存储就是将数据存…...

【小工具】 Unity相机宽度适配

相机默认是根据高度适配的,但是在部分游戏中需要根据宽度进行适配 实现步骤 定义标准屏幕宽、高判断标准屏幕宽高比与当前的是否相等通过**(标准宽度/当前宽度) (标准高度 / 当前高度)**计算缩放调整相机fieldOfView即…...

centos误删yum和python

在下载pkdg时,因为yum报错坏的解释器,然后误删了yum和python。 在下载各种版本,创建各种软连接,修改yum文件都不好使后,发现了这样一个方法:Centos: 完美解决python升级导致的yum报错问题(相信…...

WP黑格导航主题BlackCandy

BlackCandy-V2.0全新升级!首推专题区(推荐分类)更多自定义颜色!选择自己喜欢的色系,焕然一新的UI设计,更加扁平和现代化! WP黑格导航主题BlackCandy...

elasticsearch底层核心组件

Elasticsearch是一个高度可扩展的开源全文搜索和分析引擎,它基于Apache Lucene构建,并添加了分布式特性。以下是Elasticsearch的一些底层核心组件: 1. **Lucene**: - Elasticsearch基于Apache Lucene,一个高性能的…...

EasyExcel数据导入

前言: 我先讲一种网上信息的获取方式把,虽然我感觉和后面的EasyExcel没有什么关系,可能是因为这个项目这个操作很难实现,不过也可以在此记录一下,如果需要再拆出来也行。 看上了网页信息,怎么抓到&#x…...

20240630 每日AI必读资讯

📚全美TOP 5机器学习博士发帖吐槽:实验室H100数量为0! - 普林斯顿、哈佛「GPU豪门」,手上的H100至少三四百块,然而绝大多数ML博士一块H100都用不上 - 年轻的研究者们纷纷自曝自己所在学校或公司的GPU情况&#xff1a…...

第十一章 Qt的模型视图

目录 一、模型/视图的原理 1、原理分析 2、模型(数据模型) 3、视图 4、代理 二、文件系统模型 1、项目练习 2、UI 设计 3、代码实现 三、字符串链表模型 QStringListModel 1、项目效果 2、项目实现 四、标准项模型(QStandardItemModel) 1、模型分析 2、项目效…...

力扣 单词规律

所用数据结构 哈希表 核心方法 判断字符串pattern 和字符串s 是否存在一对一的映射关系,按照题意,双向连接的对应规律。 思路以及实现步骤 1.字符串s带有空格,因此需要转换成字符数组进行更方便的操作,将字符串s拆分成单词列表…...

10款好用不火的PC软件,真的超好用!

AI视频生成:小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/市场上有很多软件,除了那些常见的大众化软件,还有很多不为人知的小众软件,它们的作用非常强大,简洁…...

Windows怎么实现虚拟IP

在做高可用架构时,往往需要用到虚拟IP,在linux上面有keepalived来实现虚拟ip的设置。在windows上面该怎么弄,keepalived好像也没有windows版本,我推荐一款浮动IP软件PanguVip,它可以实现windows上面虚拟ip的漂移。设置…...

【计算机网络】HTTP——基于HTTP的功能追加协议(个人笔记)

学习日期:2024.6.29 内容摘要:基于HTTP的功能追加协议和HTTP/2.0 HTTP的瓶颈与各功能追加协议 需求的产生 在Facebook、推特、微博等平台,每分每秒都会有人更新内容,我们作为用户当然希望时刻都能收到最新的消息,为…...

【多媒体】Java实现MP4视频播放器【JavaFX】【音视频播放】

在Java中播放视频可以使用多种方案,最常见的是通过Swing组件JFrame和JLabel来嵌入JMF(Java Media Framework)或Xuggler。不过,JMF已经不再被推荐使用,而Xuggler是基于DirectX的,不适用于跨平台。而且上述方案都需要使用第三方库。…...

2024 Parallels Desktop for Mac 功能介绍

Parallels Desktop的简介 Parallels Desktop是一款由Parallels公司开发的桌面虚拟化软件,它允许用户在Mac上运行Windows和其他操作系统。通过强大的技术支持,用户无需重新启动电脑即可在Mac上运行Windows应用程序,实现了真正的无缝切换。 二…...

颍川韩氏,来自战国七雄韩国的豪族

颍川是战国七雄韩国故土,韩国被秦国灭国后,王公贵族们除了坚决反秦的被杀了外,大部分都留存了下来。这些人在楚、汉反秦战争中,成为反秦统一战线的重要力量,其中两人先后被封为重新恢复的韩国的国王。 一个是横阳君韩…...

Spring boot中如何使用Thymeleaf模板

大家好,我是 网创有方。今天给大家分享下Spring boot中如何使用Thymeleaf模板。 在 IntelliJ IDEA 中使用 Thymeleaf 模板引擎来开发 Spring Boot 应用程序是相对简单的。以下是一些基本步骤,帮助你在 IDEA 中设置和使用 Thymeleaf: 创建一个…...

单片机学习(14)--DS18B20温度传感器

DS18B20温度传感器 13.1DS18B20温度传感器基础知识1.DS18B20介绍2.引脚及应用电路3.内部结构框图4.存储器框图5.单总线介绍6.单总线电路规范7.单总线时序结构8.DS18B20操作流程9.DS18B20数据帧 13.2DS18B20温度读取和温度报警器代码1.DS18B20温度读取(1)…...

ue 材质贴图Tiling repeat

材质问题,如下 贴图显然不符合逻辑,太大,并且是一次性贴图 换一个红砖纹理,就看清了,砖太大了 修改: 拖出一个TexCoord,代表坐标,拖出一个参数,代表次数,如…...

【图像超分辨率】一个简单的总结

文章目录 图像超分辨率(Image Super-Resolution, ISR)1 什么是图像超分辨率?2 图像超分辨率通常有哪些方法?(1)基于插值的方法(2)基于重建的方法(3)基于学习的方法(LR im…...

WEB与低代码:B/S架构在开发中的应用与优势

在互联网迅猛发展的今天,WEB应用已经成为人们日常生活和工作中不可或缺的一部分。随着技术的进步和需求的多样化,开发高效、灵活且易于维护的WEB应用变得尤为重要。B/S架构(Browser/Server Architecture)作为一种常见的WEB应用架构…...

内容营销专家刘鑫炜揭秘:姜萍一夜暴红背后的品牌传播密码

在互联网的浪潮下,品牌传播的方式愈发多样和复杂。近日,江苏省涟水中等专业学校的十七岁中专生姜萍因在世界级数学竞赛中取得优异成绩而一夜暴红,成为网络上的热议焦点。 在这个充满变数的时代,谁也无法预测下一个网红会是谁。然…...

安装VEX外部编辑器

Houdini20配置VEX外部编辑器方法_哔哩哔哩_bilibili 下载并安装Visual Studio Code软件:Download Visual Studio Code - Mac, Linux, Windows 在Visual Studio Code软件内,安装相关插件,如: 中文汉化插件vex插件 安装Houdini Expr…...

ISO 19110全局要求类/req/global/bound-association-role要求的详细解释

/req/global/bound-association-role 要求: 如果模型允许在一个关联角色(association role)中存在“rolePlayer”关联,并且该角色属于一个“globalProperty”角色,那么这种绑定必须通过一个绑定的关联角色实体(bound …...

武汉凯迪正大等简述电缆电容检测:原理、应用与重要性

为了确保电缆的安全稳定运行评估电缆绝缘质量以及检测潜在故障,需要对电缆做一些必要的检测。本文将依照凯迪正大的一些经验对电缆电容检测的原理、应用及其重要性进行简单的序述。 一、电缆电容检测的原理 电缆电容检测基于电容的基本特性,电容是指两个…...

python调用阿里云OSS对象存储

1)安装SDK import oss2 print(oss2.__version__) 如果能返回SDK版号,则安装成功 2)配置访问凭证 import oss2 from project1 import settings #以下参数在阿里云账号中可以查到 auth=oss2.Auth(settings.ACCESS_KEY_ID, settings.ACCESS_KEY_SECRET) endpoint=settings.E…...

STM32/GD32驱动步进电机芯片TM2160

文章目录 官方概要简单介绍整体架构流程 官方概要 TMC2160是一款带SPI接口的大功率步进电机驱动IC。它具有业界最先进的步进电机驱动器,具有简单的步进/方向接口。采用外部晶体管,可实现高动态、高转矩驱动。基于TRINAMICs先进的spreadCycle和stealthCh…...

【Laravel生命周期全景】深入框架的心脏

标题:【Laravel生命周期全景】深入框架的心脏 Laravel是一个优雅的PHP Web框架,为现代Web应用程序的开发提供了丰富的功能和清晰的架构。理解Laravel的生命周期对于开发者来说至关重要,因为它涉及到应用程序从启动到响应请求的每一个环节。本…...

RabbitMQ消息可靠性等机制详解(精细版三)

目录 七 RabbitMQ的其他操作 7.1 消息的可靠性(发送可靠) 7.1.1 confim机制(保证发送可靠) 7.1.2 Return机制(保证发送可靠) 7.1.3 编写配置文件 7.1.4 开启Confirm和Return 7.2 手动Ack(保证接收可靠) 7.2.1 添加配置文件 7.2.2 手动ack 7.3 避免消息重复消费 7.3.…...

基于Spring Boot框架的EAM系统设计与实现

摘 要:文章设计并实现一个基于Spring Boot框架的EAM系统,以应对传统人工管理模式存在的低效与信息管理难题。系统利用Java语言、JSP技术、MySQL数据库等技术栈,构建了一个B/S架构的高效管理平台,提升了资产管理的信息化水平。该系…...

理解SurfaceFlinger在Android中的作用

理解SurfaceFlinger在Android中的作用 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们来探讨Android系统中一个关键的组件——SurfaceFlinger&#xff…...

Python逻辑控制语句 之 循环语句--死循环无限循环

1.死循环和无限循环的异同 死循环无限循环 相同点 在程序执⾏层⾯上看起来是⼀样的, 都是代码⼀直执行不能停止 不同点 是由于 写代码的人 不小心造成bug 是写代码的⼈ 故意这么写⽆限循环中,⼀般会存在⼀个 if 判断语句, 当这个判断语句的条件成⽴, 执⾏ break 语句,来终止循…...

东风奕派eπ008岚图FREE318双星闪耀

6月14日晚,东风汽车在湖北武汉和四川雅安两地同步举行盛大发布会,旗下两款重磅新能源车型——东风奕派的eπ008和东风岚图的FREE 318正式上市。这两款新车的推出,不仅进一步巩固了东风汽车在新能源市场的领先地位,也为消费者带来了更加多元化的选择和无与伦比的驾驶体验。e…...

“自救模式”开启,低价股纷纷涨停,有个股10日8板!这一板块持续迎利好,

政策持续支持,中药板块估值处于低位。低价股反复活跃7月5日早盘,多只低价股开盘走高。在早盘涨停的34只个股中,18股最新价在3元/股以下,占比超过总数的五成。*ST天成、*ST景峰开盘快速涨停,均实现3连板;东方集团4连板,最新价达到0.94元/股。除涨停股外,还有*ST名家、星…...

五菱高管发文“明年更卷”,消费者:车市越卷,我越幸福

日前,上汽通用五菱品牌事业部副总经理周钘在社交平台上发文称,“2024年初至今,宝骏停掉了所有的市场费用。企业认为如果产品、市场、渠道三者节奏都不对则是‘白费’”,“虽然今年行业确实卷,明年会更卷,但我们所有准备”。周钘从车企的角度,说出了车市竞争的残酷。不仅…...

Java中的ORM框架——myBatis

一、什么是ORM ORM 的全称是 Object Relational Mapping。Object代表应用程序中的对象,Relational表示的是关系型数据库,Mapping即是映射。结合起来就是在程序中的对象和关系型数据库之间建立映射关系,这样就可以用面向对象的方式&#xff0c…...

Open3D-Geometry-2:Mesh网格的一些基础操作示例

0. 引言 Open3D 有一个名为 的 3D 三角形网格数据结构TriangleMesh。下面的代码显示了如何从ply文件中读取三角形网格并打印其顶点和三角形。 import open3d as o3d import numpy as npprint("Testing mesh in Open3D...") armadillo_mesh = o3d.data.ArmadilloMes…...

服务器感染了. rmallox勒索病毒,如何确保数据文件完整恢复?

导言: 近年来,随着信息技术的飞速发展,网络安全问题日益凸显。其中,勒索病毒作为一种严重的网络威胁,对个人和企业数据造成了巨大的威胁。本文将重点介绍.rmallox勒索病毒的特点、传播途径以及应对策略,旨…...