Hadoop MapReduce气象数据分析:从HDFS到SSM全链路项目拆解
简介面向高校《分布式》课程学习者这是一份完整的气象数据分析项目源代码整合了Hadoop MapReduce批处理与SSM框架的数据可视化展示。资源包约34.89MB以Hadoop作业相关的Java MapReduce程序、SSM后端Controller/Service/Mapper及前端页面代码为主覆盖从海量气象数据清洗、按年月与温度极值聚合统计到Web端图表渲染的完整链路。压缩包目录按Hadoop计算层与SSM应用层划分便于对照课程作业逐模块调试复用。目前已有3294人学习下载适合正在完成分布式作业或希望上手HadoopSSM整合开发的中级读者。通过研读源码可掌握典型MapReduce写法理解SSM如何读取Hadoop输出并呈现结果相当于获得一套可运行的课程设计模板能有效缩短项目搭建与排错时间。1. 气象数据×MapReduce一份能跑通的课程作业到底包含什么如果你想在《分布式》这门课上拿一个不那么水的成绩用 Hadoop 分析气象数据几乎是绕不开的选题——数据真实、处理链条完整、展示效果好。但网上能找到的代码要么只贴个 Mapper 和 Reducer 让你自己拼要么把 SSM 框架和 Hadoop 硬缝在一起跑起来全靠运气。这次拆的这份源代码是一份把整条链路补齐的作业Hadoop 的 MapReduce 负责对气象原始数据做统计计算SSM 框架负责把 HDFS 上产出的结果读到 MySQL 再渲染成页面。它适合两类人一类是刚学完 HDFS 和 MapReduce、需要一份能改能跑的代码来交作业的学生另一类是工作后想快速捡起 Hadoop 开发、看看一个完整项目怎么写的人。我复现了一遍跑通没问题但有四个坑藏得很深不改必翻车。2. 气象数据的预处理与 HDFS 落地先搞清数据格式再谈计算2.1 气象数据长什么样每小时一条记录字段位置是硬编码这份作业用的气象数据集是典型的逐小时观测记录每一行包含站点编号、日期时间、温度、湿度、气压、风速等字段。原始的文本数据并不是结构化地用一个逗号隔开而是类似 NCDC 那种固定宽度字段或者用空白字符分隔。解析时不能简单用split(,)得按字段区间去截。常见做法是先把数据导入本地看一眼。假设你有 2010 年到 2015 年的气象站点数据文件名大概长这样CHM002-2010-01-01.txt。我在处理时习惯先写一个 Python 脚本做字段探测确认每列的起始位置和类型再用 Java 写正式的解析逻辑。with open(CHM002-2010-01-01.txt, r, encodingutf-8) as f: line f.readline() print(len(line)) print(repr(line[:120]))这段代码只做一件事看单行长度和前 120 个字符的真实内容。repr()能显示隐藏的转义符避免你把\t当成空格处理。字段位置确认后在 Hadoop 里解析时就可以按字符下标切分而不是按空格 split——切分法在字段值本身含空格时会导致列错位这是我踩过的第一个坑。2.2 把数据放到 HDFS目录结构决定了后续所有路径MapReduce 读取数据的路径写死在 Driver 里所以 HDFS 上的目录规划要先定好。我一般这样组织/weather/input/ # 原始气象数据 /weather/output/ # MapReduce 计算结果上传命令用-put即可完成批量导入。注意.txt文件直接导入 HDFS 即可不需要预先合并成 SequenceFile 或 Parquet——因为这份作业的核心是展示 MapReduce 流程过度封装反而让评审老师看不懂你在干什么。hdfs dfs -mkdir -p /weather/input hdfs dfs -put ./data/*.txt /weather/input/ hdfs dfs -ls /weather/input/上传后建议看一眼文件块分布hdfs fsck /weather/input -files -blocks -locations能看到每个文件被切成几个 block、落在哪个节点上。这个过程能让伪分布式环境下只有一个 DataNode 时也不会出现 block 副本不足的问题。后续跑作业时如果报Could not read block大概率就是这个环节出了岔子。2.3 伪分布式 vs 完全分布式这份代码怎么选项目本身是在伪分布式模式下开发的因为课程作业不需要你搭三台机器。但如果你手头有云主机或者想在面试时多讲两句这份代码的输入路径和fs.defaultFS配置是可以直接迁移到完全分布式的——只需要把core-site.xml里的hdfs://localhost:9000改成集群的 NameNode 地址再把yarn-site.xml的资源调度参数调大。我复现时的建议是除非你的机器内存低于 4G否则优先用伪分布式跑因为完全分布式模式下 YARN 的 ResourceManager 和 NodeManager 会多占近 1G 内存而气象数据量本身不大伪分布式足够验证逻辑。如果你要跑hadoop和zookeeper整合实战这类高可用场景那是另一套配置这份作业不需要。HDFS 落地完成后下一步才是写 MapReduce 的核心逻辑。很多同学在这两步之间漏掉一个环节没有确认数据已经真正进入 HDFS 就急着写代码最后反复报Input path does not exist。3. MapReduce 核心代码拆解Mapper、Reducer 与 Combiner 的配合3.1 Mapper把一行气象记录拆成键值对这份代码的 Mapper 做的是「按站点和月份聚合」的任务所以输出的 key 是站点 ID 和月份的拼接字符串value 是温度值。先看原始实现public class WeatherMapper extends MapperLongWritable, Text, Text, DoubleWritable { private Text outKey new Text(); private DoubleWritable outValue new DoubleWritable(); Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { String line value.toString(); String stationId line.substring(0, 10).trim(); String dateStr line.substring(15, 21).trim(); String month dateStr.substring(0, subEndIndex); String tempStr line.substring(87, 92).trim(); double temp Double.parseDouble(tempStr); outKey.set(stationId _ month); outValue.set(temp); context.write(outKey, outValue); } }这一段有三个关键参数要注意substring(0, 10)取的是站点编码substring(87, 92)取的是温度值的字符区间。这两个下标是我通过前面 Python 脚本探测出来的不同版本的气象数据集字段位置会偏移直接拿来用大概率会解析出负数——温度在 87 到 92 位是原始值加上质量码的变体实际使用时建议先打印几行确认偏移量。subEndIndex用来截取月份逻辑上是取日期字符串的前 6 位即年份加月份。这个值如果在真实数据里是可变的比如有的行日期列多了一个空格就会导致substring越界抛异常。稳妥的做法是在解析前先.trim()再去截而不是直接套固定下标。3.2 Reducer按月份聚合但注意业务要的是最大值还是均值Reducer 侧的代码是这份作业的核心争议点气象分析中「平均温度」和「最高温度」是两个不同的计算逻辑。项目源码里实现的是求每月最高温度这个选择是合理的——平均值需要处理计数和累加两个中间变量而最高值只需要一个比较操作代码更短展示 MapReduce 的 shuffle 过程也更直观。public class WeatherReducer extends ReducerText, DoubleWritable, Text, Text { Override protected void reduce(Text key, IterableDoubleWritable values, Context context) throws IOException, InterruptedException { double maxTemp Double.MIN_VALUE; StringBuilder sb new StringBuilder(); for (DoubleWritable val : values) { double current val.get(); if (current maxTemp) { maxTemp current; } } sb.append(month_max_temp).append(maxTemp); context.write(key, new Text(sb.toString())); } }reduce 阶段把相同 key 的所有温度值放到一个迭代器里逐个比较最终输出站点ID_月份 month_max_temp温度值。这个输出格式直接决定了 HDFS 结果文件的排版也决定了后面 SSM 层怎么解析。如果你想把作业升级一下改成「同时输出最高温度和平均温度」需要把max逻辑和sum count逻辑并行写在同一个 reduce 里最后用制表符分隔输出。面试时这是一个很好的扩展题MapReduce 面试题也常问这个。3.3 Driver作业参数、Combiner 与 OutputFormatDriver 类里除了常规的setMapperClass和setReducerClass还有一个容易被忽略的点——是否设置 Combiner。public class WeatherDriver { public static void main(String[] args) throws Exception { Configuration conf new Configuration(); Job job Job.getInstance(conf, Weather Analysis); job.setJarByClass(WeatherDriver.class); job.setMapperClass(WeatherMapper.class); job.setCombinerClass(WeatherReducer.class); job.setReducerClass(WeatherReducer.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(DoubleWritable.class); FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); System.exit(job.waitForCompletion(true) ? 0 : 1); } }我在复现时专门验证了这一点这份源码的 Combiner 直接复用了 Reducer 类。因为求最大值满足结合律max(max(a, b), c)和max(a, max(b, c))结果完全一致所以 Combiner 用 Reducer 是安全且高效的。如果你的业务逻辑改成了求平均值Combiner 必须单独写一个类否则会给每个 Map 输出都算一个局部平均值最终汇总时再取平均值就会出错——这是 MapReduce 里最经典的逻辑陷阱也是面试时最容易考你的点。提交命令长这样hadoop jar weather-analysis.jar com.course.weather.WeatherDriver /weather/input /weather/output如果 output 目录已存在Hadoop 会直接报org.apache.hadoop.mapred.FileAlreadyExistsException。我把这个问题的处理方式放在后面的避坑章里因为它是初学者翻车率最高的一项。MapReduce 跑完之后HDFS 的/weather/output下会出现_SUCCESS和以part-r-00000命名的结果文件。下一步就是把这个结果送进 SSM 层展示。4. SSM 展示层把 HDFS 计算结果搬到网页上4.1 架构SSM 如何接 Hadoop 计算结果SSMSpringSpringMVCMyBatis在这份项目里的角色是展示层。它不直接读 HDFS而是先把part-r-00000里的结果同步到 MySQL 表再由 SpringMVC 提供接口给前端页面渲染。同步这一步写在项目里的一个 Service 类中原理是模拟客户端去访问 HDFS 文件系统。Service public class WeatherDataSyncService { Value(${hdfs.uri}) private String hdfsUri; public void syncFromHdfs() throws Exception { Configuration conf new Configuration(); conf.set(fs.defaultFS, hdfsUri); FileSystem fs FileSystem.get(conf); Path resultPath new Path(/weather/output/part-r-00000); FSDataInputStream in fs.open(resultPath); BufferedReader br new BufferedReader(new InputStreamReader(in)); String line; while ((line br.readLine()) ! null) { // 每行格式station_month month_max_tempxx parseAndInsert(line); } br.close(); fs.close(); } }hdfs.uri在application.properties里配置默认是hdfs://localhost:9000。这里的FileSystem.get(conf)会走core-site.xml里的默认配置但如果你把项目打成 WAR 包部署到 Tomcat而 Tomcat 的系统环境变量里没配HADOOP_HOME就会遇到 Winutils 缺失的报错这个我在第 5 章会详细写。4.2 MyBatis 查询与 ECharts 呈现页面端怎么画趋势数据库表结构决定了能够展示什么内容源码中设计的weather_result表只有三列station_id、month、max_temp。MyBatis 的 Mapper 文件里有一个按站点分组查询的 SQL把同一个站点的多个月份数据按时间排序返回前端拿这个列表去渲染折线图。select idselectByStation resultTypecom.course.weather.model.WeatherResult SELECT station_id, month, max_temp FROM weather_result WHERE station_id #{stationId} ORDER BY month ASC /select页面端用的是 ECharts 折线图图表的 x 轴是月份序列y 轴是温度。SpringMVC 的 Controller 暴露一个/chart接口接收stationId参数把查询结果直接ResponseBody返回 JSON 数组。这个交互路径是学习 SSM 的好样例数据源是 Hadoop 算出来的展现是 Web 的一次请求从 HDFS 结果到浏览器渲染整条链路是闭合的。4.3 配置项上传路径、端口、数据源SSM 层配置里有几个关键项容易踩坑配置项位置建议值说明hdfs.uriapplication.propertieshdfs://localhost:9000伪分布式默认端口spring.datasource.urljdbc.propertiesjdbc:mysql://localhost:3306/weather需要先建库weatherserver.portapplication.properties8080注意与 Hadoop 的 8088 端口区分mybatis.mapper-locationsapplication.propertiesclasspath:mapper/*.xml放错路径启动会报绑定异常这里我要特别提醒一个「玄学」问题hdfs.uri不要写成localhost因为你运行时 Tomcat 所在的机器和 Hadoop 集群如果不在同一台机器localhost指向的是 Tomcat 本机会连接失败。常见做法是先hdfs dfs -ls /确认哪些路径可用再把该配置项改成与core-site.xml中fs.defaultFS完全一致的值。如果数据要展示到地图上还需要在weather_result表里追加站点经纬度字段这个扩展我在最后一章会写到。5. 避坑与排查单机伪分布式环境下最容易翻车的四个点5.1 坑一Container 启动失败内存不足现象提交作业后YARN 的 ApplicationMaster 一直在ACCEPTED状态几分钟后报Container exited with a non-zero exit code日志里提示Permanent generation space或OutOfMemoryError。原因伪分布式模式下NodeManager 默认给每个 Container 分配的内存上限是 1G但你的机器可能同时跑着 NameNode、DataNode、ResourceManager物理内存本身已紧张Java 进程再叠加就会触发容器被物理内存限制杀掉。解决调整 YARN 的内存参数我一般这样改yarn-site.xmlproperty nameyarn.nodemanager.resource.memory-mb/name value4096/value /property property nameyarn.nodemanager.vmem-pmem-ratio/name value4/value /property第一行把节点可用内存显式提到 4G第二行允许虚拟内存与物理内存比值放大到 4 倍给 JVM 留出余量。改完重启 NodeManager 再跑这个报错基本就消失了。5.2 坑二输入路径不存在但文件明明上传了现象Input path does not exist: hdfs://localhost:9000/weather/input反复出现。原因作业提交时用的是hdfs://localhost:9000全路径而文件上传时用的是相对路径/weather/input。当core-site.xml里fs.defaultFS和你命令行里的地址不完全一致或者/etc/hosts把localhost解析成::1IPv6时Hadoop 客户端解析路径就找不到文件。解决在 Driver 代码里不要写死路径改用args[0]和args[1]运行时传/weather/input这样的标准路径。如果你必须在代码里写死那要用Path构造函数的完整写法new Path(hdfs://localhost:9000/weather/input)保证与fs.defaultFS一字不差。5.3 坑三MapReduce 输出目录已存在现象第二次运行同一个作业报org.apache.hadoop.mapred.FileAlreadyExistsException。原因Hadoop 设计上不允许输出目录预先存在这是为了防止误覆盖上一次的计算结果。解决每次跑作业前手动删掉旧输出目录hdfs dfs -rm -r /weather/output或者你在 Driver 代码里加一个删除逻辑——我一般习惯加在waitForCompletion之前省得总是手动敲命令Path outputPath new Path(args[1]); FileSystem fs FileSystem.get(conf); if (fs.exists(outputPath)) { fs.delete(outputPath, true); }注意delete的第二个参数true表示递归删除。如果你不写这个参数目录非空时删除会失败这也是一个隐蔽问题。5.4 坑四中文乱码与控制台输出对不上现象Reducer 输出的中文标签month_max_temp在 HDFS 文件里正常但通过 SSM 同步到 MySQL 后变成乱码。原因两边使用的字符编码不一致。HDFS 文件默认按 UTF-8 写入MySQL 表默认如果是latin1插入时就会把超过两字节的字符合成乱码。解决确保建表时指定 UTF-8CREATE TABLE weather_result ( station_id VARCHAR(20) NOT NULL, month VARCHAR(10) NOT NULL, max_temp DOUBLE NOT NULL, PRIMARY KEY (station_id, month) ) DEFAULT CHARSETutf8mb4;utf8mb4比utf8多支持四字节字符虽然这份数据用不到 Emoji但用utf8mb4已经是 MySQL 5.7 的标准习惯不值得再为省这点空间去冒乱码风险。同时数据源连接 URL 也要加上characterEncodingutf-8参数spring.datasource.urljdbc:mysql://localhost:3306/weather?useUnicodetruecharacterEncodingutf-8如果这些坑你全避开了作业基本能稳稳跑完。但「能跑」和「值得拿高分」之间还差一步。6. 从单指标到多维度分析把作业改成「带思考痕迹」的项目如果你的作业只需要交一份能跑的代码第 5 章看完就够了。但我个人建议把分析维度再扩展一层这不仅让你的课程设计在答辩时有话讲也是应对hadoop面试题里常问的「如何设计 MapReduce 作业」的最佳素材。最简单的扩展是「按年统计年平均温度」或者「统计每个站点全年温度极差」。以温度极差为例Mapper 的输出 key 改成stationId _ yearvalue 仍然输出温度Reducer 在同一个迭代器里同时记录max和min最后输出差值。核心代码只改十几行但展示出来的能力就不一样了。更实用的一层扩展是让 SSM 层支持「按站点切换图表」。因为我发现原项目的图表数据是写死的不传stationId也能出图。把 Controller 改成下面这样GetMapping(/chart) ResponseBody public ListWeatherResult getChart(RequestParam(stationId) String stationId) { return weatherService.queryByStation(stationId); }然后在 SSM 层把站点多选的逻辑和图表关联起来前端调用接口传入不同的站点编码就能动态看到多站点的温度对比。这个需求本身不复杂但把「被动展示」变成「交互查询」作业的完成度就差了一个档次。最后一个建议如果你准备把这套代码写进简历记得把结果导出成 CSV 附在项目说明里面试官不会去跑你的 Hadoop 集群但他会仔细看你导出的数据长什么样——每一列的含义、千行数据的统计口径、异常值怎么处理这些比代码本身更能体现你有没有真正理解气象数据从原始文件到页面图表的全链路。我的习惯是每次改完这份代码都要强制走一遍删 HDFS 输出目录、重启 MySQL 连接、再跑一次hadoop jar的完整流程确保作业在任何一台干净的机器上都能直接复现。希望这份拆解能帮你的课程设计少走几步弯路。本文还有配套的精品资源点击获取

相关新闻

软件测试面试题全攻略:从基础理论到自动化与项目实战

软件测试面试题全攻略:从基础理论到自动化与项目实战

最近又到了求职旺季,找我辅导的学弟学妹几乎人手一份《最全软件测试面试题》,开口第一句基本都是"学长,这些题我背完是不是就能过了"。说实话,每次听到这种话我都有些头疼。软件测试面试题确实要看,尤其是从…

2026/10/12 18:03:31 阅读更多 →
C++日志系统选型与持久化配置:glog核心机制与生产环境避坑指南

C++日志系统选型与持久化配置:glog核心机制与生产环境避坑指南

1. 日志系统选型的底层逻辑1.1 为什么轮子满天飞还要用 glog做 C 后端或者基础架构的同学,迟早会撞上日志这件事。刚入行那会儿,我习惯用std::cout加个时间戳凑合,项目小的时候确实够用,一旦服务跑起来、多线程一并发,…

2026/10/12 18:02:30 阅读更多 →
老鼠试毒与二进制编码:从智力题到工程排查的通用模型

老鼠试毒与二进制编码:从智力题到工程排查的通用模型

1. 从一道经典智力题说起:老鼠试毒到底在考什么第一次听到“老鼠试毒”这个说法,很多人脑子里浮现的画面大概是:一排笼子,几瓶药水,几只小白鼠,然后开始一瓶一瓶灌。如果真这么干,那这道题就没什…

2026/10/12 18:02:30 阅读更多 →

最新新闻

Socket编程预备:网络分层、TCP/UDP与字节序的底层思维框架

Socket编程预备:网络分层、TCP/UDP与字节序的底层思维框架

我见过太多人抱着《Unix网络编程》硬啃,代码敲了一百多行,却连bind()为什么有时要写地址、有时可以写INADDR_ANY都说不清。这不是代码量不够,而是缺了 socket 编程开始的“预备”环节。很多人把“预备”理解成装个 Linux、装好编译环境&#…

2026/10/13 3:41:54 阅读更多 →
Kettle 9.3 实战指南:安装配置、数据库连接、转换调度与避坑

Kettle 9.3 实战指南:安装配置、数据库连接、转换调度与避坑

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

2026/10/13 3:41:54 阅读更多 →
BERT多卡训练实战:从硬件配置到PyTorch DDP加速全指南

BERT多卡训练实战:从硬件配置到PyTorch DDP加速全指南

我最早接触 BERT 训练是在一块 16GB 显存的显卡上跑的,batch size 调到 4 就开始爆显存,那会儿我还以为是代码写得不对。后来把整机升级成多 GPU 服务器、用 PyTorch 的分布式训练把 BERT-base 训起来之后,才真正理解这类模型为什么"吃显…

2026/10/13 3:41:54 阅读更多 →
学校工资管理系统数据库设计实战指南

学校工资管理系统数据库设计实战指南

简介:本资源是一份面向高校数据库原理及应用课程学习者的高分课程设计实践材料,聚焦学校工资管理系统的完整开发实现,适用于数据库设计、SQL Server应用及课程设计报告撰写等教学场景。压缩包共3个文件,含1份详尽的Word版课程设计…

2026/10/13 3:41:54 阅读更多 →
AI模型路由实战:用星链4SAPI化解大模型调用成本失控

AI模型路由实战:用星链4SAPI化解大模型调用成本失控

上个月看到账单的时候,我整个人是懵的。调用次数只比上上个月涨了 12%,费用却翻了将近一倍。一开始我以为是模型厂商在悄悄调价,拉出明细一看才发现,问题根本不在单价,而在于所有请求无差别地打向了同一个高配模型&…

2026/10/13 3:41:54 阅读更多 →
以太坊智能合约可升级性实战:代理模式、存储布局与UUPS升级方案详解

以太坊智能合约可升级性实战:代理模式、存储布局与UUPS升级方案详解

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

2026/10/13 3:40:54 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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/12 21:05:09 阅读更多 →
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/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →