ClawDen:基于Node.js的配置驱动网页自动化与数据抓取框架实战

news2026/5/8 5:31:38
1. 项目概述与核心价值最近在折腾一个挺有意思的开源项目叫 ClawDen。乍一看这个名字可能有点摸不着头脑但如果你对自动化测试、网页数据抓取或者RPA机器人流程自动化感兴趣那这个项目绝对值得你花时间研究。ClawDen 本质上是一个基于 Node.js 的、高度可配置的网页自动化与数据抓取框架。它不像那些简单的爬虫库只负责发送请求和解析 HTML而是提供了一个完整的“浏览器环境”模拟能力让你可以像真人一样操作网页处理复杂的交互逻辑比如点击、输入、滚动、等待动态加载甚至应对各种反爬机制。我之所以会关注到它是因为在实际工作中我们常常会遇到一些“硬骨头”比如需要登录后才能访问的页面、数据通过 AJAX 动态加载、页面元素被 JavaScript 反复渲染、或者网站部署了复杂的验证码和风控策略。用传统的requestsBeautifulSoup组合在这些场景下往往力不从心要么拿不到数据要么代码写得异常复杂且脆弱。而像 Puppeteer 或 Playwright 这样的无头浏览器方案虽然强大但直接使用它们进行大规模、结构化的数据抓取项目时又会面临代码组织、任务调度、错误处理和配置管理上的挑战。ClawDen 的出现就是为了填补这个空白。它试图在底层浏览器自动化的强大能力之上构建一层更友好、更工程化的抽象让开发者能更专注于业务逻辑即“要抓什么”和“怎么抓”而不是与浏览器实例的生命周期、内存泄漏、选择器稳定性这些底层细节搏斗。简单来说ClawDen 适合以下几类人一是需要从现代复杂网站尤其是单页应用 SPA中稳定获取数据的开发者或数据分析师二是希望构建自动化业务流程比如自动填写表单、监控价格变化、执行定期巡检任务的团队三是那些对现有爬虫框架在可维护性和健壮性上不满希望寻找更优解决方案的技术负责人。这个项目目前由 wssaidong 维护社区活跃度不错文档也在逐步完善中正处于一个“能用且好用”的上升期。2. 核心架构与设计哲学拆解要理解 ClawDen 怎么用首先得弄明白它是怎么设计的。它的核心设计哲学可以概括为“配置驱动”和“任务流水线”。这和我们熟悉的直接编写命令式脚本的思路有很大不同。2.1 配置驱动的自动化流程在 ClawDen 的世界里一个完整的抓取或自动化任务被定义为一个或多个“步骤”Step的集合。每个步骤都是一个独立的操作单元比如“导航到某个URL”、“在输入框里填写文本”、“点击登录按钮”、“等待某个元素出现并提取其文本”。这些步骤不是通过一行行page.click(‘#submit’)这样的代码写死的而是通过一个结构化的 JSON 或 JavaScript 对象来描述的。举个例子一个简单的“打开百度并搜索”的任务在 ClawDen 中可能被配置成这样{ “name”: “search_baidu”, “steps”: [ { “action”: “navigate”, “url”: “https://www.baidu.com” }, { “action”: “type”, “selector”: “#kw”, “text”: “ClawDen” }, { “action”: “click”, “selector”: “#su” }, { “action”: “waitForSelector”, “selector”: “.result”, “timeout”: 5000 }, { “action”: “extract”, “selector”: “.result h3 a”, “attr”: “href”, “output”: “searchResults” } ] }这种配置化的好处非常明显。首先它实现了逻辑与执行的分离。你可以把任务配置看作一份“蓝图”而 ClawDen 的核心引擎是“施工队”。修改业务流程时你通常只需要调整这份蓝图而不需要深入修改引擎代码。其次它极大地提高了可读性和可维护性。即使是不熟悉 Node.js 的同事也能大致看懂这个配置文件在做什么。最后它为动态任务生成和外部化管理提供了可能。你可以把配置存储在数据库或文件中根据不同的参数动态生成步骤甚至构建一个可视化的工作流编辑器。注意配置驱动并不意味着你要手写一大堆 JSON。ClawDen 通常提供 Node.js API允许你以编程方式生成和组合这些配置对象兼顾了灵活性和便利性。2.2 模块化与插件体系ClawDen 的另一个强大之处在于其模块化设计。整个框架被拆分成核心引擎和一系列可插拔的模块。核心引擎负责最基础的任务调度、步骤执行、浏览器实例管理和生命周期控制。而诸如“HTTP请求代理”、“自定义动作Action”、“数据处理器Handler”、“结果输出器Exporter”等功能都以插件的形式存在。这种架构带来了极大的灵活性。假设你需要使用特定的代理IP池你可以集成或编写一个代理管理插件在发起导航请求前自动切换IP。处理一种特殊的验证码你可以开发一个“验证码识别”动作插件在遇到验证码时自动调用第三方服务进行识别并填写。将抓取的数据实时写入 Kafka你可以替换默认的 JSON 文件输出器实现一个 Kafka 输出器插件。对抓取的 HTML 进行自定义清洗你可以插入一个数据处理器插件在extract动作之后对原始数据进行过滤、转换或富化。这种“核心稳定外围扩展”的模式使得 ClawDen 能够适应千变万化的实际需求而无需修改其核心代码。社区也可以围绕它贡献各种各样的插件形成一个生态。2.3 并发控制与资源管理大规模抓取必然涉及并发。ClawDen 在架构层面就考虑了并发执行它内置了任务队列和并发控制机制。你可以定义同时运行多少个浏览器实例通常对应不同的任务或任务分支每个实例的资源限制CPU、内存以及全局的请求速率限制RPM。更重要的是它的资源管理策略。无头浏览器是资源消耗大户尤其是内存。ClawDen 会智能地管理浏览器实例的创建和销毁。对于短任务它可能采用“即用即弃”的策略避免内存累积。对于长会话任务它会尝试复用实例并通过定期清理内存快照、关闭闲置标签页等方式来保持稳定。这套机制虽然对使用者透明但却是保证长时间稳定运行的关键也是很多开发者自己基于 Puppeteer 造轮子时最容易忽略和踩坑的地方。3. 核心功能与关键技术点详解了解了架构我们深入到具体功能层面看看 ClawDen 提供了哪些“开箱即用”的利器。3.1 丰富的内置动作Actions动作是构成步骤的基本单位。ClawDen 内置了覆盖绝大多数网页交互场景的动作导航与页面控制navigate跳转、goBack/goForward前进后退、reload刷新、closePage关闭页。元素交互click点击、doubleClick双击、type输入、clear清空、hover悬停、dragAndDrop拖放。这些动作都支持丰富的选项比如click可以指定点击次数、鼠标按钮左、中、右、偏移量还能模拟人类点击的随机延迟。等待与断言waitForSelector等待元素、waitForNavigation等待导航完成、waitForFunction等待自定义条件、waitForTimeout固定等待。这是处理动态页面的核心ClawDen 在这方面做了很多优化比如智能等待网络空闲后再执行下一步减少不必要的超时。内容提取extract是最重要的动作之一。它支持通过 CSS 选择器、XPath 甚至自定义函数来定位元素并提取文本、HTML、属性值或计算属性。它还能处理元素列表将结果输出为数组。更强大的是它支持“提取器链”你可以先提取一个父元素再从这个父元素的结果中提取子元素实现复杂结构的解析。文件操作upload上传文件、download监听并管理下载文件。上传文件通常需要将本地路径转换为浏览器可识别的input[type“file”]设置ClawDen 封装了这个过程。执行脚本evaluate。允许你在页面上下文中执行任意 JavaScript 代码并返回结果。这是应对极端复杂情况或直接操作页面数据的“终极武器”。截图与PDFscreenshot、pdf。用于存档、调试或生成报告。每个动作都有详尽的配置项。例如type动作你可以设置delay来模拟人工打字的间隔让行为更“人性化”clear动作可以指定是先全选删除还是逐个字符删除。3.2 强大的选择器引擎与等待策略网页元素定位是自动化的基石也是不稳定的主要来源。ClawDen 没有重新造轮子而是基于 Puppeteer/Playwright 强大的选择器引擎并在此基础上增强了健壮性。多选择器策略在配置选择器时你可以提供一个选择器数组。ClawDen 会按顺序尝试直到找到一个匹配的元素。这非常有用因为网站的 DOM 结构可能会变或者在不同状态下元素的 ID/Class 会不同。selector: [‘.new-button’, ‘.old-button’, ‘button:has-text(“Submit”)’]这样的配置大大提高了脚本的容错率。智能等待与重试waitForSelector不仅仅是简单等待。ClawDen 内部实现了重试机制。如果一次等待超时它可能会结合waitForNavigation或页面状态进行综合判断而不是立即失败。你还可以配置“稳定时间”即要求一个元素在连续多次检测中都存在才认为它真的“稳定”出现了这能有效避开一些闪烁的临时元素。影子DOM支持现代 Web 组件常使用影子DOM普通选择器无法穿透。ClawDen 通过evaluate动作或特定的选择器语法取决于底层浏览器驱动提供了访问影子DOM内元素的能力。3.3 数据流与上下文管理ClawDen 有一个核心概念叫“上下文Context”。每个任务运行在一个独立的上下文中这个上下文是一个键值存储用于在步骤之间传递数据。数据注入你可以在启动任务时向上下文注入初始变量比如搜索关键词、登录凭证等。步骤间传递一个步骤的extract动作可以将结果存入上下文通过output配置项。后续步骤可以通过特殊的变量语法如{{output.searchResults}}来引用这些数据作为 URL 参数、输入文本或判断条件。条件执行与循环基于上下文中的数据你可以配置步骤的if条件实现分支逻辑。例如如果检测到登录失败的错误信息则跳转到重试步骤如果抓取列表成功则进入详情页循环抓取。ClawDen 支持loop配置可以对一个数组中的每一项重复执行一系列步骤这是抓取列表页-详情页模式的标配。这套数据流机制使得复杂的、有状态的工作流成为可能而无需借助外部的状态管理工具。3.4 错误处理与可观测性任何自动化系统都必须妥善处理错误。ClawDen 提供了多层次的错误处理策略步骤级重试可以为每个步骤配置retry次数和重试间隔。当发生网络超时、元素未找到等临时性错误时会自动重试。任务级回退可以配置整个任务的错误处理策略比如某个关键步骤最终失败后是终止任务、跳转到清理步骤还是记录错误后继续执行后续非依赖步骤。丰富的日志ClawDen 会输出结构化的日志记录每个步骤的开始、结束、耗时、结果和可能发生的错误。这些日志可以输出到控制台、文件也可以接入你现有的日志收集系统如 ELK。监控钩子框架提供了生命周期钩子函数你可以在任务开始、结束、每个步骤前后、发生错误时注入自定义逻辑用于发送监控告警、更新数据库状态等。4. 实战构建一个完整的商品价格监控机器人理论说得再多不如动手做一个。假设我们要监控某个电商网站我们称其为“E站”上特定几个商品的价格变化并在价格下降时发出通知。4.1 项目初始化与配置首先创建一个新的 Node.js 项目并安装 ClawDenmkdir price-monitor cd price-monitor npm init -y npm install clawden接下来我们规划任务。我们需要登录 E 站如果需要。循环遍历我们感兴趣的商品ID列表。导航到每个商品的详情页。提取商品名称和当前价格。与上次记录的价格比较。如果价格下降记录日志并发送通知例如邮件、钉钉。处理可能出现的登录失效、页面结构变化等异常。我们创建一个配置文件config/products.json存放商品列表[ {“id”: “100001”, “name”: “无线蓝牙耳机”, “url”: “https://e-site.com/product/100001”}, {“id”: “100002”, “name”: “机械键盘”, “url”: “https://e-site.com/product/100002”}, {“id”: “100003”, “name”: “显示器”, “url”: “https://e-site.com/product/100003”} ]再创建一个config/monitor-task.js这是我们的主任务配置。为了清晰我们分模块定义步骤。4.2 定义登录步骤序列如果E站需要登录我们先定义一个登录动作序列。由于登录通常只需要在会话开始时执行一次我们可以将其定义为一个独立的“子任务”或“步骤组”并在主任务中引用。// config/login-steps.js module.exports [ { “name”: “navigate_to_login”, “action”: “navigate”, “url”: “https://e-site.com/login” }, { “name”: “input_username”, “action”: “type”, “selector”: “#username”, “text”: “{{context.username}}” // 从上下文读取用户名 }, { “name”: “input_password”, “action”: “type”, “selector”: “#password”, “text”: “{{context.password}}”, “delay”: 100 // 模拟人工输入延迟 }, { “name”: “click_login_button”, “action”: “click”, “selector”: “button[type‘submit’]” }, { “name”: “verify_login_success”, “action”: “waitForSelector”, “selector”: “.user-avatar”, // 登录成功后的用户头像 “timeout”: 10000, “onError”: “retry” // 失败则重试整个登录序列这里需要更精细的控制我们先标记失败。 } ];4.3 定义核心价格抓取步骤价格抓取是循环体内的核心。我们设计一个步骤来提取数据// config/fetch-price-step.js module.exports { “name”: “fetch_product_price”, “steps”: [ { “action”: “navigate”, “url”: “{{currentProduct.url}}” // currentProduct 是循环变量 }, { “action”: “waitForSelector”, “selector”: [“.product-title”, “h1”], // 多选择器策略 “timeout”: 8000 }, { “action”: “extract”, “name”: “product_title”, “selector”: “.product-title”, “output”: “currentTitle” }, { “action”: “extract”, “name”: “product_price”, “selector”: “.price-main”, “output”: “currentPrice”, “postProcess”: “parsePrice” // 指定一个后处理函数用于清洗“¥199.00”这样的字符串 } ] };这里用到了postProcess配置。我们需要在 ClawDen 的处理器Handler中注册这个函数用于将价格字符串转换为数字。4.4 组装主任务与循环逻辑现在我们在主任务文件中组装一切并引入循环和条件逻辑。// config/monitor-task.js const loginSteps require(‘./login-steps’); const fetchPriceStep require(‘./fetch-price-step’); const products require(‘./products.json’); module.exports { “name”: “E站价格监控”, “context”: { // 初始上下文敏感信息应从环境变量读取 “username”: process.env.E_SITE_USER, “password”: process.env.E_SITE_PASS, “priceHistory”: {} // 用于存储历史价格 }, “hooks”: { “beforeTask”: async (context) { // 任务开始前可以从数据库加载历史价格到 context.priceHistory console.log(‘任务开始’); }, “afterTask”: async (context, result) { // 任务结束后可以将最新的价格历史保存回数据库 console.log(‘任务结束’); } }, “steps”: [ …loginSteps, // 展开登录步骤 { “name”: “monitor_loop”, “action”: “loop”, // 循环动作 “items”: products, // 遍历商品列表 “itemVar”: “currentProduct”, // 当前商品在上下文中的变量名 “steps”: [ // 对每个商品执行的子步骤 { …fetchPriceStep // 展开价格抓取步骤 }, { “action”: “evaluate”, // 使用 evaluate 动作进行价格比较和逻辑处理 “name”: “compare_and_notify”, “fn”: async (args) { const { context, currentProduct } args; const productId currentProduct.id; const oldPrice context.priceHistory[productId]; const newPrice context.currentPrice; // 由 fetch-price-step 提取 if (oldPrice undefined) { console.log(首次记录商品 ${productId} 价格: ${newPrice}); context.priceHistory[productId] newPrice; return; } if (newPrice oldPrice) { const message 商品降价提醒${context.currentTitle} 价格从 ${oldPrice} 降至 ${newPrice}。链接${currentProduct.url}; console.log(message); // 在这里调用通知发送函数例如 sendDingTalkAlert(message); context.priceHistory[productId] newPrice; // 更新历史价格 } else if (newPrice oldPrice) { console.log(商品 ${productId} 价格上涨至 ${newPrice}); context.priceHistory[productId] newPrice; } else { console.log(商品 ${productId} 价格未变仍为 ${newPrice}); } } }, { “action”: “waitForTimeout”, // 每个商品抓取后暂停一下避免请求过快 “timeout”: 2000 } ] } ], “errorHandling”: { “strategy”: “continue”, // 单个商品抓取失败继续下一个 “onErrorStep”: “log_error” // 可以定义一个记录错误的步骤 } };4.5 编写启动脚本与后处理器最后我们创建主执行文件index.jsconst { ClawDen } require(‘clawden’); const taskConfig require(‘./config/monitor-task’); // 注册自定义后处理函数 const handlers { parsePrice: (rawValue) { // 清洗价格字符串例如 “¥1,299.00” - 1299.00 if (!rawValue) return null; const numStr rawValue.replace(/[^0-9.]/g, ‘’); return parseFloat(numStr); } }; async function main() { const clawden new ClawDen({ headless: ‘new’, // 使用新的无头模式也可设为 false 以调试 concurrency: 2, // 同时监控2个商品打开2个浏览器标签页/实例 defaultTimeout: 30000, handlers // 注入自定义处理器 }); try { await clawden.run(taskConfig); console.log(‘价格监控任务完成。’); } catch (error) { console.error(‘任务执行失败:’, error); // 这里可以接入更强大的错误报警 } finally { await clawden.close(); // 优雅关闭所有浏览器实例 } } // 可以设置为定时任务例如使用 node-cron main(); // 例如每30分钟运行一次require(‘node-cron’).schedule(‘*/30 * * * *’, main);4.6 配置优化与部署为了让这个机器人更健壮我们还需要考虑环境变量管理使用dotenv管理用户名、密码、通知 webhook 地址等敏感信息。持久化存储将priceHistory存入 SQLite 或 Redis而不是内存中防止程序重启丢失。通知集成完善sendDingTalkAlert或sendEmail函数实现真正的报警。健康检查与自愈在hooks.beforeTask中检查网络和浏览器状态如果登录步骤失败可以尝试重置上下文并重新运行登录序列。日志与监控将 ClawDen 的日志输出到文件并使用logrotate管理。可以集成 Sentry 等 APM 工具捕获未处理的异常。Docker 化创建 Dockerfile确保运行环境一致便于在服务器上部署和调度。5. 避坑指南与高级技巧在实际使用 ClawDen 的过程中我积累了一些经验教训和技巧这些在官方文档里不一定强调。5.1 选择器稳定性是生命线网页前端变化是常态。依赖单一的、过于具体的选择器如#root div main div.container div:nth-child(3) div button是自杀行为。技巧一优先使用语义化选择器。寻找具有稳定>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2593837.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…