Python课设实战:银行ATM系统架构设计与避坑指南
最近有个学弟找我说期末Python课程设计卡住了题目是“银行自动取款机系统”。我帮他把代码整体过了一遍功能全部重写理顺最后他顺利交差。这个题目在各大课设里太常见了常见到网上一搜一堆“ATM系统源码”但说实话绝大多数版本都有同一个毛病能跑但经不起细看。老师随便问一句“你这个余额为什么用float存”“改一下密码功能你怎么加”代码就容易露怯。这篇文章就把我从拿到题目到最终交付的全过程拆开来写需求怎么拆、功能边界怎么定、代码结构怎么组织、文件存储怎么做、答辩会问什么。题目本身不难但你想做成“说得清、改得动、答得上”的课设还是有不少门道。适合正在做同类课设的同学也适合想从“能跑”走向“像个系统”的Python初学者。1. 拿到题目之后先想清楚再做1.1 这个课设到底想考什么银行ATM系统本质是一道综合练习题老师出这道题通常想考察这么几块基础语法和流程控制能不能用循环把程序的主体框架撑起来函数或类的使用代码能不能有效组织而不是几百行堆在一起文件读写与数据持久化程序关闭之后再打开数据还在不在异常输入的处理用户输了个“abc”程序会不会崩简单的业务逻辑比如取款不能超过余额转账需要目标账户存在。你把这几条想清楚做出来的东西就不会跑偏。很多同学一上来就琢磨“我要不要加个图形界面”“能不能做个指纹识别”这些都属于没搞明白作业在考什么。课设不是产品发布会把核心功能做稳比堆一堆花哨但容易出bug的功能有效得多。我给学弟的第一条建议是先别急着写代码把“程序每次运行都会经历什么”完整列一遍。从启动、登录、进入主菜单到每项操作结束再回到菜单最后退出登录或关闭程序这是整个系统的骨架。骨架立住细节往里填。1.2 功能边界怎么定ATM系统的常见功能清单我按优先级分成了三档优先级功能说明必备开户、登录、存款、取款、余额查询、退出这是核心闭环缺一个都不完整推荐改密码、转账、交易流水大部分老师会期待这些功能存在实现难度不高加分账户锁定、管理员统计、日志记录有时间再做没时间不做也没关系当时学弟给我的初稿里居然没有开户功能只有几个写死的账号。这是个很典型的误区没有开户系统就是一个纯查询工具没法演示“新用户进来”的完整流程。而且开户功能能顺带考察输入校验和文件追加写入性价比很高。转账功能建议加因为转账能体现“两个账户之间联动”的逻辑。但注意转账的边界条件比较多目标账户是否存在、是否转给自己、金额是否大于余额这些分支都能在答辩时变成你解释代码亮点的素材。1.3 技术选型的取舍存储层我是直接建议用JSON文件理由有几点不依赖外部依赖标准库就能搞定结构清晰账户信息天然适合用字典嵌套表示中文读写没那么多坑CSV如果处理不当很容易出现编码和逗号转义问题老师验收时打开文件能直接看懂数据结构。有的同学一上来想用SQLite或者pandas存DataFrame我不太建议。课设阶段引入数据库是好事但如果老师只要求“能用文件存就行”你用SQLite反而要解释为什么一个简单考试项目要搞出数据库来。有时候“恰好够用”是比“技术上更高级”更稳妥的答案。面向过程还是面向对象下一节细讲但结论很明确这题适合用类来组织理由不是“OOP听起来高级”而是ATM系统天然有“账户”和“ATM机器”两个核心实体用类来建模非常自然。2. 系统架构与核心模块设计2.1 用类还是函数建议OOP网上很多ATM课设版本是纯面向过程的写法定义一堆全局变量比如current_user None、users {}然后所有函数都直接操作这些全局变量。这种写法的问题在于函数多了之后谁在哪个位置改了哪个变量完全失控改一个功能容易牵连一片。我建议把系统拆成两个核心类Account代表一个账户负责自己的数据和行为ATMSystem代表ATM机器负责和用户交互、调度账户方法。这样做的好处非常直接Account内部管好自己的余额和流水ATMSystem只需要调用account.deposit(100)不用关心余额是怎么变动的。这就是“封装”老师问到“你为什么要用类”时这句话就是答案。2.2 Account类的属性与行为设计Account类的属性不能随便设。我当时给学弟的版本是这样的class Account: def __init__(self, account_id, name, password_hash, balance0.00): self.account_id account_id self.name name self.password_hash password_hash self.balance balance self.transactions [] def deposit(self, amount): if amount 0: return False, 存款金额必须大于0 self.balance str(Decimal(self.balance) Decimal(amount)) self.transactions.append((deposit, str(amount))) return True, 存款成功 def withdraw(self, amount): if amount 0: return False, 取款金额必须大于0 if Decimal(amount) Decimal(self.balance): return False, 余额不足 self.balance str(Decimal(self.balance) - Decimal(amount)) self.transactions.append((withdraw, str(amount))) return True, 取款成功注意几个细节。balance我用字符串而不是float保存。直接存Decimal也行但存JSON时Decimal需要额外处理字符串最省事使用时再转Decimal做运算既避免浮点误差又能保留两位小数的格式。deposit和withdraw都返回一个元组(是否成功, 提示信息)这样调用方可以根据结果决定输出什么而不是在方法里直接print()。这个习惯建议养起来它让业务逻辑和界面输出彻底分离。password_hash不是明文密码这一点很重要。新手最容易写的代码就是把密码明文放进字典里比如users {1001: {password: 123456}}。一旦老师在验收时打开accounts.json看到所有密码都是明文就很尴尬。课程设计级别不需要搞多复杂的加密用hashlib做一次SHA-256就够说明问题。2.3 ATMSystem类的业务方法划分ATMSystem负责的事情非常明确启动时加载数据运行时展示菜单并分发指令退出时保存数据。不要把业务逻辑全塞进菜单循环里否则run方法会变成几百行的“大泥球”。我当时给学弟的核心设计是这样的class ATMSystem: def __init__(self, data_fileaccounts.json): self.data_file data_file self.accounts {} self.current_account None def run(self): self.load_data() while True: choice self.show_menu() if choice 0: self.save_data() print(感谢使用再见) break self.handle_choice(choice) def handle_choice(self, choice): if choice 1: self.login() elif choice 2: self.deposit() # ...菜单数字对应到方法比在run里写十几个elif要清爽。show_menu负责打印菜单和读取输入handle_choice负责分发login、deposit这一层才是业务操作。登录成功后的状态管理也要注意。self.current_account是当前登录账户引用余额查询、取款、转账都依赖它。退出登录时置为None这样能避免“退出后还能操作上一个账户”的逻辑漏洞。别小看这个状态管理很多人写崩就是在“当前用户是谁”这个问题上没理干净。3. 核心代码实现细节3.1 数据持久化JSON的读写方案数据持久化是整个课设里最关键的一环。程序跑完关掉再打开数据还在这个需求直接决定了作业能不能拿高分。我建议把所有账户数据放在一个字典里每次开户或修改余额后立即保存。保存格式大概长这样{ 10001: { name: 张三, password_hash: 8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92, balance: 1500.00, transactions: [ [deposit, 500.00], [withdraw, 100.00] ] } }读取数据的函数要注意处理文件不存在、文件内容损坏的情况def load_data(self): if not os.path.exists(self.data_file): return try: with open(self.data_file, r, encodingutf-8) as f: raw_data json.load(f) for acc_id, info in raw_data.items(): account Account( acc_id, info[name], info[password_hash], info[balance] ) account.transactions info.get(transactions, []) self.accounts[acc_id] account except json.JSONDecodeError: print(数据文件损坏请检查 accounts.json)这里有一个很重要的设计思路数据文件里存的是“数据”不是“对象”。Account对象是在程序运行时动态构建出来的不能直接把Python对象序列化进JSON因为那会让存储格式和代码强耦合改一个类属性就得迁移数据。写入的时候反过来def save_data(self): data_to_save {} for acc_id, acc in self.accounts.items(): data_to_save[acc_id] { name: acc.name, password_hash: acc.password_hash, balance: acc.balance, transactions: acc.transactions, } with open(self.data_file, w, encodingutf-8) as f: json.dump(data_to_save, f, ensure_asciiFalse, indent2)ensure_asciiFalse这一行必须写不然中文会变成\u5f20\u4e09虽然读回来没问题但你打开文件看到全是转义字符老师印象分直接降低。indent2让JSON可读性更好这些细节都是加分项。3.2 开户、登录、转账的关键逻辑开户的逻辑要点是账号不能重复。生成账号最简单的方式是读取当前文件里所有账号的最大值加一def create_account_id(self): if not self.accounts: return 100001 max_id max(int(acc_id) for acc_id in self.accounts) return str(max_id 1)这个方案在没有并发冲突的课设前提下完全够用而且新账号看起来自然。登录时校验逻辑不要写成“拿用户输入的密码直接和文件里的字段比”。正确流程是先通过账号找到账户然后对输入的密码做同样的SHA-256处理再和文件里存的hash比较。至于密码是不是等于“123456”那是另一回事你至少做了哈希这一步数据的敏感程度就完全不一样了def verify_password(password, password_hash): hashed hashlib.sha256(password.encode(utf-8)).hexdigest() return hashed password_hash这里要补充一个细节登录失败时程序应该给出“账号不存在”和“密码错误”两种提示而不是笼统地说“登录失败”。从教学角度讲老师问“你如何处理错误输入”时你能说出错误分类就说明你考虑过边界场景。转账是另一个容易出bug的功能。很多人写转账时先扣钱再给目标账户加钱如果中间某个步骤报错两边数据就乱了。虽然课程设计不要求严格的事务但至少要做到“先验证后操作”def transfer(self, target_id, amount): amount Decimal(amount) if amount 0: return False, 转账金额必须大于0 if target_id self.current_account.account_id: return False, 不能转账给自己 target self.accounts.get(target_id) if target is None: return False, 目标账户不存在 if amount Decimal(self.current_account.balance): return False, 余额不足 # 全部验证通过后再执行扣款和入账 self.current_account.withdraw(amount) target.deposit(amount) return True, 转账成功以“先验证后操作”为核心逻辑能极大降低数据不一致的风险。答辩时老师问“你担心两个账户同时转账会怎样”你可以诚实回答“课设层面没有做并发控制但我在单用户操作下保证了先校验再执行如果要做并发就需要引入数据库锁或事务”这句话足以证明你想过这个问题。3.3 主菜单循环与输入容错菜单循环是整个程序的心脏。它要一直转直到用户选择退出。最简单的实现def show_menu(self): while True: print( * 30) print(1. 登录) print(2. 存款) # ... print(0. 退出) choice input(请选择: ).strip() if choice.isdigit() and choice in menu_options: return choice print(无效选项请重新输入)关键是isdigit()这一层校验。如果用户输入“abc”int(abc)会抛ValueError程序直接崩溃。isdigit先拦住能避免绝大多数输入崩溃问题。现金类金额输入也一样建议统一封装一个读取正数的函数def read_positive_amount(prompt): while True: value input(prompt).strip() try: decimal_value Decimal(value) if decimal_value 0: return decimal_value print(金额必须大于0) except InvalidOperation: print(请输入合法的数字)这个函数把“输入转Decimal”和“校验大于0”一次性解决。你在所有取款、存款、转账处都复用这个函数整个程序的输入鲁棒性会提升一个档次。4. 实际运行中遇到的那些坑4.1 金额精度float惹的祸这是我在帮学弟调试时让他“当场崩溃”的经典案例。用户存了0.1元再存0.2元余额显示居然是0.30000000000000004。他一脸震惊我说这就是float的真实样子。原因是计算机用二进制表示浮点数而0.1的二进制表示是无限循环小数没办法精确存储。你用float做金融计算累加次数越多误差越明显。ATM系统打交道的是钱余额出现0.30000000000000004这种数字老师直接能抓住把柄。解决方案就是之前提到的用Decimal做运算用字符串存文件。Decimal十进制基于十进制运算能精确保留小数位专门为金融计算设计。在代码里只要统一使用Decimal就不会再出现浮点误差问题。这一点在答辩时非常加分因为它说明你理解了float的底层机制而不是只会调round()。4.2 文件读写与中文编码另一个高发问题是编码。学弟第一次跑数据加载时直接报UnicodeDecodeError原因是他用记事本打开accounts.json另存为成了ANSI编码。解决办法是统一在代码中指定encodingutf-8同时告诉用户不要用记事本随便改数据文件。Windows终端下打印中文可能乱码也是常见问题。最直接的解决方式是让脚本支持UTF-8import sys import io sys.stdout io.TextIOWrapper(sys.stdout.buffer, encodingutf-8)或者更简单在运行窗口执行chcp 65001切换代码页。当然不同环境有差异我的经验是代码里所有文件读写都显式带上encodingutf-8是一种最规范的兜底方案。相对路径也是坑。如果用户不是在脚本所在目录运行程序open(accounts.json, w)可能把文件写到当前命令行的目录里去。稳妥做法是让数据文件路径跟随脚本位置from pathlib import Path BASE_DIR Path(__file__).resolve().parent DATA_FILE BASE_DIR / accounts.json这样无论在哪个目录运行都能找到正确数据文件。4.3 常见问题速查表现象原因解决方法程序一输字母就崩int()遇到非数字input后用isdigit()判断或try/except包住余额出现0.30000000000000004使用float做金额运算改用Decimal文件里存字符串中文乱码文件编码与程序读取编码不一致读写统一添加encodingutf-8文件找不到相对路径取决于命令行位置用Path(__file__).resolve().parent定位重启后数据没了没有调用save_data()每次开户和交易后立即保存转账后余额变成负数没做余额校验取款前先比较Decimal金额校验不过不执行JSON文件损坏后程序崩溃没有捕获JSONDecodeErrortry/except包裹json.load并给出提示改完密码后原密码还能登录旧密码未校验先验证旧密码再更新新密码hash这些坑不是每个教程都会写但你在调试过程中大概率都会踩到。提前把这些场景跑一遍交作业时的信心完全不一样。5. 交作业和答辩前必须做的几件事5.1 先跑一遍完整的测试用例现在代码写完了不代表可以交。我让学弟按下面这个清单完整跑了两遍每一遍都记录结果编号测试场景预期结果1新用户开户生成新账号文件里多一条记录2用新账号登录登录成功进入菜单3存款50.50余额增加50.50流水新增1条4取款30.00余额减少30.00流水新增1条5取款超过余额提示余额不足余额不变6取款金额为0或负数提示金额必须大于0余额不变7转账给不存在的账号提示目标账户不存在两边余额都不变8修改密码后用旧密码登录旧密码登录失败新密码成功9退出程序重启数据还在流水还在10输入abc乱按菜单程序不崩溃提示无效选项这个表本身就是答辩素材。老师问“你测试过哪些场景”你把这个清单念出来比说“我测过没问题”有说服力得多。5.2 自己给自己做一次代码审查代码写完先通读一遍重点检查以下几类问题有没有全局变量在多个函数中被乱改如果有考虑收进类里有没有函数超过50行还在继续堆如果有考虑拆成两个方法有没有地方只写了except Exception然后什么都不做这是大忌异常不能默默吞掉注释是不是在解释“做什么”而不是“为什么”比如# 余额加100这种注释没有价值# 用Decimal避免浮点误差才有价值有没有把print()写进业务方法里如果有考虑返回结果让调用方打印。我当时给学弟的代码做审查至少帮他改了十几处潜在问题。每一处都是那种“现在不改也能跑但老师一问就得卡壳”的类型。5.3 老师最爱追问的几个点答辩时老师的问题其实可以提前预判我整理了这份QA基本覆盖这种课设的高频提问“为什么用JSON存数据不用CSV”回答思路账户和交易流水天然有嵌套结构JSON用字典表示非常直接CSV要处理转义和表头对齐中文编码也容易出问题。JSON是标准库自带、结构清晰、可读性好。“为什么用hash存密码”回答思路明文密码写入文件不安全一旦文件泄露所有用户密码暴露。SHA-256是不可逆哈希存储哈希值至少能保证原始密码不会直接泄露。虽然课程设计级别不需要加盐但知道这个方向已经不简单。“余额能不能用float”回答思路不能。float有二进制精度问题金额应该用Decimal或者整数分来算。我实现里用的是Decimal加字符串存储。“如果两台ATM同时操作同一个账户怎么办”回答思路当前是单机单用户版本不考虑并发。要解决并发需要数据库的事务机制或文件锁这个属于扩展方向。清楚认识自己项目的边界比硬吹高级安全机制更可信。“你这个程序有没有安全问题”回答思路比如没有对连续输错密码做锁定、没有做权限控制可以坦白说这是后续可以完善的点。这种回答展示的是你对自己代码的清醒认知不是一个只会说“全部OK”的人。5.4 演示时的小技巧演示环节一个非常实用的建议提前准备一个seed_data.py运行它会生成几个现成测试账号余额各不相同。这样答辩现场不用临时开户、临时凑数据直接登录一个余额充足的账号演示取款转账效率高很多。演示之前先把程序跑一遍确保文件路径没有问题、数据文件存在。那种“现场演示翻车”的情况大多数不是代码能力问题而是准备工作没做好。把测试流程走一遍把话术提前想好展示效果会比临场发挥强得多。我帮学弟整理这套课设的过程中最大的收获其实不是代码本身而是帮他建立了一个意识写完不代表做完能过测试、能回答追问、能讲清楚设计取舍才算真正完成。ATM这个题目虽然简单但它是非常好的练手机会能把登录、业务操作、文件持久化、异常处理这几个点串联起来其实就是一个小型业务系统的雏形。最后分享一个我自己的小习惯每次修改代码后先跑一遍固定的测试脚本再手动玩几个边界输入确认没有回归问题再继续改下一个功能。课设周期短靠的是稳定推进而不是一次性憋大招。按这个节奏来交上去之前基本不会翻车。

相关新闻

SPIFFE+Modbus:工业现场零信任身份网关落地实践与踩坑记录

SPIFFE+Modbus:工业现场零信任身份网关落地实践与踩坑记录

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

2026/10/14 1:18:06 阅读更多 →
STM32标准外设库开发实战:结构、移植与避坑指南

STM32标准外设库开发实战:结构、移植与避坑指南

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

2026/10/14 1:18:06 阅读更多 →
人工智能考博上岸与读博核心课:数据结构与算法分析、模式识别与机器学习避坑指南

人工智能考博上岸与读博核心课:数据结构与算法分析、模式识别与机器学习避坑指南

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

2026/10/14 1:18:06 阅读更多 →

最新新闻

把Antigravity封装成外部Skill,让Codex/Claude Code突破上下文与配额墙

把Antigravity封装成外部Skill,让Codex/Claude Code突破上下文与配额墙

最近在折腾 Codex 和 Claude Code 的混合工作流时,我遇到了一个很实际的问题:单次会话的上下文窗口有限,而一些任务又特别吃资源,反复把代码贴进贴出,很快就撞上了配额墙。后来我想到一个办法——把 Google Antigravit…

2026/10/14 6:16:25 阅读更多 →
AnyPS5:局域网内聚合PS5存档备份、奖杯统计与串流控制的本地工具

AnyPS5:局域网内聚合PS5存档备份、奖杯统计与串流控制的本地工具

最近在做的一个小项目,名字叫 AnyPS5,起因挺朴素的:我自己手头有两台不同型号的主机,平时要在它们之间来回切换着玩。但存档散落在不同设备上,每次都要手动导来导去;想看个奖杯统计,要么开网页等…

2026/10/14 6:16:25 阅读更多 →
项目管理十五至尊图解析与实战应用

项目管理十五至尊图解析与实战应用

1. 项目管理知识体系全景解析在项目管理领域摸爬滚打十几年,我见过太多同行被各种框架图表绕得晕头转向。今天要聊的这个"十五至尊图"堪称项目管理界的"武功秘籍",它把PMBOK的十大知识领域和五大过程组用一张矩阵图完美呈现。第一次…

2026/10/14 6:16:25 阅读更多 →
开源年会进化论:从“同好聚会”到开发者年度节点

开源年会进化论:从“同好聚会”到开发者年度节点

1. 为什么一场开源年会能上得了报纸,还能拿下“最受开发者欢迎”我是在朋友圈刷到这条消息的:COSCon‘25 第十届中国开源年会登上了《中国日报》,同时被思否评为了“最受开发者欢迎的技术活动”。说实话,第一反应不是“厉害”&…

2026/10/14 6:16:25 阅读更多 →
今天周几?JS两行代码背后:getDay()跨语言映射与时区陷阱全解析

今天周几?JS两行代码背后:getDay()跨语言映射与时区陷阱全解析

这个标题我太熟了。刚学编程那阵子,天天在控制台里敲new Date(),盯着那一长串输出发懵:年份、月份、日期、时分秒都在眼前,唯独“今天周几”这个最常用、最直觉的信息,反而要再查一眼文档才能拿到。后来才懂&#xff0…

2026/10/14 6:16:25 阅读更多 →
Java面试必看:3大核心技巧轻松拿offer

Java面试必看:3大核心技巧轻松拿offer

不少朋友常常发送私下消息给我, 向我抱怨说, 他们在参加 Java 这个编程语言相关职位面试的时候, 会碰到一些让人头痛的情况(这里, 我从里面挑选出了几个比较具有代表性的例子来说明):不管是求职还是为了晋升, 面试是我们谁都不能逃避的一件事情。除了低头…

2026/10/14 6:15:24 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/13 22:01:27 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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 阅读更多 →