基于错误指纹聚类的运行时错误分析工具 rea 设计与实践
如果你维护过那种一跑起来就十几个节点同时往外吐日志的服务你一定懂这种感觉错误明明就在日志里日志工具也把关键字标出来了但你就是说不清它到底是从哪一行代码冒出来的、影响了几台机器、是偶发还是持续恶化。我去年折腾的那套内部系统就是这种处境日志量不小但每次线上出问题大家全靠肉眼在文本里大海捞针。后来我抽空写了 rea也就是一个叫 Runtime Error Analyzer 的运行时错误分析工具。它做的事情很简单把分散在不同服务、不同语言运行时里的异常日志抓出来清洗、聚合、排序然后告诉我“当前最该处理的是哪一类错误、它一般出现在哪个调用链上”。这篇文章就是我对 rea 从设计到落地的一次完整复盘包括架构选型、核心算法的取舍、接入步骤以及我在真实环境里踩过的几个坑。适合被线上日志折磨过的后端开发、测试和运维同学参考。1. 先说说我为什么非要写这么一个工具1.1 一个折磨了我很久的线上现场当时我负责维护的模拟项目X同时有 Python、Java 和 Node 三类服务在跑日志格式各不相同有的走文件有的推到消息队列还有人直接在容器标准输出里打。出了一个故障以后我经常陷入一种“日志什么都有但什么都连不起来”的状态Java 服务报的是数据库连接超时Python 那边却在疯狂打重试日志Node 服务干脆只留了一条堆栈尾巴。时间线对不上节点之间没有关联 ID最后只能靠猜。市面上不是没有现成工具通用日志聚合平台我也搭过它能做全文检索、能画曲线、能告警可它对错误的分析能力其实很弱。它的日志就是一串串字符串平台不会告诉我“这两条看似不同的堆栈其实是同一个 bug”更不会告诉我“这类错误在过去一小时里涨了十倍”。我要的东西不是“查得到”而是“看得懂”。1.2 rea 的定位不做平台只做错误定位这一步我没有再做一个大而全的日志系统我把 rea 定位成一个轻量级的错误分析工具它做核心的三步收集异常样本、按语义归并同类错误、输出带优先级的排查建议。它不负责存储海量历史日志也不负责实时监控所有指标它的价值在于把“异常文本”变成“问题清单”。听起来很像给日志做了一次聚类和排序。这个定位让 rea 的实现成本低很多也让它能很轻地寄生在现有日志链路旁边我不用改动业务代码不用要求团队更换日志框架只要拿到日志输出就能分析。这对我这种需要快速落地的小团队来说非常关键。1.3 哪些人适合用哪些人不需要我先说结论如果你的服务只有一两个实例日志量不大错误靠肉眼就能翻完那 rea 对你来说是多余的。但如果你有十个以上服务节点多个语言栈混跑或者你每周都要花大量时间在日志检索上排队翻堆栈那 rea 就很值得试。它特别适合三种场景一是微服务日常巡检每天定时跑一次把“今天新增的异常类别”推给对应负责人二是发版后的快速回归验证看新版本上线后有没有冒出此前没见过的错误指纹三是故障复盘把一段混乱的日志快照喂给它让它先把错误按影响面排个队省掉人工读堆栈的时间。2. 整体设计思路三个模块缺一不可2.1 输入层不能写死格式必须做解析器插件rea 的第一个设计决策就是输入层不能假定日志是某种固定格式。原因很直接我面对的日志来源太杂既有 Java 的 log4j 风格也有 Python 的默认 traceback还有 Node 的 JSON 行日志。如果只支持一种格式那这个工具就只解决了我自己的问题没法给组里其他人用。所以我设计了一个解析器注册表每种格式对应一个解析插件插件负责把原始文本转换成统一的内部异常事件结构。内部事件的字段长这样时间戳、服务名、异常类型、异常消息、堆栈帧列表、上下文标签。解析器只做“格式转换”不做任何语义判断语义判断全部交给后面的分析层。这样做的最大好处是加一种新语言支持的时候我不用动核心逻辑只需要再写一个格式转换器。这里补充一个我在实践里的判断不要试图用一个大正则解析所有日志太脆维护成本高。老老实实按语言和框架写专用解析器每种解析器的规则控制在几层以内反而是长期最省事的方案。2.2 分析层先聚拢再聚类数量会骗人拿到统一事件之后最核心的问题就变成什么样的两条错误算“同一个问题”这个问题想清楚整个工具才有价值。我见过不少日志分析工具在这里偷懒它们按异常类型聚合比如把所有 NullPointerException 统计成一个桶这在一个大型服务里基本等于没用因为同一个异常类型可能对应几十个完全不同的代码位置。rea 用的是“错误指纹”这个概念。每条异常事件都会通过一个归一化算法生成一串指纹只有指纹相同的异常事件才被归到同一个错误类别里。具体怎么算我下一章细说。分析层的另一个关键点是时序聚合也就是把一个时间窗口内的事件先按指纹桶聚合再算桶内数量、波及节点数、趋势方向。数量不等于严重度所以后面还要接一个评分模块。2.3 输出层给结果更得给人一条可执行的路输出层我考虑了很久。最开始 rea 只是打印一个聚合统计表把错误指纹、次数列出来但我用了一段时间后发现工程师看到这种表还是会问一句“我到底先处理哪个”。真正的输出产品应该是一份分级报告它得把错误按严重度排好并且在每一条错误下面附带线索哪些节点出现的次数最多、堆栈首帧是什么方法、附近有没有关联的上下文日志。我最后做成了两种输出终端里的摘要报告和 HTML 格式的完整报告。摘要报告用来快速决策完整报告用来在复盘会上当文档。告警则由输出层触发一个轻量级的响铃接口这个接口我单独设计成可插拔避免被某种聊天工具的 webhook 绑定死。3. 核心模块实现拆解3.1 日志解析器是怎么工作的以最常见的 Java 堆栈日志为例原始日志一般长这样2024-11-18 10:12:33.456 ERROR [http-nio-8080-exec-7] com.demo.service.OrderService - Failed to process order java.lang.RuntimeException: connection timeout at com.demo.service.OrderService.processOrder(OrderService.java:124) at com.demo.controller.OrderController.submit(OrderController.java:56) at com.demo.utils.TraceFilter.doFilter(TraceFilter.java:33)rea 的 Java 解析器第一步会按行拆分日志用头部的时间戳和日志级别正则做粗切分。第二步会用异常类型正则去定位异常首行比如java.lang.RuntimeException然后从这一行往下找堆栈帧。堆栈帧的解析是一个独立函数它负责把at 类名.方法名(文件名.java:行号)拆成四个字段类名、方法名、文件名、行号。解析器不判断这个异常是不是要紧它只负责尽量完整地提取。一个容易被忽略的细节是有些日志框架会把异常消息换行显示导致“异常类型行”和“消息体”被拆到两行里。所以解析器必须支持多行合并规则是如果当前行不是堆栈帧并且不匹配任何新日志头就把它续接到上一条异常事件的消息里。3.2 错误指纹算法聚合的关键指纹算法是整个 rea 技术含量最集中的地方。我最初想的比较简单就是拿异常类型加堆栈第一帧的类名和方法名拼成字符串做个哈希跑出来的结果却惨不忍睹。因为同一个 bug 在不同节点上打印出来的堆栈行号可能不一样内存地址也不同直接把堆栈文本扔进哈希每条日志都会变成独一无二的指纹聚类完全失效。后来我参考了业内处理堆栈去重时常用的做法把堆栈帧先做一次归一化再参与计算。归一化规则包括方法内的行号全部替换成占位符动态生成的内存地址和十六进制 ID 全部替换成标记把线程名、请求 ID、容器编号这些变量字段排除在指纹计算之外。这样一处理两条本质相同但行号差了几行的堆栈就能算到同一个指纹里。指纹计算还有一个关键决策参与计算的帧数量。我之前试过只用第一帧发现同一个方法抛出的不同异常会被错误地合并成一个问题我也试过把整个堆栈五十帧全算进去结果只要堆栈长度稍有不一致指纹又漂了。最后我取的是前面六帧。六帧以内一般足够定位到业务入口和直接调用点又不会因为底层公共框架的帧数差异而扰动指纹。3.3 严重度评分模型的取舍光聚类还不够rea 得告诉人先处理谁。我做过一版看起来非常严谨的评分公式考虑了错误类型权重、出现次数、波及节点数、环比增长倍数再加一个时间衰减因子。公式做出来以后用历史故障数据一验证效果很尴尬它把一些低危但频繁打印的错误排得老高而那些只在两台机器出现但实际导致功能不可用的错误反而沉底了。问题出在“错误类型权重”上。我试图给异常类型定一个通用危害等级但后来发现危害等级其实高度依赖业务语义通用权重注定是扯淡。所以我换了一个更务实的方向把严重度分成两部分一部分是客观指标由频率、波及节点数、环比趋势计算得出另一部分是人给的反馈权重也就是系统维护者可以手动为某个错误指纹打标“重要”或“忽略”。评分模型只对未打标的错误做冷启动排序一旦有人工反馈反馈会覆盖模型排序。这个取舍让我难受了一阵但也让我想明白一件事错误分析工具的价值不在于替工程师做决定而在于把决定成本降低。它的排序必须提供足够好的默认值同时永远给人保留否决权。3.4 一个具体场景跑通全流程我用一个真实例子把链路串一遍。某天 rea 收到两条日志一条来自 Java 订单服务异常类型是java.lang.RuntimeException堆栈首帧是OrderService.processOrder另一条来自 Python 库存服务异常类型是requests.exceptions.ConnectionError堆栈首帧是inventory_client.call_stock_api。两条异常见面完全不同但 rea 的分析层会看它们的上下文标签两条日志在时间上差了三分钟并且都带着同一个上游请求的交易号标签。rea 把交易号标签作为一个可选聚合维度默认不参与指纹计算但会在报告里作为关联提示展示。于是报告里这两类错误作为两个独立错误分类出现同时旁边的“相关线索”一栏互相引用了对方的交易号前缀。工程师看到之后立刻推断出是订单服务在调用库存服务时出现了连接问题表面上两个错误实际上是一次网络故障的两种表现。4. 实操落地怎么把 rea 接到你自己的项目里4.1 安装和环境准备rea 我最初是用 Python 写的原因是我希望它的解析器插件能用解释型语言快速迭代而且团队里没人愿意维护一个需要编译的二进制工具。安装方式很常规用 pip 装一个命令行入口就好。pip install rea-cli rea --version运行时依赖很轻核心的解析和分析逻辑只需要标准库加一个轻量级的 YAML 解析库。如果要用 HTML 报告生成和高频指纹存储再考虑引入一个嵌入式数据库但默认情况下它只是把分析结果写成 JSON 文件所以单机运行完全没有压力。我特别说明一下rea 本身不采集日志它读取日志文件或者从标准输入流消费数据。这样做是故意的采集属于部署侧的职责不同环境的日志获取方式差异太大硬要做成内置采集会拖累工具的轻量特性。你只需要在日志落盘的地方加一条定时任务把昨晚的日志文件传给 rea 就行。4.2 配置日志源与解析规则配置采用 YAML 格式。我的建议是先配置好“服务名映射”因为日志里往往没有统一的服务名字段需要靠文件名、目录结构或者日志中出现的业务标识来推断。services: - name: order-service log_paths: - /data/logs/order/*.log - /data/logs/order/*.json parser: java timezone: Asia/Shanghai - name: inventory-service log_paths: - /data/logs/inventory/*.log parser: python timezone: Asia/Shanghai解析规则可以按服务覆盖。如果你某个服务的日志格式比较特殊比如微服务框架在堆栈前塞了一段 trace 上下文你可以给这个服务单独指定一个自定义解析器。rea 的解析器注册表会在启动时加载内置规则再加载用户放在~/.rea/parsers目录下的自定义插件优先级是自定义高于内置。4.3 运行一次分析并生成报告运行分析命令时我会指定读取的日志时间和模式。比如要对昨天一整天的错误做巡检rea analyze --from 2024-11-17 --to 2024-11-18 --report-dir ./outrea 会在窗口内按五分钟粒度建立时间轴然后对每个时间窗口做聚合最后把跨窗口的指纹桶合并成最终报告。终端摘要报告默认展示前五类高严重度错误每类包含异常类型、出现次数、波及节点数和堆栈首帧。Top 5 errors by severity 1. RuntimeException in OrderService.processOrder count: 342 | nodes: 6 | trend: 218% in last 6h first frame: com.demo.service.OrderService.processOrder(OrderService.java:124) 2. ConnectionError in inventory_client.call_stock_api count: 210 | nodes: 4 | trend: 156% in last 6h这个摘要我用了很久它最大的价值不是告诉我有哪些错误而是让我一眼看出哪些错误在近六小时里呈现爆发增长。数量多但稳定不变的错误通常不是紧迫问题趋势突然翘头的才是。4.4 接入告警的小技巧告警部分我实现得非常克制。rea 不维护告警状态机它只在每次分析完成后判断当前结果和上一次分析结果之间的差异输出一个“新增错误指纹”列表和“严重度显著上升”列表。这两个列表会被发送到可配置的 webhook 地址。关键技巧是给每个指纹桶配一个配置项允许设置静默期。比如某类错误已知会导致非致命地从各节点大量打印你可以把它的静默期设为 24 小时这样新版本上线后这类持续骚扰的错误就不会把真正的新故障顶出告警列表。我在多处场景里试过静默期配置比任何收敛算法都直接有效。5. 实际问题排查实录与避坑清单5.1 时区问题不同节点时间差导致“幽灵错误”第一次把 rea 部署到跨地域节点上时我看到报告里出现了大量“发生在错误时间之前”的堆栈关联排查了很久才发现是时区问题。有的节点把时间打印成本地时间有的节点坚持用 UTC日志头部没有带时区标识。我在解析器中加了时区推断逻辑默认按服务的配置文件兜底同时支持在日志头部使用带时区的时间格式。这听起来像个小问题但如果你不做所有基于时间窗口的趋势判断都会失真严重度评分的“环比增长”直接变成笑话。提示多节点团队接入 rea 时第一件事不是调解析规则而是统一所有日志的时间戳标准。哪怕做不到统一也要在配置里给每个服务指定确切的时区解释规则。5.2 堆栈地址被误归一化整类异常被合并有段时间 rea 把几个确实不相干的错误合并成了一个大类原因是我在归一化规则里把所有十六进制数字都替换成了占位符包括一些代表业务编码的十六进制值。比如业务方把渠道 ID 打进了异常消息渠道是0x1F和0x2E归一化后它们变成了同一个指纹两条不同渠道的错误被当成了同一类。这个问题的修复思路是把归一化范围收紧只对堆栈帧中的内存地址、动态代理类名、线程 ID 做替换异常消息里的内容一律不参与指纹计算。换句话说错误指纹只描述“从哪个入口经过什么调用链到达了哪个异常”它不描述“具体因为什么数据失败”。数据相关的细节留给接下来的关联分析。5.3 日志截断导致指纹漂移大堆栈在采集时经常被日志采集器截断尤其是中间几帧丢失。最初我把堆栈帧序列直接拼进指纹导致某些错误指纹在“完整堆栈”和“截断堆栈”之间跳来跳去同一问题被分成了两个桶。我最后采用的策略是窗口内抽样加帧数归一化取堆栈前六帧但如果原始堆栈总帧数少于六帧就保留全部如果多于六帧再跳过末尾部分。这样截断发生在末尾时基本不影响指纹而中间丢帧的情况因为截断点集中在更后面的帧也很少影响前几帧。当然这不是完美方案它牺牲了对超长堆栈的变化敏感度换取的是聚类稳定性。站在工具使用者的角度稳定聚类比追求每个细节都新鲜更重要。5.4 误报率如何压下去告警误报是第二个让我头疼的问题。最开始告警条数非常多光“新增错误指纹”一天能有几十个工程师很快就对告警免疫了。我后来明确了一条告警铁律只有当某个指纹桶在最近一个时间窗口内的数量超过历史基线三倍以上或者它是“完全未见过的新指纹”且出现次数超过十次才允许触发告警。“新指纹”这个条件看起来很直白但里面有陷阱。日志解析器版本升级后解析格式变了指纹计算输入也跟着变于是大量历史错误全部变成“新指纹”触发一次告警风暴。所以我又给告警模块加了一个基线重置机制解析规则变化后自动对过去七天的日志重新跑一遍指纹计算用新算法重新建立基线缓存再把重新计算的过程标记为“预热”预热期间的告警不发送。这个机制非常有用它把“算法升级”和“业务异常”隔离了开来不会因为工具自身的变化干扰团队对线上状态的判断。6. 最后再分享几个我的使用习惯rea 写出来到现在我自己的使用习惯也在变。最初我把它当应急工具出故障了才跑一下后来改成每天早上跑一次巡检让报告直接发到工作群里夜里再由定时任务做全天扫描。我发现放到日常节奏里之后它的价值反而比应急时更大因为很多偶发错误在故障还没形成影响的时候就已经被聚成了一个小分类早期处理起来成本极低。还有一个小技巧每周我会清理一次静默期配置和人工反馈标签。人很容易在上周加完静默期后彻底忘掉结果某个错误已经连续静默半个月错过观察。清理的时候我会顺便看一眼这个指纹桶在新的基线里是否还显著如果已经数量归零就直接删掉反馈标签让它回到冷启动状态。最后说一下我打算怎么扩展 rea。下一步我会把“关联交易号”这个维度做得更强让多个错误指纹能自动组成一个故障拓扑图而不是只停留在互相引用的线索列表。我计划让 rea 在识别到两个高严重度错误都关联同一组交易号时把它们合并成一个故障事件去触发告警。这个方向实现起来还有不少细节要打磨但思路已经比较明确了。如果你也在维护自己的日志分析工具或者在为线上日志过多发愁欢迎沿着我这套思路去试一试。

相关新闻

Java设计模式实战指南:从源码到框架,把背八股变成用得上

Java设计模式实战指南:从源码到框架,把背八股变成用得上

聊到Java设计模式,很多人的第一反应是23种模式的名字和定义,接着就是那句经典的感叹:背倒是背过,项目里真用不上。我这些年面过不少人,也被面过不少次,最深的感受是:设计模式面试题从来不是考你…

2026/10/11 9:04:46 阅读更多 →
想一套工具覆盖微信抖音百度快手?先把四端真正难的三件事看清!

想一套工具覆盖微信抖音百度快手?先把四端真正难的三件事看清!

如今商家做小程序,很少再只盯着微信一个入口。更多人是直接抛出一个更实在的问题:有没有一套工具,能把微信、抖音、百度、快手这四个平台一次做下来?搜「微信抖音百度快手小程序工具排行」的人,多半也不是想比较四个平…

2026/10/11 9:04:46 阅读更多 →
最大规模、最严工况!远景Gen 8储能系统完成64MWh火烧测试!

最大规模、最严工况!远景Gen 8储能系统完成64MWh火烧测试!

最大规模、最严工况!远景Gen 8储能系统完成64MWh火烧测试!

2026/10/11 9:04:46 阅读更多 →

最新新闻

AI-For-Beginners 实战:用卷积神经网络实现宠物品种分类(Pet Faces 实验室)

AI-For-Beginners 实战:用卷积神经网络实现宠物品种分类(Pet Faces 实验室)

教程人工智能机器学习深度学习 【免费下载链接】AI-For-Beginners 12 Weeks, 24 Lessons, AI for All! 项目地址: https://gitcode.com/GitHub_Trending/ai/AI-For-Beginners 点击查看 免费下载 本篇文章基于 AI-For-Beginners 课程中「卷积神经网络(07…

2026/10/11 9:55:53 阅读更多 →
Informatica PowerCenter实战指南:从架构到抽数避坑要诀

Informatica PowerCenter实战指南:从架构到抽数避坑要诀

简介:这是一份Informatica PowerCenter入门与功能概览文档,适合数据集成工程师、ETL开发人员及数据治理相关岗位阅读,用于快速了解PowerCenter的定位、核心能力与适用场景。文档介绍了其批量、近实时和实时数据集成模式,并梳理了B…

2026/10/11 9:55:53 阅读更多 →
beautify-github-readme 快速上手教程:一条命令给仓库换上项目原生 SVG 首图

beautify-github-readme 快速上手教程:一条命令给仓库换上项目原生 SVG 首图

【免费下载链接】beautify-github-readme 整理并设计仓库 README,让项目价值、真实案例、安装方式与使用边界更容易理解。 项目地址: https://gitcode.com/gh_mirrors/be/beautify-github-readme 点击查看 免费下载 还在用密密麻麻的代码和目录树开头吗…

2026/10/11 9:55:53 阅读更多 →
如何用工程化方法实现无可挑剔的代码质量与交付标准

如何用工程化方法实现无可挑剔的代码质量与交付标准

1. 从一个词出发:为什么“impeccable”值得单独拿出来聊第一次看到“impeccable”这个词被当成一个项目标题,我其实是有点愣的。它不是一个技术名词,也不是某个框架或者工具的名字,字面意思就是“无可挑剔的、完美的、零瑕疵的”。…

2026/10/11 9:55:53 阅读更多 →
DeepSeek-Reasonix MemoryBench distractor 场景解析:从 distractor-049 噪声记忆文件看记忆检索的抗干扰评测

DeepSeek-Reasonix MemoryBench distractor 场景解析:从 distractor-049 噪声记忆文件看记忆检索的抗干扰评测

人工智能AI 应用AI Agent代码智能体CLI 【免费下载链接】DeepSeek-Reasonix A reliable coding agent for complex software engineering tasks. 项目地址: https://gitcode.com/GitHub_Trending/de/DeepSeek-Reasonix 点击查看 免费下载 MemoryBench 是 DeepSeek-…

2026/10/11 9:55:53 阅读更多 →
DeepSeek手册拆解:推理模型与通用模型的提示语策略与实战模板

DeepSeek手册拆解:推理模型与通用模型的提示语策略与实战模板

简介:这份PDF资料源自清华大学新闻与传播学院新媒体研究中心元宇宙文化实验室,面向希望系统掌握DeepSeek的开发者、内容创作者与AI学习者,帮助读者从基础认知走向进阶应用。内容围绕DeepSeek是什么、能做什么、如何使用以及如何从入门到精通展…

2026/10/11 9:54:53 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →