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

突破反爬困境:SDK开发,浏览器模块(七)

声明

本文所讨论的内容及技术均纯属学术交流与技术研究目的,旨在探讨和总结互联网数据流动、前后端技术架构及安全防御中的技术演进。文中提及的各类技术手段和策略均仅供技术人员在合法与合规的前提下进行研究、学习与防御测试之用。

作者不支持亦不鼓励任何未经授权的工程应用或违法行为,所有内容均不构成任何非法操作的技术指导或建议。请各位读者根据所在平台的相关规定及法律法规谨慎使用和解读本文内容。

引言

在过去的六篇文章中,我们以“庖丁解牛”的方式拆解了反爬虫攻防的核心逻辑,从协议分析、行为特征检测到动态渲染对抗,逐步构建了一套完整的反爬虫技术设计框架。

从这一篇开始,一切将截然不同,我们将以代码说话。

设计是技术的骨架,而开发才是赋予其血肉与灵魂的过程。本文将带领读者正式跨越理论与实践的边界,进入实战开发阶段。我们将亲手实现一个轻量指纹浏览器SDK,并深度集成浏览器自动化工具(如Puppeteer、Playwright)。

接下来的内容将默认读者已掌握Python/JavaScript基础及HTTP协议核心知识。

接口设计

在设计SDK接口时,我反复澄清要给到最终使用者的是什么?更多功能?还是更简单易用?在这里,我选择了更加倾向于易用性。毕竟我们的程序,是要解决问题,降低复杂度,而非制造问题。因此我们在设计浏览器模块接口时,只关注以下几个动作:

  • 创建一个浏览器实例
  • 关闭浏览器实例,并回收相关资源
  • 查看当前正在运行中的浏览器实例

这些行为,已经完全可以满足一个爬虫在执行过程中所需进行的全部动作了。因为在浏览器实例创建完毕之并与爬虫框架完成CDP连接之后,后续的就都是爬虫系统的行为了。

接口文档

由于我们是指纹浏览器,因此我们先把指纹模型的设计放在最开始

指纹数据

{"screen": {"width": 800, // 宽度"height": 600 // 高度},// 屏幕分辨率 非必填"timezone": "Asia/Hong_Kong",// 时区,非必填"userAgent": "Mozilla/5.0 (Windows NT 10.0; WOW64) Chrome/86.0.4240.198", // UA信息 非必填"platform": "Win32",// 平台信息 非必填"userAgentData": {"productName": "Google Chrome", //浏览器品牌名 Google Chrome / Microsoft Edge / Chromium / Brave"productVersion": "110.0.5481.78", // 浏览器版本号"isMobile": false, // 是否为手机版  "platform": "Windows", // 运行平台 Windows/Mac OS X/Linux/iOS/Android"platformVersion": "15.0.0", // 运行平台版本号 Windows 举例 Win11:15.0.0 /Win10: 10.0.0"architecture": "x86", // 编译架构 arm/x86"bitness": "64", //运行平台 位数 32/64"model": "", //品牌型号,仅限手机版情况下有值"wow64": false // 99 以下 undefined,99 以上 false(仅win有判断,其他系统统一false)},// UAData信息 非必填 但UA发生变化时必填,同时会校验此信息合法性"deviceMemory?": 8, // 设备内存 非必填"hardwareConcurrency?": 4, // 硬件并发数 非必填"languages": ["en-US",], // 页面语言 非必填"locale": "en-US", // UI语言 非必填},"font": {"unicode": true, //是否禁用Emoji表情,true|false"fonts": ["Arial","Arial Black","Arial Narrow","Calibri","Cambria","Cambria Math","Comic Sans MS"],// 字体列表}, // 字体信息 非必填"audio": {"seed": "xxxxx"},// 音频指纹噪声 非必填"canvas": {"seed": "xxxxx"},// Canvas指纹噪声 非必填"webgl": { "seed": "xxxxx", // 噪声 非必填"meta":{"vendor": "Google Inc.", // 提供商"renderer": "ANGLE (NVIDIA GeForce GT 730)" // 渲染器} //元数据 非必填},// WebGL配置 非必填"geolocation": {"latitude": 44.0,"longitude": 55.0},// 定位信息 非必填"bluetooth": { "enabled": false // 是否启用蓝牙,true or false},// 蓝牙状态 非必填"speech": [// 至少有一项的is_default为true !// 否则朗读者列表强制转化为空,显示为blocked{"name": "Microsoft Swara - Hindi (India)", // 朗诵者名称,字符串"lang": "hi-IN", // 朗诵者语言,字符串"isDefault": true // 是否为默认语音,true or false},{"name": "Microsoft Sylvie - French (Canada)","lang": "fr-CA","isDefault": false}]// 朗读者列表 非必填}

以上是我们指纹部分支持的全部配置,通过这些指纹的排列组合,我们已经可以很好的确定浏览器实例的指纹唯一性了,下面我们来继续完善其他操作的文档。

新建浏览器实例

API

路径

请求方式

/browsers

POST

Request
{"userDataDir":"", // 数据缓存路径 必填"proxy":{"protocol":"http",// 协议 支持http,https,socks 必填"host":"39.123.33.154",// 代理主机 支持 IPv4 IPv6 以及域名  必填"port":10234,// 代理端口  必填"username":"",// 用户名 非必填"password":"",// 密码 非必填},//代理 非必填"args":[],// 浏览器附加的命令行参数,非必填 会过滤掉 --proxy-server --remote-debugging-port"metadata":{},//用户存储的元数据,非必填"fingerprint":{},// 指纹数据,非必填 无指纹数据时则不会对指纹进行模拟。
}
Response
{"id":"xxxx-xxxx-xxxx-xxxx-xxxx", // 浏览器实例ID"proxyUrl":"http://127.0.0.1:11111",// 浏览器使用的本地转发后的代理链接"args":[],// 浏览器附加的参数"metadata":{},// 用户缓存的元数据"automation":{"driverPath":"",// 浏览器匹配的WebDriver路径"remoteDebuggingPort":32023,// 远程调试端口"cdpUrl":"http://127.0.0.1:32023",// CDP连接路径"cdpWsUrl":"ws://localhost:32023/devtools/page/DAB7FB6187B554E10B0BD18821265734",// CDP Websocket连接路径},// 自动化相关信息"createdTime":""// 创建时间
}

关闭浏览器实例

API

路径

请求方式

/browsers/{browserId}

DELETE

Response
{"id":"xxxx-xxxx-xxxx-xxxx-xxxx", // 浏览器实例ID"proxyUrl":"http://127.0.0.1:11111",// 浏览器使用的本地转发后的代理链接"args":[],// 浏览器附加的参数"metadata":{},// 用户缓存的元数据"automation":{"driverPath":"",// 浏览器匹配的WebDriver路径"remoteDebuggingPort":32023,// 远程调试端口"cdpUrl":"http://127.0.0.1:32023",// CDP连接路径"cdpWsUrl":"ws://localhost:32023/devtools/page/DAB7FB6187B554E10B0BD18821265734",// CDP Websocket连接路径},// 自动化相关信息"createdTime":""// 创建时间
}

关闭全部浏览器实例

API

路径

请求方式

/browsers

DELETE

Response
{"id":"xxxx-xxxx-xxxx-xxxx-xxxx", // 浏览器实例ID"proxyUrl":"http://127.0.0.1:11111",// 浏览器使用的本地转发后的代理链接"args":[],// 浏览器附加的参数"metadata":{},// 用户缓存的元数据"automation":{"driverPath":"",// 浏览器匹配的WebDriver路径"remoteDebuggingPort":32023,// 远程调试端口"cdpUrl":"http://127.0.0.1:32023",// CDP连接路径"cdpWsUrl":"ws://localhost:32023/devtools/page/DAB7FB6187B554E10B0BD18821265734",// CDP Websocket连接路径},// 自动化相关信息"createdTime":""// 创建时间
}

查看当前所有正在运行的浏览器实例

API

路径

请求方式

/browsers

GET

Response
[{"id":"xxxx-xxxx-xxxx-xxxx-xxxx", // 浏览器实例ID"proxyUrl":"http://127.0.0.1:11111",// 浏览器使用的本地转发后的代理链接"args":[],// 浏览器附加的参数"metadata":{},// 用户缓存的元数据"automation":{"driverPath":"",// 浏览器匹配的WebDriver路径"remoteDebuggingPort":32023,// 远程调试端口"cdpUrl":"http://127.0.0.1:32023",// CDP连接路径"cdpWsUrl":"ws://localhost:32023/devtools/page/DAB7FB6187B554E10B0BD18821265734",// CDP Websocket连接路径},// 自动化相关信息"createdTime":""// 创建时间
}]

以上就是全部的接口设计文档了。

使用案例

下面我们以用户的角度,来使用我们的SDK,以下是一个基于Python与Playwright框架的简单例子。

import requests
from playwright.sync_api import sync_playwright# API信息
api_url = "http://localhost:3000/browsers"  # 假设这是我们SDK服务的地址# 请求数据
request_data = {"userDataDir": "/path/to/user/data",  # 请替换为实际的数据缓存路径"proxy": {"protocol": "http","host": "39.123.33.154","port": 10234,"username": "","password": ""},"args": [],"metadata": {"description":"一个演示用的实例"},"fingerprint": {"screen":{"width":800,"height":600},"userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36","userAgentData": {"productName": "Google Chrome", "productVersion": "133.0.6943.142",  "isMobile": false,  "platform": "Windows",  "platformVersion": "15.0.0",  "architecture": "x86", "bitness": "64",  "model": "",  "wow64": false}}
}# 发送POST请求创建浏览器实例
response = requests.post(api_url, json=request_data)# 检查响应状态码
if response.status_code == 200:response_data = response.json()print("浏览器实例创建成功:")print(response_data)# 获取CDP连接信息cdp_ws_url = response_data["automation"]["cdpWsUrl"]# 使用Playwright连接到浏览器实例with sync_playwright() as p:browser = p.chromium.connect_over_cdp(cdp_ws_url)# ... Todoelse:print(f"请求失败,状态码: {response.status_code},错误信息: {response.text}")

以上就是一个使用SDK的简单示例,我们在启动时,提供了一个基于Http协议的代理,以及提供了屏幕大小、UA的指纹模拟。并在启动完成之后,通过cdpWsUrl,将浏览器实例与Playwright进行连接,最终完成我们的爬虫操作。

总结

本文从理论到实践,详细介绍了一个轻量级指纹浏览器SDK的设计与实现。文章强调了易用性,将SDK功能聚焦于创建、关闭和查看浏览器实例三个核心操作。文中详细说明了指纹数据模型结构,包括屏幕分辨率、用户代理、平台信息等多个维度,确保浏览器实例的唯一性。

接口设计部分提供了完整的API文档,并通过一个Python和Playwright的案例展示了实际应用。这一实现不仅将之前讨论的反爬虫理论付诸实践,还为开发者提供了一个灵活、易用的工具,帮助他们在复杂的反爬虫环境中更有效地进行数据采集工作。并成功地将复杂的反爬虫技术转化为可操作的开发实践,为读者搭建了理论与实践之间的桥梁。

相关文章:

突破反爬困境:SDK开发,浏览器模块(七)

声明 本文所讨论的内容及技术均纯属学术交流与技术研究目的,旨在探讨和总结互联网数据流动、前后端技术架构及安全防御中的技术演进。文中提及的各类技术手段和策略均仅供技术人员在合法与合规的前提下进行研究、学习与防御测试之用。 作者不支持亦不鼓励任何未经授…...

在MFC中使用Qt(四):使用属性表(Property Sheet)实现自动化Qt编译流程

前言 首先回顾下前面文章介绍的: 在MFC中使用Qt(一):玩腻了MFC,试试在MFC中使用Qt!(手动配置编译Qt) 在MFC中使用Qt(二):实现Qt文件的自动编译流…...

相机镜头景深

文章目录 定义影响因素实际应用特殊情况 参考:B站优致谱视觉 定义 景深是指在摄影机镜头或其他成像器前沿着能够取得清晰图像的成像器轴线所测定的物体距离范围。简单来说,就是在一张照片中,从前景到背景,能够保持清晰锐利的区域…...

HTML实现图片上添加水印的工具

HTML实现图片上添加水印的工具 本文介绍两种实现方式&#xff1a;图片上添加文字水印和图片上添加图片水印。部分源码参照自网络。 一、图片上添加文字水印 先看效果图&#xff1a; 源码如下&#xff1a; <!DOCTYPE html> <html lang"zh"> <head&…...

mysql JSON_ARRAYAGG联合JSON_OBJECT使用

父表数据&#xff08;表名&#xff1a;class&#xff09; idname1一年级2二年级3三年级 子表数据&#xff08;表名&#xff1a;students&#xff09; idnameclassId11张三112李四113小明3 sql查询&#xff08;推荐使用方法一&#xff09; 方法一 (使用IFNull判断子表数据是否…...

VMware虚拟机 ubuntu22.04无法与共享粘贴板和拖拽文件的解决方案

VMware虚拟机 ubuntu22.04无法与共享粘贴板和拖拉文件的解决方案 卸载VMware tools安装open-vm-tools还无法拖拽文件 卸载VMware tools 确保卸载完vmware-tools # 进入vmware-tools安装目录/bin sudo vmware-uninstall-tools.pl sudo rm -rf /usr/lib/vmware-tools sudo apt-…...

C++STL---<functional>

C标准库中的 <functional> 库是一个强大的工具集&#xff0c;它提供了用于处理函数对象、函数绑定、函数包装等功能的设施&#xff0c;极大地增强了代码的灵活性和可复用性。 1. 函数对象&#xff08;Functors&#xff09; 函数对象&#xff0c;也被称作仿函数&#xf…...

【Android】BluetoothSocket.connect () 的实现与协议栈交互源码解析

本文以 Android 蓝牙框架中的BluetoothSocket.connect()方法为切入点,深入剖析 Android 设备与远程蓝牙设备建立连接的全流程。从 Java 层的 API 调用出发,逐步追踪至 JNI 层的接口转发,最终进入 Buedroid 协议栈(RFCOMM/L2CAP 层),揭示蓝牙连接的核心机制。重点解析了权…...

算法导论(动态规划)——简单多状态

算法思路&#xff08;17.16&#xff09; 状态表示&#xff1a; 在处理线性动态规划问题时&#xff0c;我们可以通过“经验 题目要求”来定义状态表示。通常有两种选择&#xff1a; 以某个位置为结尾的情况&#xff1b;以某个位置为起点的情况。 本题中&#xff0c;我们选择更常…...

主成分分析(PCA)学习介绍及其高阶应用,金融风险分析

前言 主成分分析&#xff08;Principal Component Analysis, PCA&#xff09;是统计学中一种重要的降维技术。它通过寻找数据中各特征之间的线性关系&#xff0c;来降低数据的维度&#xff0c;同时保留数据中的主要信息。PCA在机器学习、信号处理、图像处理等领域广泛应用&…...

利用 SSRF 和 Redis 未授权访问进行内网渗透

目录 环境搭建 ​编辑 发现内网存活主机 ​编辑 扫描内网端口 ​编辑 利用 Redis 未授权访问进行 Webshell 写入 步骤1&#xff1a;生成 payload 方式1&#xff1a;使用python生成 payload 方式二&#xff1a;使用 Gopher 工具 步骤 2&#xff1a;写入 Webshell&#xf…...

计算机网络和因特网

目录 1、什么是Internet&#xff1f; 1.1定义 1.2具体构成描述 2、什么是协议&#xff1f; 2.1 服务描述 2.2 网络协议 3、网络边缘 3.1 定义与组成 3.2 模式 3.3服务 4、接入网、物理媒介 4.1、宽带有线接入网技术 4.2、宽带无线接入网技术 5、网络核心&#xf…...

1.oracle修改配置文件

1.找到oracle的安装路径 D:\app\baozi\product\11.2.0\dbhome_1\NETWORK\ADMIN &#xff0c;修改下面的两个文件。如果提示没有权限&#xff0c;可以先把这两个文件复制到桌面&#xff0c;修改完后&#xff0c;在复制回来。 2.查看自己电脑的主机名&#xff0c; 右击 - 此电脑 …...

算法篇-------------双指针法

温馨提示&#xff1a;由于c语言在编程上更有优势&#xff0c;更加简洁&#xff0c;本文代码均为c代码&#xff0c;其他语言也可以 做&#xff0c;思想是不变的&#xff01; 1.应用场景 涉及到对数组的操作的题目&#xff0c;可以考虑双指针方法解决 2.基…...

Java关于包和final

什么是包&#xff1f; 包就是文件夹。用来管理等各种不同功能的java类&#xff0c;方便后期代码维护 包名的规则&#xff1a;公司域名反写包的作用&#xff0c;需要全部英文小写&#xff0c;见名知意。例如&#xff1a;com.pdsu.domain package com.pdsu.demain;public class…...

2025年华为HCIP题库分享

1101、 【拖拽题】OPSF邻接关系建立的过程中需要使用不同的报文&#xff0c;那么请分别将以下各个状态和该状态使用的报文联系起来。 答题格式为&#xff1a;11 22 33 43 正确答案&#xff1a;【12】【21】【24】【33】 解析&#xff1a; 建立邻居关系 RouterA的一个连接到广…...

49. 字母异位词分组

leetcode Hot 100系列 文章目录 一、核心操作二、外层配合操作三、核心模式代码总结 一、核心操作 先把每一个词都排序&#xff0c;拍完之后相同的就是字母异位词使用map&#xff0c;排序完的作为key&#xff0c;一个string数组作为value对于每一个词&#xff0c;排完序之后将…...

python 语法篇(一)

目录 1 正则匹配注意点11.1 正则匹配字符串写法1.2 创建re函数&#xff08;1&#xff09;re.search()--搜索第一个匹配项&#xff08;2&#xff09;re.match() - 从字符串开头匹配&#xff08;3&#xff09;re.findall() - 返回所有匹配项的列表&#xff08;4&#xff09;re.fi…...

机器学习ML极简指南

机器学习是现代AI的核心&#xff0c;从推荐系统到自动驾驶&#xff0c;无处不在。但每个智能应用背后&#xff0c;都离不开那些奠基性的模型。本文用最简练的方式拆解核心机器学习模型&#xff0c;助你面试时对答如流&#xff0c;稳如老G。 线性回归 线性回归试图通过"最…...

爬虫:网络请求(通信)步骤,http和https协议

电脑(浏览器)&#xff1a;www.baidu.com——url DNS服务器&#xff1a;IP地址标注服务器——1.1.38 DNS服务器返回IP地址给浏览器 浏览器拿到IP地址去访问服务器&#xff0c;返回响应 服务器返回给响应数据&#xff1a;html/css/js/jpg... html&#xff1a;文本 cs…...

【杂谈】-大型语言模型对具身人工智能发展的推动与挑战

大型语言模型对具身人工智能发展的推动与挑战 文章目录 大型语言模型对具身人工智能发展的推动与挑战1. 具身人工智能&#xff08;Embodied AI&#xff09;的内涵解析2. 大型语言模型的功能与作用3. 最新发展趋势4. 面临的挑战与考量因素5. 总结与展望 多年来&#xff0c;研发能…...

解决Beats Solo Buds 无法自动切换音频到耳机的问题

一、核心问题定位 现象矛盾点&#xff1a; Beats 耳机能连接但需手动切换音频 AirPods 可自动切换 → 排除 iOS 系统级故障 问题可能源于 Beats 固件兼容性 或 音频路由逻辑冲突 关键差异&#xff1a; 设备 芯片类型 自动切换协议支持 固件更新方式 AirPods 二代 H1芯片 原…...

MySQL基本查询

一.create 1.1 单行数据 全列插入 1.2 多行数据 指定列插入 1.3插入否则更新 1.4替换 二.Retrieve 2.1.SELECT列 2.1.1全列查询 2.1.2指定列查询 2.1.3查询字段为表达式 2.1.4 为查询结果指定别名 2.1.5结果去重 2.2WHERE 条件 2.2.1比较运算符 2.2.3逻辑运算符…...

面基:为什么不推荐用UUID作为主键

推荐回答结构&#xff1a; 技术理论层面分析 实际项目中的教训 优化改进过程 总结提炼认知 阐述回答 在阐述回答时&#xff0c;你可以从 UUID 本身特性带来的问题&#xff0c;以及在实际工作中遇到的具体场景和优化过程等方面展开&#xff0c;下面从这一思路&#xff0c;给…...

oracle 常用函数的应用

在使用开发中会经常遇到数据类型转换、显示系统时间等情况&#xff0c;需要使用函数来实现。通过函数来实现业务需求会非常的省事便捷&#xff0c;函数可以用在适当的dml语句和查询语句中。 Oracle 数据库中主要使用两种类型的函数&#xff1a; (1)单行函数&#xff1a;对每一个…...

ubuntu的ubuntu--vg-ubuntu--lv磁盘扩容

在我们安装ubuntu时&#xff0c;如果选择的是自动分区&#xff0c;就会按照逻辑卷的形式来分区&#xff0c;并且只分配100G其余的并不会被分配&#xff0c;这对我们大多数情况来说都是不合理的&#xff0c;所以&#xff0c;如何扩充呢 下面以一个小的案例来说明如何扩充 问题…...

鬼泣:升龙系统

文章目录 0.升龙系统&#xff1a;升龙斩使敌人浮空升龙斩使敌人浮空&#xff1a;设置flying状态&#xff0c;不会落下 1.升龙斩&#xff1a;S 攻击S按下calculate directionin range warp&#xff1a;前提是根运动打开蒙太奇拔刀收刀canCombo&#xff1a;接轻攻击连击 2. A.向…...

UI产品经理基础(四):用价值链视角来分析项目需求

用价值链视角来分析项目需求 作为产品经理&#xff0c;从价值链视角分析项目需求&#xff0c;能够更精准地定位价值创造的关键环节&#xff0c;确保资源投入与用户需求、商业目标深度匹配。以下是系统化的方法论与落地步骤&#xff0c;结合案例说明如何实现需求分析与用户认可…...

ThinkPHP的“get\post\put\delete“请求

首先了解一下这四个请求的区别 1.GET 请求 用途&#xff1a;获取资源&#xff08;只读操作&#xff0c;不修改服务器数据&#xff09;。 特点&#xff1a; 参数通过 URL 的 查询字符串&#xff08;Query String&#xff09; 传递&#xff08;例如 /book?id1&#xff09;。 数…...

目标检测的训练策略

在目标检测竞赛中&#xff0c;训练策略的优化是提高模型性能的关键。常用的训练策略包括数据预处理、数据增强、超参数调节、损失函数设计、正负样本采样、模型初始化和训练技巧等。以下是一些常见的训练策略&#xff1a; 1. 数据预处理与数据增强 数据归一化&#xff1a;对输…...

【JavaSE】小练习 —— 图书管理系统

【JavaSE】JavaSE小练习 —— 图书管理系统 一、系统功能二、涉及的知识点三、业务逻辑四、代码实现4.1 book 包4.2 user 包4.3 Main 类4.4 完善管理员菜单和普通用户菜单4.5 接着4.4的管理员菜单和普通用户菜单&#xff0c;进行操作选择&#xff08;1查找图书、2借阅图书.....…...

代码随想录Day29

Day29 动态规划part02 LeetCode 62.不同路径 题目描述 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &…...

Python入门(3):语句

目录 1 基本语句 1.1 表达式语句 1.2 赋值语句 2 控制流语句 2.1 条件语句 2.2 循环语句 while循环&#xff1a; for循环&#xff1a; 2.3 流程控制语句 1. break语句&#xff1a;退出整个循环体 2. continue语句&#xff1a;只跳过本次循环&#xff0c;还会进…...

04_SQL概述及DDL

文章目录 一、关于SQL1.1、SQL概述1.2、SQL分类 二、数据库操作2.1、查看数据库2.2、切换数据库2.3、查询当前使用的数据库2.4、创建数据库2.5、查看数据库创建信息2.6、修改数据库2.7、删除数据库 三、表的操作3.1、数据类型3.1.1、数值类型3.1.2、字符串类型3.1.3、日期时间类…...

如何调整yarn.nodemanager.vmem-pmem-ratio参数?

调整 yarn.nodemanager.vmem - pmem - ratio 参数&#xff0c;可参考以下步骤&#xff1a; 打开YARN配置文件 找到 yarn - site.xml 文件&#xff0c;该文件通常位于Hadoop配置目录中&#xff0c;例如 /etc/hadoop/conf 或 /opt/module/hadoop - 3.1.3/etc/hadoop 。 找到并修改…...

【质量管理】质量的系统是预防,那以预防为主的质量管理系统包括什么?

“质量的系统是预防”这是克劳士比零缺陷管理四项基本原则的第二项基本原则。什么样的系统才是一个以预防为主的质量管理系统呢&#xff1f; 一个以预防为主的质量系统&#xff0c;必须包括三大方面&#xff1a;质量检验系统、质量保证系统、质量管理系统。 举个例子&#xff1…...

JavaScript 事件流与事件委托

目录 一、事件流、事件捕获与事件冒泡 1. 事件流&#xff08;Event Flow&#xff09; 2. 事件捕获&#xff08;Event Capturing&#xff09; 3. 事件冒泡&#xff08;Event Bubbling&#xff09; 4. 阻止事件冒泡 5. 事件解绑 6. 实际应用场景 二、事件委托 1. 什么是…...

RAG 优化 Embedding 模型或调整检索策略

在 RAG(Retrieval-Augmented Generation)系统中,优化 Embedding 模型和调整检索策略是提升检索质量的核心手段。以下是系统化的优化方法和实践指南: 一、优化 Embedding 模型 Embedding 模型的质量直接决定检索的召回率(Recall)和准确率(Precision)。优化方向包括: …...

Sentinel[超详细讲解]-3

主要讲解&#x1f680; - 基于QPS/并发数的流量控制 1、流控规则 流量控制&#xff08;Flow Control&#xff09;用于限制某个资源的访问频率&#xff0c;防止系统被瞬时的流量高峰冲垮。流量控制规则可以针对不同的资源进行配置&#xff0c;例如接口、方法、类等。 流量规则的…...

vue3使用i18n$t()无法获取数组和对象

今天在使用i18n进行国际化时&#xff0c;定义了数组和对象节点&#xff0c;但是用$t()无法获取&#xff0c;只能返回字符串值&#xff0c;查询相关材料&#xff0c;解决方案如下&#xff1a; 使用新的api替换即可&#xff0c;$t > $tm 参考文章(深表谢意)&#xff1a;vue -…...

机器学习的一百个概念(5)数据增强

前言 本文隶属于专栏《机器学习的一百个概念》&#xff0c;该专栏为笔者原创&#xff0c;引用请注明来源&#xff0c;不足和错误之处请在评论区帮忙指出&#xff0c;谢谢&#xff01; 本专栏目录结构和参考文献请见[《机器学习的一百个概念》 ima 知识库 知识库广场搜索&…...

(Kotlin)Android 高效底部导航方案:基于预定义 Menu 和 ViewPager2 的 Fragment 动态绑定实现

支持预定义 Menu 并绑定 Fragment&#xff0c;同时保留动态添加 Tab 的能力 BottomTabHelper.kt package smartconnection.com.smartconnect.home.utilimport android.content.Context import android.util.SparseArray import androidx.annotation.IdRes import androidx.fra…...

零基础入门多媒体音频(4)-GENIVIProjectAudioManager总览

GENIVI Project的AudioManager是一个专门设计用于汽车信息娱乐系统的音频管理解决方案。它负责管理和控制车辆内的音频源和音频路径&#xff0c;确保各种音频信号能够正确、高效地在车辆的音响系统中传输和播放。 AudioManager的核心功能包括音频源的管理、音频路径的控制以及音…...

DeepSeek协助优化-GTX750Ti文物显卡0.65秒卷完400MB float 音频512阶时域FIR

文章目录 1. 学习目的2. 阶段成果2.1 NVVP 性能探查2.2 测试编译环境2.3 测试样例 3 学习过程3.1 提问DeepSeek3.2 最终代码 4. 体会 1. 学习目的 最近在学习cuda&#xff0c;准备给我的taskBus SDR添加CUDA的模块支持&#xff0c;以便可以用PC机压榨山寨 B210那56M的带宽。 因…...

Embedding原理

Embedding&#xff08;嵌入&#xff09;是将离散符号&#xff08;如单词&#xff09;映射到连续向量空间的核心技术&#xff0c;其本质是语义的数学化表示。以下是其核心原理详解&#xff1a; 一、基础概念图解 graph LRA[单词猫] --> B[索引5] --> C[向量[0.2, -1.3,…...

Spark,配置hadoop集群1

配置运行任务的历史服务器 1.配置mapred-site.xml 在hadoop的安装目录下&#xff0c;打开mapred-site.xml&#xff0c;并在该文件里面增加如下两条配置。 eg我的是在hadoop199上 <!-- 历史服务器端地址 --> <property><name>mapreduce.jobhistory.address…...

人工智能大模型-数据预处理-文本数据预处理-图像数据预处理

文本数据预处理 大模型常用的文本数据类型 通用文本数据&#xff1a;网页、对话和图书资料等专用文本数据&#xff1a;多语言文本、科学文本、代码和指令等 构造方法 指令数据&#xff1a;指令(instruction)、输入(input)、输出(output)3部分组成 如果在instruction部分已…...

怎么使用嵌套虚拟环境实现项目部署之virtualenv嵌套conda绕开安装环境检测实现.venv部署facefusion

#工作记录 一、前言 嵌套虚拟环境本来是不建议的一种方法&#xff0c;这种嵌套虚拟环境的使用有一定特殊性&#xff0c;但在一些特别的使用场景下&#xff0c;嵌套虚拟环境的使用非常有用。 二、嵌套虚拟环境&#xff1a; &#xff08;一&#xff09;conda嵌套virtualenv 该…...

ansible介绍以及安装

一.ansible介绍 实现对IT基础设施的批量管控&#xff0c;加快效率&#xff0c;节省工作时间。 1.ansible特性 1.基于python开发&#xff0c;开源&#xff0c; 2.基于ssh协议工作。只需要确保ansible机器&#xff0c;与被控制机器能连通就好了&#xff0c; 3.no server 无…...

GPT-4o图像生成功能:技术突破与隐忧并存

2025年3月25日&#xff0c;OpenAI正式推出GPT-4o原生图像生成功能&#xff0c;宣称其实现了“文本到图像的终极跨越”。然而&#xff0c;这一被市场追捧的技术在短短72小时内便因用户需求过载触发限流&#xff0c;暴露出算力瓶颈与商业化矛盾的尖锐性。这场技术狂欢的背后&…...