Python采集出版社新书数据:从官网爬虫到SQLite入库实战
开头做书店选品和图书馆采购的朋友应该都有过这样的经历每个月挨个打开出版社官网把新书栏目里的书名、作者、定价一条条复制到Excel里再手动补ISBN最后还要对着发版时间表排优先级。运气好一个月几十条运气不好赶上开学季、书展季几百条数据能对到凌晨。这套流程走下来选品工作本身的判断时间反而被挤没了。这个项目就是冲着这个痛点去的写一个Python采集程序自动逛出版社官网的新书栏目把书名、作者、ISBN、定价、上市时间这些关键字段抓下来做一次清洗入库。做出来的库既能给书店选品做月度参考也能给图书馆采购做查重比对个人藏书爱好者还能拿它做新书追踪清单。我是基于requests加BeautifulSoup这套经典组合来做的数据库先用SQLite起步后期要接业务系统再迁MySQL也方便。这套方案不需要上Scrapy这种重框架原因后面细说。适合的读者有三类一是刚学完Python基础、想拿真实项目练手的爬虫初学者二是有选品需求但不熟悉编程的图书从业者可以直接用我提供的脚本改改三是想沉淀一份个人新书数据库的藏书爱好者。1. 采集源头的选型思考为什么是出版社官网1.1 三个数据源横向对比做图书数据采集市面上可选择的数据源其实不少我实际比过三个出版社官网、电商平台、书目数据库平台。电商平台数据最全但有两个硬伤一是电商书目里混着大量预售、绝版、二手书跟出版社官方的新书上市信息不完全对齐二是电商的反爬等级向来高验证码、行为检测层层叠叠个人爬虫很难长期稳定运行。书目数据库平台数据规范但多数是面向机构收费的个人用门槛太高。出版社官网恰恰是那个“性价比”最优的选项。出版社的新书栏目天然意味着“第一手信息”——官方预告、发版时间、正式定价都在这里字段权威性没有任何间接来源能比。而且出版社官网普遍是传统企业站反爬强度一般抓取难度比电商低一个量级。对选品和采购来说官网数据已经是可靠度最高的源头。1.2 为什么用requests而不是Scrapy我见过不少初学者一上来就装Scrapy项目还没跑通先被框架的Spider、Middleware、Pipeline绕晕。这个项目的边界很清楚目标站点数量有限哪怕后期扩展到几十家出版社、单站页面结构简单、不打算做分布式调度。这种情况用requests加BeautifulSoup反而是最优解。技术选型的逻辑不复杂团队规模越大越该用框架单人小项目的优先级永远是“最快跑通、容易改”。我实测下来的开发量对比requests方案写核心代码不到两个小时就能出可用版本Scrapy光调通配置就要半天起步。当然requests方案也有代价——没有自动重试、没有内置限速器这些都要自己在代码里补。好在补的成本很低后面都会讲到。1.3 数据表结构设计建表是入库前就要想清楚的事。我第一版做得比较随意把抓到的字段直接塞进去结果去重和统计的时候处处别扭。后来改成了下面这张结构CREATE TABLE books ( id INTEGER PRIMARY KEY AUTOINCREMENT, isbn TEXT UNIQUE, title TEXT, author TEXT, publisher TEXT, price TEXT, pub_date TEXT, source_url TEXT, created_at TEXT DEFAULT (datetime(now, localtime)), updated_at TEXT DEFAULT (datetime(now, localtime)) ); CREATE INDEX idx_books_pub_date ON books(pub_date); CREATE INDEX idx_books_title ON books(title);关键设计点是isbn字段加UNIQUE约束。原因很直接同一本书在不同出版社网站可能出现多次比如丛书分册、再版预告但ISBN是唯一的身份标识。有了这个约束后续入库时天然做了幂等同一个ISBN重复跑几遍采集程序都不会产生脏数据。pub_date和title加索引是因为未来的查询大概率走这两个字段——选品按时间排序采购按书名模糊检索。price字段我用TEXT类型而非浮点型这个细节很多人会不理解。图书定价在业务上有两类特殊值一类是区间价常见于丛书标注比如“全套68.00-98.00”一类是“估定价”还没最终确定时出版社先写个范围。这两类转成浮点型都要丢信息干脆全部存成字符串清洗时保证格式统一即可真要做数学运算时再在代码里转换。2. 出版社官网的常见形态与解析细节2.1 三种页面结构对应三种采集策略我扒过不下二十家出版社官网新书栏目大体逃不出三种结构。第一种是静态HTML列表页书名、作者、定价全都躺在ul标签里这种最好办直接解析列表页就能拿到全部字段。第二种是动态渲染页面打开浏览器能看到数据但查看源码只有一段空壳div数据是JS异步请求拉回来的这种情况要用开发者工具抓接口。第三种是列表页只给书名和封面链接作者、ISBN、定价这些细粒度信息藏在详情页里这就要写两层采集逻辑——先解析列表拿链接再逐个进详情页抓全量字段。判断一个页面属于哪种形态不需要猜用时一分钟就能确认打开页面后右键查看网页源代码CtrlF搜书名。搜得到就是静态搜不到基本就是动态渲染。如果是动态渲染切到Network面板刷新页面在XHR请求里找返回JSON的那个接口把接口地址复制出来直接requests请求往往就能拿数据。2.2 请求伪装与频率控制出版社官网反爬强度确实不高但它属于“老而不弱”——很多站挂了基础的安全设备不带Headers直连很容易被拦。我踩过的第一个坑就是裸请求返回403。解决方案也简单构造一个完整的请求头headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36, Accept: text/html,application/xhtmlxml,application/xml;q0.9,image/webp,*/*;q0.8, Accept-Language: zh-CN,zh;q0.9, Referer: https://www.example-press.com/, }这个headers配置的要点不在UA本身而在完整性。很多入门资料只教你设置User-Agent但实际排查下来真正触发拦截的往往是缺少Referer或者Accept-Language异常。把浏览器正常发出的请求头完整搬过来是成本最低的“像真人”方案。请求频率的控制策略我建议用固定区间随机延迟不要用固定延迟。写time.sleep(1)这种固定间隔碰到同一IP大批量访问时特征反而明显随机化之后time.sleep(random.uniform(1.0, 2.5))服务器侧看到的是一串无规律的访问节奏。还有一个小技巧对同一域名的并发要严格禁止。requests库本身是同步的但如果你写了ThreadPoolExecutor去加速请务必记住——出版社官网不是高并发测试场线程数设到5以上被封是分分钟的事。2.3 编码处理的两个层次出版社官网老站多编码可以说是“百花齐放”——UTF-8、GBK、GB2312都有。不处理编码问题抓出来的书名直接就是一团乱码。我的做法是两层保险第一层在响应级别判断用response.apparent_encoding代替response.encodingresponse requests.get(url, headersheaders) response.encoding response.apparent_encodingapparent_encoding是requests基于内容自动推断的编码比手动指定稳妥得多。第二层在网页里meta标签找编码声明有些老站会在HTML里写死charset通过正则提取出来再赋值给response.encoding。实测下来第一层覆盖了九成以上的情况剩下的个别老站第二层能兜住。2.4 字段采集的典型格式陷阱跑通采集逻辑后真正的体力活在字段清洗上。书名看起来最简单实则有两个坑一是丛书名和分册名混在一起二是副标题和主标题之间分隔符不统一中文冒号、英文冒号、空格都有。我在清洗阶段统一处理丛书信息单独存到备注字段主标题用正则按分隔符拆开保留副标题拼回标题后面。作者字段的坑在于“多人作者、译者、编委会”。出版社官网常见的格式是“张三 李四 著”、“王五 译”或者干脆写“本书编写组编”。清洗原则是保留原始字符串不动新增author_normalized字段做拆分——把“著”“译”“编”“主编”这些角色词后面的职务词去掉多作者按顿号拆开。拆分不追求十全十美能保证搜索和展示即可。ISBN字段是最需要校验的因为出版社官网偶尔会漏打校验位或者用“ISBN-13978-7-xxx”这种带前缀的格式。后面第3部分会写专门的校验函数这里先记住一个原则任何来源的ISBN都不能直接入库必须过校验函数。定价字段的格式最多变。我收集到的真实样例至少包含六种形态“68.00”“¥68.00”“定价68.00元”“68.00元/册”“68.00-98.00”“估定价68.00”。清洗不是要抹平这些差异而是统一转换成正则可匹配的基准格式再把是否区间价、是否估定价单独记字段。3. 从请求到入库的完整采集过程3.1 主程序结构与请求封装整个采集程序我设计成四个模块请求模块、解析模块、清洗模块、存储模块。分模块是刻意为之——出版社官网改版太常见了改版只会影响解析模块其他三个模块可以完全不动。请求模块的核心是一个带重试机制的请求函数import requests import time import random def fetch_html(url, headers, timeout10, max_retries3): for attempt in range(max_retries): try: response requests.get(url, headersheaders, timeouttimeout) if response.status_code 200: response.encoding response.apparent_encoding return response.text elif response.status_code in (403, 429): print(f[{response.status_code}] 触发反爬等待后重试...) time.sleep(random.uniform(10, 20)) else: print(f[{response.status_code}] 非预期状态码) except requests.RequestException as e: print(f网络异常: {e}) time.sleep(random.uniform(1, 3)) return None这里有一个反爬设计上的细节403和429不是简单重试而是长等待。很多反爬策略是按时间窗口计数触发封禁的比如一分钟内超过30次请求封10分钟。如果403后还按短间隔重试等于在封禁窗口内反复试探只会把封禁时间越拖越长。等待10到20秒再试往往窗口正好过去了。主程序的执行流程是这样的先读取站点配置列表每个出版社是一个配置字典里面存着站点名、列表页URL、页面编码方式、列表页解析规则。循环遍历配置对每个站点执行“拉列表页、解析图书链接、逐条进详情页、清洗、入库”。整体串行执行不并发。3.2 详情页解析的通用写法我实测下来的通用性最好的解析策略是用BeautifulSoup定位图书详情容器然后按字段逐层向下查找。很多出版社网站的详情页结构存在一个共性——图书信息是一个表格表格的左侧单元格是字段名右侧是字段值。针对这种结构写解析规则通用性远超按固定CSS路径写死。from bs4 import BeautifulSoup def parse_detail(html, source_url): soup BeautifulSoup(html, html.parser) info_table soup.find(table, class_bookInfo) or soup.find(div, class_bookDetail) if not info_table: return None fields {} if info_table.name table: for row in info_table.find_all(tr): cells row.find_all(td) if len(cells) 2: label cells[0].get_text(stripTrue) value cells[1].get_text( , stripTrue) fields[label] value else: rows info_table.find_all(li) for item in rows: text item.get_text( , stripTrue) if in text: label, value text.split(, 1) fields[label.strip()] value.strip() return fields这段代码的关键在get_text( , stripTrue)这个带分隔符的取文本方式。书名、作者这种短字段看不出差别但图书简介这种长文本领域不加分隔符会把段落全部拼在一起加了空格分隔后续切割才有依据。解析后的字段是杂乱的字典形如{书名: xxx, 作者: xxx, ISBN: xxx}。这些键名不同出版社不完全一致所以清洗模块要做一次键名归一化映射。我把常见叫法收集成一个映射表FIELD_MAPPING { 书名: title, 图书名称: title, 作者: author, 作者简介: author, ISBN: isbn, 国际标准书号: isbn, 定价: price, 价格: price, 出版时间: pub_date, 上市时间: pub_date, 出版日期: pub_date, }3.3 标准清洗函数实现字段清洗是整个项目里最容易写得粗糙的环节也是后期数据质量好坏的胜负手。我写了三个独立的清洗函数分别处理ISBN、定价和日期。先说ISBN校验函数。ISBN分为10位和13位两种13位在国内图书中占比压倒性多数但老书、套装书偶尔会出现10位ISBN。校验逻辑参考国标算法import re def clean_isbn(value): if not value: return None # 去掉常见杂质 isbn value.strip().replace( , ).replace(-, ).replace(ISBN, ) isbn re.sub(r[^\dXx], , isbn) if len(isbn) 13: if isbn.isdigit(): # 13位校验 total sum(int(d) * (1 if i % 2 0 else 3) for i, d in enumerate(isbn[:12])) check (10 - total % 10) % 10 return isbn if check int(isbn[12]) else None elif len(isbn) 10: # 10位转13位前9位加978前缀重新计算校验位 if isbn[:9].isdigit(): isbn13_base 978 isbn[:9] total sum(int(d) * (1 if i % 2 0 else 3) for i, d in enumerate(isbn13_base)) check (10 - total % 10) % 10 return isbn13_base str(check) return None顺带一提这里10位转13位不是出版行业标准操作行业标准是10位和13位并存但在自有数据库里统一存成13位能让去重逻辑简单很多所以我在清洗层做了转换同时在原字段上保留原始格式备查。定价清洗函数的目标是提取“数字部分”和“价格类型”两个信息:def clean_price(value): if not value: return None, None text value.replace(定价, ).replace(价格, ).replace(, :).strip() is_range — in text or ~ in text or - in text is_estimate 估 in text numbers re.findall(r\d\.?\d*, text) if not numbers: return None, None if is_range and len(numbers) 2: price_val f{numbers[0]}-{numbers[1]} else: price_val numbers[0] price_type range if is_range else (estimate if is_estimate else normal) return price_val, price_type日期清洗比定价更麻烦。出版社官网的日期格式至少有六种2025年3月、2025-03、2025.3、2025/03、2025年3月15日、2025-03-15。归一化逻辑如下def clean_date(value): if not value: return None date_match re.findall(r(\d{4})[年.\-/]?(\d{1,2})?[月.\-/]?(\d{1,2})?, str(value)) if not date_match: return None year, month, day date_match[0] if not month: return f{year}-00-00 month month.zfill(2) if not day: return f{year}-{month}-00 return f{year}-{month}-{day.zfill(2)}月份和日期缺失时我用00占位而不是直接丢弃。原因是选品场景经常要按“预计上市月份”排计划只要年份和月份信息在这条数据就有参考价值。丢掉整条数据反而亏了。3.4 幂等入库与增量更新入库逻辑用的是SQLite的INSERT OR IGNORE加UPDATE组合import sqlite3 def save_book(conn, book): if not book.get(isbn): return False sql INSERT OR IGNORE INTO books (isbn, title, author, publisher, price, pub_date, source_url) VALUES (?, ?, ?, ?, ?, ?, ?) cursor conn.execute(sql, ( book[isbn], book.get(title), book.get(author), book.get(publisher), book.get(price), book.get(pub_date), book.get(source_url) )) if cursor.rowcount 0: # 已存在做更新 conn.execute( UPDATE books SET title?, author?, price?, pub_date?, source_url?, updated_atdatetime(now, localtime) WHERE isbn? , ( book.get(title), book.get(author), book.get(price), book.get(pub_date), book.get(source_url), book.get(isbn) )) conn.commit()这套逻辑解决了一个关键业务问题同一条书在不同批次采集之间可能出现信息修正出版社改价、延期上市跑一次增量更新就能把数据库保持在新状态而不会重复插入新行。入库前还有一个必要的前置动作全量数据先过一遍重复性检查。虽然INSERT OR IGNORE挡掉了数据库层面的重复但不同出版社之间可能存在“同一本书被不同分社重复收录”的情况——这种靠ISBN唯一约束天然处理掉了。如果两本书ISBN相同但书名不同那不是重复是异常数据需要拉出来人工核对。4. 实战中踩过的坑与排查技巧4.1 高频故障速查表我挑了实际运行中最容易出现的几类问题整理成一张速查表。这些不一定都发生在你身上但遇到了直接对着查能省不少排查时间现象描述可能原因排查步骤解决建议抓回来的书名是乱码编码识别失败打印response.encoding和apparent_encoding对比强制按页面meta charset设置某个出版社始终抓不到列表列表页是动态渲染F12查看XHR接口找JSON数据源改请求接口地址解析JSON数据量第一次跑正常第二次开始变少触发了访问频率限制查看响应码是否403/429加大随机延迟区间加长封禁后等待时间同一本书出现在多个ISBN行原站ISBN字段位数不完整检查清洗函数输出严格走13位转换补全校验位入库后发现同一本书不同出版社各存了一条不同分社的网站独立维护比对source_url来源按isbn统一归并保留官方优先级一个月后页面改版解析结果全部为空页面结构变化用浏览器开发者工具重新核对标签结构只改解析规则的标签定位其余不动这些高频故障里最值得重点说的是页面改版——这不是概率问题而是必然问题。我维护这套采集脚本的过程中不到半年时间有三家出版社改版。应对改版的核心思路不是“尽量不改代码”而是把解析模块隔离得足够干净改版时只需要调整解析规则里那几个CSS选择器或者属性名。具体操作建议是每次换新出版社或者恢复老出版社的采集前先抓一页HTML存成本地文件在本地文件上调试解析逻辑。这样不会每次调试都产生线上请求既避免触发频率限制又能快速验证解析规则是否生效。4.2 三个刷新认知的实战教训第一课关于ISBN校验位。早期我只做格式清洗不做校验位验证结果某出版社官网把9787100106621写成了9787100106620一条错数据混了进去。这种错数据放到书店采购系统里直接导致采购订单发到错误的书号上。从那以后我立了个规矩一切来源的ISBN都过校验函数校验不过的直接丢弃并写日志人工复核。第二课关于请求频率的“隐形阈值”。我一度把延迟控制在1秒连续跑一两个小时也没被封但后来发现触发了更加隐蔽的限制——不封IP但开始给随机超时页面。这种比直接的403更难排查因为响应码全是200页面却时好时坏。排查了两天才定位到是频率问题。之后我把间隔调整到1.5到3秒并且每次批量采集超过1000条就自动暂停5分钟。第三课关于“作者”字段的语义处理。最开始我天真地以为作者就是一个人名清洗函数直接把多作者按顿号拆成列表。后来发现出版社官网上有大量“本社编”“本书编委会”这种单位作者还有丛书的主编和分册著者并存的情况。处理方式是保留原文不动单独拆一个“作者类型”字段存枚举值个人著者、多人合著、单位作者、佚名待定。后续做选品分析时对这个字段做分组统计才有意义。4.3 数据质量的日常巡检节奏采集程序跑起来之后不能当甩手掌柜。我的建议是每周做一次数据巡检重点看三个指标第一本周新增条数是否正常。出版社上新节奏有周期性但不会出现“连续两周零新增、第三周突然爆量800条”这种极端波动。新增数量异常往往意味着解析逻辑出问题了或者网站改版了早发现早处理成本最低。第二清洗率指标。每周统计一下清洗后isbn为NULL的数据条数正常情况下这个值应该低于总量的百分之二。高于这个数值就要去源头看是不是新增了第三种页面结构或者字段格式变了。第三抽查数据质量。随机抽5条本周入库的数据人工对比官网原始信息核对书名、定价、上市时间三个字段的准确性。这个抽查看似简单但能兜住流程里所有隐蔽问题的底。每月的选品会议前我会把这个库导成Excel或者CSV发出去。导出的格式要用标准列ISBN、书名、作者、定价、上市时间、来源链接。来源链接是很多人忽略但特别重要的一个字段——采购环节出分歧时拿着链接回到官方页面最有说服力。5. 多出版社扩展与长期运营建议5.1 从单一站点到多站点扩展整个项目跑通单家出版社之后扩展的目标是多站点。扩展要注意配置文件先行不要急着写代码。我给每个出版社维护一个配置文件记录站点名称、列表页URL、详情页URL规则、列表选择器、字段映射规则和请求间隔偏好{ name: 某社出版社, list_url: https://www.example-press.com/newbooks, list_selector: div.book-item, title_selector: h3 a, link_selector: h3 a::attr(href), detail_url: https://www.example-press.com, encoding: utf-8, delay_range: [1.5, 3.0], is_dynamic: false }解析模块读配置文件时用反射式写法映射选择器到具体解析动作。这样新接入一家出版社时做的事情就变成了抓一页HTML、填一个JSON配置、跑一遍测试全程不需要动Python代码。我实测下来接入一家新站的平均时间能从最初的半天压缩到四十分钟。扩展过程要特别注意反爬差异。出版社虽然有“老站点”的共性但有些大社的官网是统建平台托管的安全策略会比独立小站严格不少。接入这类站点时delay_range要放宽到3到5秒不要一上来就用默认频率。5.2 数据资产化从采集到应用闭环采集本身不是目的入库后怎么用才是价值所在。书店选品场景可以按月份维度做“上市新书清单”再结合价格区间、图书分类做排列。图书馆采购场景做的是查重——采购前把出版社列表导出的数据跟馆藏做ISBN匹配直接筛出已收录书目避免重复下单。个人藏书场景价值在于追踪——想关注的出版社上新了哪些书一周推送一次就好。我在这个基础上还做了一层轻量级的自动提醒每周一跑一次增量采集如果发现“某本关注的作者出了新书”或者“某本之前标记为估定价的书出了正式定价”就在终端输出一条变更提示。没有复杂的大模型就靠SQL查询和日期对比但对选品决策来说这种“变化即通知”的信息密度远超每月一份静态清单。5.3 合规运营与频率自律最后聊一下边界问题。爬虫采集的前提是尊重目标站点的规则。我实际执行的三条底线是第一严格遵守robots协议。抓取前先查看目标站点根目录下的robots.txtDisallow的路径一概不碰。第二条不采集个人数据哪怕页面里偶然出现了电话号码、邮箱等个人信息清洗时一律丢弃不做存储。第三条控制采集频率以不造成站点访问题压力为前提。出版社官网承载量有限访问密集时段上午9点到11点、下午2点到4点尽量不跑批量任务或者把并发调到最低。这些约束不会显著影响数据获取量但能保证项目长久运转。实际运营中单站每天跑一遍增量采集数据更新频率已经足够用了没必要把采集密度提到“每小时一次”这种会招致封禁的级别。6. 项目复盘与后续演进方向这个项目从最初的一个临时取数脚本逐步演变成一个带配置化、清洗校验、自动化巡检的完整数据管线。整个过程没有什么高深算法核心其实是把细节抠到位——每个字段的清洗规则、每种页面结构的解析策略、每类反爬的应对方案都是在跑数据的过程中一点点沉淀下来的。我个人最大的体会是爬虫项目的复杂度大头不在“抓”而在“稳”。抓一页数据谁都会写难的是让这个程序在三个月后还能稳定产出高质量数据。出版社改版、字段格式变化、反爬策略调整这些都是必然事件架构设计时把这些变化当作默认前提来应对后期的维护成本就会低很多。如果后续要继续演进我会优先考虑三个方向一是对接出版社的RSS或者官方API部分出版社已开通新书接口从源头解决HTML改版带来的维护成本二是把SQLite换成PostgreSQL让多人在线协作查库成为可能三是加一个简单的Web查询页面让不懂SQL的选品同事也能按书名、作者、上市时间组合检索。还有一个小建议给正在搭类似数据管线的朋友别等所有功能完美才上线。先把最核心的“单站采集、清洗、入库”跑通让数据流起来再迭代扩展其他出版社和功能。数据管道这个事跑起来比想清楚更重要很多需求是在真实使用中才浮现出来的。

相关新闻

2026工业AI服务商选型指南:六大维度评估与综合实力排行

2026工业AI服务商选型指南:六大维度评估与综合实力排行

2026年了,如果一个制造业老板还会被“我们是工业大模型行业第一”这种标语唬住,那说明他这几年的行业会基本白开了。倒不是说工业AI这行不行了,恰恰相反,工业AI的位置从来没有像现在这么靠前——从总部战略会到车间班组的绩效看板…

2026/10/13 8:07:31 阅读更多 →
从数列到贪心:算法竞赛基础题的三类常见坑解析

从数列到贪心:算法竞赛基础题的三类常见坑解析

这几天整理手头的刷题笔记,看到有一套小题目让我印象很深,题名干脆利落:数列1、修理牛棚、按要求输出序列。乍看都是入门难度,但把它们放在一起研究会发现,问题往往不只在“会不会算法”,更多是出在读题、建…

2026/10/13 8:07:31 阅读更多 →
微服务全链路瓶颈定位平台选型对比与落地实践指南

微服务全链路瓶颈定位平台选型对比与落地实践指南

微服务一多起来,链路排查这事儿就从“偶尔头疼”变成了“天天头疼”。你盯着监控面板,CPU没爆、内存没满、接口的TP99却一路飙红,到底是哪个服务拖了后腿、哪次调用把线程池堵死了,全靠肉眼在一堆日志里捞。这不是个例&#xff0c…

2026/10/13 8:06:30 阅读更多 →

最新新闻

Python Tkinter GUI开发全指南:从窗口搭建到打包发布

Python Tkinter GUI开发全指南:从窗口搭建到打包发布

/* 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 8:58:45 阅读更多 →
Ceres Solver Bundle Adjustment实战:SLAM后端优化从建模到调参

Ceres Solver Bundle Adjustment实战:SLAM后端优化从建模到调参

/* 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 8:58:45 阅读更多 →
OpenCode技术学习:从源码阅读到实战提升

OpenCode技术学习:从源码阅读到实战提升

1. OpenCode技术学习概述OpenCode技术学习是一种面向开发者的新型学习模式,它打破了传统技术教育的边界,通过开放源代码、开放课程和开放社区三位一体的方式,让学习者能够深入技术本质。这种学习方式最早可以追溯到20世纪80年代的自由软件运动…

2026/10/13 8:58:45 阅读更多 →
InstallShield for VC++ 6.0 安装包制作实战:从工程配置到避坑指南

InstallShield for VC++ 6.0 安装包制作实战:从工程配置到避坑指南

/* 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 8:58:45 阅读更多 →
DeepSeek Harness桌面端:本地代理与会话管理的安全实践

DeepSeek Harness桌面端:本地代理与会话管理的安全实践

1. 为什么我会需要一个 DeepSeek 桌面端 先交代下背景。我一直是 DeepSeek 的深度用户,日常写代码、做文档、跑数据分析,大部分时间都泡在浏览器里跟它对话。用久了之后,痛点其实非常明确:浏览器标签页一多,会话就找不…

2026/10/13 8:58:45 阅读更多 →
学术评价体系外的多元发展路径探索

学术评价体系外的多元发展路径探索

1. 学术生涯的另一种可能性"我30多年学术生涯中,既没中过什么课题,也没中过什么项目"——这句话乍听像是失败者的自白,实则揭示了学术界一个鲜少被讨论的真相:在传统评价体系之外,存在着另一种学术生存方式。…

2026/10/13 8:57:36 阅读更多 →

日新闻

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

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

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

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 阅读更多 →