Python直连SQL Server实现图书借阅事务控制
简介这是一套面向计算机专业本科生的课程设计级Web图书管理系统实现方案基于Python后端与SQL Server数据库开发完整覆盖图书馆借阅全流程业务场景适用于数据库原理、Web开发及软件工程类课程实践。资源包共183个文件包含23个HTML前端页面、16个核心Python业务逻辑文件、13个JavaScript交互脚本、10个CSS样式文件以及35张界面截图和27个编译后的pyd模块整体压缩包大小为11.63MB结构清晰涵盖用户登录、借阅/还书/延期、图书增删改查、多角色权限管理学生、教师、普通管理员、超级管理员等完整功能模块。目前已有701人学习下载资源提供可直接运行的本地部署环境含activate.bat等环境启动脚本、Bootstrap前端框架集成样式bootstrap.css等、基础数据库建表与初始化脚本以及Xmind项目思维导图和配套说明文档便于理解系统分层架构与权限控制逻辑。1. 图书管理系统为什么不能只靠 Flask SQLite 就交差——当借阅并发量突破 50SQL Server 的连接池和事务锁立刻显形某高校实验室接了个教学实训项目用 Python 做一个带 Web 界面的图书管理系统要求支持多用户同时查书、借书、还书数据要能长期存、不丢、可备份。学生第一反应是Flask SQLite——轻量、上手快、本地跑得飞起。结果一到小组联调借书按钮点三下只成功一次后台日志疯狂刷database is locked导出借阅报表时卡死 2 分钟Excel 打开全是#REF!更糟的是期末清库重置数据时误删了books表SQLite 没法闪回只能从 Git 历史里翻三天前的.db文件硬恢复。这暴露了一个被低估的事实图书管理不是静态展示而是典型的 OLTP 场景——短事务密集、读写混合、一致性敏感、运维需留痕。SQL Server 在连接复用、行级锁粒度、T-SQL 存储过程封装业务逻辑、以及 SQL Server Management StudioSSMS提供的可视化备份/还原/审计日志能力上对这类系统有不可替代性。本篇就带你用python-pyodbc直连 SQL Server绕过 ORM 抽象层把借书这个“看似简单”的操作拆解成事务控制、参数化查询、错误码映射、连接池配置四步落地全程不碰 Django Admin 或 Flask-SQLAlchemy 的自动魔法——因为生产环境里你得知道每一行 SQL 是怎么发出去、怎么被锁住、又怎么被释放的。2. 用 pyodbc 在本地跑通 SQL Server 连接最小命令 必配驱动验证2.1 安装驱动与连接字符串构造别再信“Windows 自带 ODBC”这种玄学SQL Server 连接不是pip install pyodbc就完事。pyodbc 只是 Python 的 ODBC 桥梁底层依赖操作系统级的 ODBC 驱动。Windows 用户常误以为系统自带驱动就能连实测发现 Win10/11 自带的ODBC Driver 11 for SQL Server已停更不支持 TLS 1.2 强制加密SQL Server 2019 默认启用连接时会报错SSL Provider: The certificate chain was issued by an authority that is not trusted。正确做法是手动安装 Microsoft 官方最新驱动# 下载地址直接复制到浏览器打开 # https://learn.microsoft.com/en-us/sql/connect/odbc/download-odbc-driver-for-sql-server?viewsql-server-ver16 # 选 ODBC Driver 18 for SQL Server2023 年主流稳定版 # 安装时勾选 Add to PATH验证驱动是否生效不用写 Python 脚本先用命令行工具odbcad32.exeWin或isqlLinux/macOS直连# Windows运行 odbcad32.exe → “系统 DSN” → 点“添加” → 选 ODBC Driver 18 for SQL Server → 填服务器名、数据库名、账号密码 → 点“完成” → 点“测试” # Linux/macOS先装 unixODBC再执行 isql -v YourDSNName sa YourPassword提示如果isql报Data source name not found说明 DSN 未注册若报Login timeout expired检查 SQL Server 是否启用 TCP/IP 协议SQL Server Configuration Manager → 协议 → TCP/IP → 启用、防火墙是否放行 1433 端口。2.2 构造安全连接字符串Server/Database/User/Password 四要素缺一不可pyodbc 的连接字符串是纯文本但必须严格按 ODBC 规范拼接。常见错误是把 IP 和端口写成127.0.0.1:1433冒号分隔实际应写为Server127.0.0.1,1433逗号分隔import pyodbc # ✅ 正确显式指定驱动、服务器、端口、数据库、认证方式 conn_str ( DRIVER{ODBC Driver 18 for SQL Server}; SERVER127.0.0.1,1433; DATABASELibraryDB; UIDsa; PWDYourStrongPassw0rd; Encryptyes; # 强制 TLS 加密SQL Server 2019 必须 TrustServerCertificateno; # 不信任自签名证书生产环境必须为 no Connection Timeout30; ) try: conn pyodbc.connect(conn_str) print(✅ 连接成功) conn.close() except Exception as e: print(f❌ 连接失败{e})关键参数说明Encryptyes强制客户端与服务端间通信加密避免明文传输密码TrustServerCertificateno拒绝接受服务端自签名证书防止中间人攻击开发时若用自签名证书可临时设为yes但上线前必须换正式证书Connection Timeout30连接超时设为 30 秒避免前端请求无限等待UID/PWDSQL Server 混合模式登录凭据若用 Windows 身份验证改用Trusted_Connectionyes但 Web 服务部署时通常禁用此模式。3. 图书借阅核心事务从“查库存→扣余量→记流水”三步原子化落地3.1 设计符合 ACID 的借阅存储过程把业务逻辑锁进数据库层Web 层直接拼 SQL 执行UPDATE books SET stock stock - 1 WHERE isbn ?是高危操作。并发借同一本书时两个请求同时读到stock1都执行-1结果变成stock-1。正确解法是把“查-判-改”三步封装进 SQL Server 存储过程利用UPDATE ... OUTPUT原子返回影响行数与新值-- 在 SQL Server 中创建存储过程 CREATE PROCEDURE sp_BorrowBook isbn VARCHAR(13), borrower_id INT, result_code INT OUTPUT, -- 返回码0成功-1无库存-2书不存在 new_stock INT OUTPUT -- 返回更新后的库存 AS BEGIN SET NOCOUNT ON; -- 步骤1尝试更新库存仅当 stock 0 时才减1 UPDATE books SET stock stock - 1, updated_at GETDATE() OUTPUT INSERTED.stock INTO new_stock WHERE isbn isbn AND stock 0; -- 步骤2检查是否更新成功 IF ROWCOUNT 0 BEGIN -- 检查书是否存在 IF EXISTS (SELECT 1 FROM books WHERE isbn isbn) SET result_code -1; -- 库存不足 ELSE SET result_code -2; -- 书不存在 RETURN; END -- 步骤3记录借阅流水独立事务但因在同一个 SP 内自动包含在主事务中 INSERT INTO borrow_records (isbn, borrower_id, borrow_time) VALUES (isbn, borrower_id, GETDATE()); SET result_code 0; SET new_stock (SELECT stock FROM books WHERE isbn isbn); END注意OUTPUT INSERTED.stock是 SQL Server 特有语法比SELECT stock FROM books WHERE isbn ?更安全——它确保返回的是本次UPDATE实际写入的值不受其他并发修改干扰。3.2 Python 调用存储过程并处理返回码用callproc替代executepyodbc 调用存储过程必须用cursor.callproc()传参顺序严格对应 SP 定义顺序输出参数需用pyodbc.SQL_OUTPUT标记def borrow_book(isbn: str, borrower_id: int) - dict: conn None try: conn pyodbc.connect(conn_str) cursor conn.cursor() # 定义输出参数必须用 pyodbc.SQL_OUTPUT result_code pyodbc.SQL_OUTPUT new_stock pyodbc.SQL_OUTPUT # 调用存储过程参数顺序isbn, borrower_id, result_code OUTPUT, new_stock OUTPUT cursor.callproc(sp_BorrowBook, [isbn, borrower_id, result_code, new_stock]) # 获取输出参数值注意callproc 不返回结果集需用 cursor.nextset() 切换 cursor.nextset() # 切到第一个结果集即 OUTPUT 参数 # 但 pyodbc 对 OUTPUT 参数的获取较特殊更可靠方式是用命名参数见下方改进版 return { success: result_code 0, new_stock: new_stock if result_code 0 else None, code: result_code } except Exception as e: print(f借书异常{e}) return {success: False, code: -999} finally: if conn: conn.close() # ✅ 更健壮的调用方式推荐用命名参数 fetchone() def borrow_book_safe(isbn: str, borrower_id: int) - dict: conn pyodbc.connect(conn_str) cursor conn.cursor() # 使用命名参数明确指定输入/输出 params ( (isbn, isbn), (borrower_id, borrower_id), (result_code, pyodbc.SQL_OUTPUT), (new_stock, pyodbc.SQL_OUTPUT) ) cursor.execute({CALL sp_BorrowBook (?, ?, ?, ?)}, isbn, borrower_id, 0, 0) # 占位符填 0实际值由 OUTPUT 返回 # 获取输出参数需先执行 nextset 到结果集 cursor.nextset() row cursor.fetchone() if row: result_code, new_stock row[0], row[1] else: result_code, new_stock -999, None conn.close() return {success: result_code 0, new_stock: new_stock, code: result_code}为什么不用 ORMDjango ORM 的select_for_update()虽能加行锁但跨表关联复杂时锁范围难控Flask-SQLAlchemy 的session.begin_nested()在长事务中易引发连接泄漏。而存储过程把锁逻辑固化在数据库层Web 层只需关心“调用成功与否”降低分布式事务协调成本。4. 避坑SQL Server 连接与事务的 5 个血泪经验4.1 现象Flask 多进程下连接池失效每个请求新建连接导致 SQL Server 连接数爆满原因pyodbc 默认不启用连接池Flask 的threadedTrue默认或processesN模式下每个线程/进程都新建物理连接SQL Server 默认最大连接数 32767但实际受内存限制100 并发可能就耗尽。解决在连接字符串中启用 ODBC 连接池并设置合理超时conn_str_pool ( DRIVER{ODBC Driver 18 for SQL Server}; SERVER127.0.0.1,1433; DATABASELibraryDB; UIDsa; PWDYourStrongPassw0rd; Encryptyes; TrustServerCertificateno; Connection Timeout30; Poolingyes; # ✅ 启用连接池 Max Pool Size100; # ✅ 最大连接数根据服务器内存调整 Min Pool Size5; # ✅ 最小空闲连接数防冷启动延迟 Connection Lifetime300; # ✅ 连接最大存活时间秒防长连接僵死 )4.2 现象借书成功但borrow_records表没数据日志显示Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT statements原因存储过程中INSERT INTO borrow_records未显式包裹在BEGIN TRAN / COMMIT中而 SQL Server 对隐式事务处理严格。当 SP 内部有多个 DML 语句时必须统一事务边界。解决重写 SP显式控制事务CREATE PROCEDURE sp_BorrowBook isbn VARCHAR(13), borrower_id INT, result_code INT OUTPUT, new_stock INT OUTPUT AS BEGIN SET NOCOUNT ON; BEGIN TRY BEGIN TRANSACTION; UPDATE books SET stock stock - 1, updated_at GETDATE() WHERE isbn isbn AND stock 0; IF ROWCOUNT 0 BEGIN IF EXISTS (SELECT 1 FROM books WHERE isbn isbn) SET result_code -1; ELSE SET result_code -2; ROLLBACK TRANSACTION; RETURN; END INSERT INTO borrow_records (isbn, borrower_id, borrow_time) VALUES (isbn, borrower_id, GETDATE()); SET result_code 0; SET new_stock (SELECT stock FROM books WHERE isbn isbn); COMMIT TRANSACTION; END TRY BEGIN CATCH ROLLBACK TRANSACTION; SET result_code -999; END CATCH END4.3 现象中文书名插入后变成?????SELECT出来全是问号原因SQL Server 数据库/表/列的排序规则Collation未设为Chinese_PRC_CI_AS或UTF8兼容排序规则且连接字符串未声明字符集。解决创建数据库时指定排序规则CREATE DATABASE LibraryDB COLLATE Chinese_PRC_CI_AS;连接字符串加CharsetUTF8ODBC Driver 18 支持conn_str DRIVER{ODBC Driver 18 for SQL Server};...;CharsetUTF8;表字段用NVARCHAR而非VARCHARALTER TABLE books ALTER COLUMN title NVARCHAR(200) NOT NULL;4.4 现象pyodbc.Error: (HY000, The driver did not supply an error for this error)原因SQL Server 错误严重级别Severity低于 11ODBC 驱动默认不抛出或错误发生在连接建立前如 DNS 解析失败。解决捕获pyodbc.Error后打印e.args全信息并开启 ODBC 日志定位import os os.environ[ODBC_TRACE] 1 # 生成 odbc.log 文件 os.environ[ODBC_TRACEFILE] odbc.log4.5 现象Flask 重启后首次请求极慢10s后续正常原因ODBC 连接池冷启动时需加载驱动、建立首个连接、验证证书链耗时集中在第一次。解决应用启动时预热连接池# app.py 开头 def warm_up_db(): try: conn pyodbc.connect(conn_str) conn.close() print(✅ 数据库连接池预热完成) except Exception as e: print(f⚠️ 预热失败忽略{e}) warm_up_db() # 应用启动时立即执行5. 连接池监控与故障自愈用 SQL Server DMV 实时看穿连接状态5.1 用系统视图定位慢查询与阻塞源头三张表吃透连接健康度SQL Server 提供动态管理视图DMV实时反映连接状态。把以下查询做成 Flask 管理接口/api/db/status运维时一眼看清瓶颈查询目标SQL 语句关键字段说明当前活跃连接SELECT session_id, login_name, host_name, program_name, status, cpu_time, reads, writes FROM sys.dm_exec_sessions WHERE status runningcpu_time 10000 毫秒表示 CPU 过载reads 100000 表示 I/O 密集阻塞链路SELECT blocking_session_id, session_id, wait_type, wait_duration_ms, resource_description FROM sys.dm_os_waiting_tasks WHERE blocking_session_id 0blocking_session_id0是根阻塞者wait_type为LCK_M_XX表示锁等待慢查询TOP5SELECT TOP 5 qs.execution_count, qs.total_elapsed_time/qs.execution_count AS avg_duration_ms, t.text FROM sys.dm_exec_query_stats qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) t ORDER BY avg_duration_ms DESCavg_duration_ms 500 毫秒需优化将上述查询封装为 Python 函数返回结构化 JSONdef get_db_status(): conn pyodbc.connect(conn_str) cursor conn.cursor() # 查询活跃会话 cursor.execute( SELECT session_id, login_name, host_name, program_name, status, cpu_time, reads, writes FROM sys.dm_exec_sessions WHERE status running AND login_name ! sa ) sessions [dict(zip([column[0] for column in cursor.description], row)) for row in cursor.fetchall()] # 查询阻塞任务 cursor.execute( SELECT blocking_session_id, session_id, wait_type, wait_duration_ms, resource_description FROM sys.dm_os_waiting_tasks WHERE blocking_session_id 0 ) blockers [dict(zip([column[0] for column in cursor.description], row)) for row in cursor.fetchall()] conn.close() return {active_sessions: sessions, blockers: blockers}5.2 自动 Kill 长事务当事务超过 30 秒Python 主动终止长时间未提交的事务会持有锁拖垮整个系统。用定时任务扫描sys.dm_tran_active_transactions自动干掉超时者import threading import time def kill_long_transactions(max_seconds30): while True: try: conn pyodbc.connect(conn_str) cursor conn.cursor() # 查找运行超时的事务 cursor.execute(f SELECT at.transaction_id, es.session_id, es.login_name, DATEDIFF(SECOND, at.transaction_begin_time, GETDATE()) AS duration_sec FROM sys.dm_tran_active_transactions at JOIN sys.dm_tran_session_transactions st ON at.transaction_id st.transaction_id JOIN sys.dm_exec_sessions es ON st.session_id es.session_id WHERE DATEDIFF(SECOND, at.transaction_begin_time, GETDATE()) {max_seconds} AND es.is_user_process 1 ) long_txs cursor.fetchall() for tx_id, session_id, login_name, duration in long_txs: print(f⚠️ 强制终止长事务session {session_id} ({login_name})已运行 {duration}s) cursor.execute(fKILL {session_id}) except Exception as e: print(f检查长事务异常{e}) finally: if conn in locals(): conn.close() time.sleep(10) # 每10秒检查一次 # 启动守护线程 threading.Thread(targetkill_long_transactions, daemonTrue).start()注意KILL命令需sysadmin权限生产环境应为应用账号授予最小权限GRANT VIEW SERVER STATE TO [app_user]; GRANT ALTER ANY CONNECTION TO [app_user];5.3 我的习惯每次上线前必跑的三道验证连接压测用locust模拟 200 并发借书观察 SQL Server 的Page life expectancyPLE是否跌破 300 秒内存压力信号锁粒度验证开两个终端A 终端BEGIN TRAN; UPDATE books SET stock10 WHERE isbn9787020000000;不提交B 终端查其他 ISBN 是否被阻塞——验证是否真为行锁灾备快照每周日凌晨 2 点自动执行BACKUP DATABASE LibraryDB TO DISKD:\backup\lib_$(date:yyyyMMdd).bak并用RESTORE VERIFYONLY校验备份有效性。这些不是“高级技巧”而是我经手的第 7 个图书类系统踩坑后写进部署 checklist 的铁律。SQL Server 不是黑匣子它的连接、锁、日志全在 DMV 里摊开给你看Python 不是胶水它该做粘合而不是替数据库思考事务。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

手装Tomcat:Java Web底层容器配置与生产部署指南

手装Tomcat:Java Web底层容器配置与生产部署指南

1. 为什么现在还要亲手装Tomcat?——一个被低估的Java Web基础能力很多人看到“Tomcat下载安装配置”这个标题,第一反应是:“都2024年了,还手装Tomcat?用IDE一键启动不香吗?”我完全理解这种想法——某次给…

2026/10/12 4:02:39 阅读更多 →
英语构词法实战:巧记前缀与后缀,告别死记硬背

英语构词法实战:巧记前缀与后缀,告别死记硬背

我先说一个可能很多人都有过的经历:背单词背到崩溃,abandon 翻来覆去还是 abandon,生词本越记越长,可一遇到阅读里的长难词照样懵。后来我换了个思路,不再跟字母死磕,而是专门去啃词根词缀,也就…

2026/10/11 8:22:23 阅读更多 →
研电赛企业专项奖技术拆解:RT-Thread物联网操作系统竞赛作品设计指南

研电赛企业专项奖技术拆解:RT-Thread物联网操作系统竞赛作品设计指南

1. 从一个竞赛奖项说起:为什么企业专项奖值得关注第一次听说研电赛的企业专项奖,是我在读研二的时候。当时实验室的师兄拿着一块开发板回来,说他们组拿了某个企业专项奖,奖品是开发板加一笔奖金,更重要的是——简历上多…

2026/10/10 22:56:47 阅读更多 →

最新新闻

老毛桃UEFI启动盘v7.0:稳过Secure Boot,原生支持NVMe与Win11架构识别

老毛桃UEFI启动盘v7.0:稳过Secure Boot,原生支持NVMe与Win11架构识别

简介:老毛桃U盘启动盘制作工具(UEFI版 装机版)v7.0是一款面向电脑初学者与系统维护人员的轻量级系统辅助工具,专为快速制作兼容UEFI与传统BIOS的U盘启动盘、安装原版Windows系统及执行PE环境下的故障排查而设计。资源包共2个文件&…

2026/10/12 7:07:08 阅读更多 →
Windows内核驱动开发:WDK与VC++编程实战指南

Windows内核驱动开发:WDK与VC++编程实战指南

简介:本资源是一套面向Windows驱动开发初学者与进阶工程师的VC底层驱动源码集合,聚焦内核模式编程实践,帮助开发者掌握设备驱动框架搭建、IRP处理、设备对象注册、中断服务例程及WDF模型等核心能力。压缩包共657个文件,涵盖304个头…

2026/10/12 7:07:08 阅读更多 →
C++继承深度解析:从is-a关系到多态与封装的最佳实践

C++继承深度解析:从is-a关系到多态与封装的最佳实践

我经常被问到一个问题:C学了类之后,继承到底什么时候该用?很多人把继承简单理解成“子类复用父类代码”,结果遇上多层继承就头疼。其实继承在C里不只是代码复用,它是类型系统的一部分,负责表达类型之间的“…

2026/10/12 7:07:08 阅读更多 →
VSCode+OpenRouter接入Claude模型:账号受限后恢复AI编程工作流

VSCode+OpenRouter接入Claude模型:账号受限后恢复AI编程工作流

解决Claude账号不可用的尴尬处境:用VSCode OpenRouter把模型接回编辑器1. 账号不可用之后,怎么继续用上Claude模型能力?1.1 突发情况:账号受限后的开发断档作为一个长期依赖AI辅助写代码的人,我最怕的其实不是模型回答…

2026/10/12 7:07:07 阅读更多 →
基于Java的Web漏洞扫描系统设计:从爬虫、SQL注入检测到并发控制

基于Java的Web漏洞扫描系统设计:从爬虫、SQL注入检测到并发控制

简介:面向网络安全学习者与Java开发人员的Web漏洞扫描系统设计资源,聚焦扫描引擎的整体实现,帮助理解构建思路、漏洞规则组织以及如何与Nmap脚本体系联动。压缩包内共927个文件,整体大小约33.07MB,以604个NSE脚本和146…

2026/10/12 7:07:07 阅读更多 →
基于JavaEE的网上书店项目实战:从环境配置到核心代码解析

基于JavaEE的网上书店项目实战:从环境配置到核心代码解析

简介:一份基于JavaEE的网上书店项目,包含完整源代码与SQL初始化脚本,适合作为课程设计或毕业设计,覆盖用户注册登录、图书检索、购物车结算、订单管理、后台维护、销售统计等完整业务流程。压缩包为ZIP格式,共88个文件…

2026/10/12 7:06:07 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 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/11 10:45:37 阅读更多 →
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/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练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/11 14:36:54 阅读更多 →