一个朋友上个月问我有没有靠谱的电子书下载去处,说想趁着换工作的空档补一补基础知识。我给他整理了一份清单,结果前两天他回我一句“你给的那几个页面有一半打不开了,还有一个下下来是个压缩包,解压出来让我装个播放器”。这事挺典型的——电子书下载这件事,难的从来不是“找到链接”,而是判断哪个链接背后的东西值得你花时间。免费电子书这个领域,资源供给的形态这几年变化很大:一部分内容因为版权到期进入公有领域,成了可以合法自由传播的公共资源;一部分是科研与教育机构主动开放出来的成果;还有一部分则是挂羊头卖狗肉的流量陷阱。想靠下载电子书来学习充电,光有一堆网址远远不够,你得有一套自己的筛选逻辑、清洗流程和阅读节奏。这篇东西写给三类人:刚入门、见到“免费”两个字就想点的手快党;已经屯了几百本却一本没读完的收藏家;以及想把电子资料真正用进工作里的实践者。下面全部是我自己这几年摸出来的做法,包括我踩过的那些坑。
1. 先分清“免费”的三种底色,再决定要不要伸手
我见过太多人把“免费电子书”当成一个整体概念,其实它至少分成三种完全不同的供给逻辑,对应三种完全不同的质量和风险画像。分不清这个,后面所有的下载行为都是盲目的。这一节我们把这三类拆开看,每一类的来源特征、内容偏向、常见坑点都不一样,你判断一个页面属于哪一类,基本就能预判它能给你什么、会不会坑你。
1.1 版权保护期届满的公共资源:最稳妥的那一档
这是最干净的一类。著作权有个保护期限,期限一到,作品进入公有领域,任何人整理、复制、传播都不再需要授权。国内通行的规则是作者终生加去世后五十年,多数海外地区是七十年,具体年限视作品来源地而定——这个差别在实际使用中很重要,同一部外文原著在不同地区进入公有领域的时间可能差二十年。这类资源的典型特征是:内容偏经典,文学、哲学、历史、早期科学著作占大头;版本信息往往很讲究,好的整理方会把初版、修订版、不同译者的版本分别列出;下载页面通常不催你注册,也不会弹一堆窗口。
这里有个特别容易被忽略的坑:原著进入公有领域,不等于你看到的那个中文译本也进入公有领域。译作是二次创作,译者享有独立的著作权。我见过不少人理直气壮地说“这书作者都去世一百年了怎么还有版权”,然后转头下载了一个八十年代出版、译者还在世的中文译本。原著你可以随便用,但那个特定译本的文字组织、注释体系、术语选择都是有主的。所以判断一本外文经典能不能放心用,要看两头:原作者的保护期,和译者的保护期。真要引用或者二次使用,优先找明确标注“公版译本”或者干脆自己对着原文理解。
另外一个现实问题:这类站点的排版质量参差不齐。有些是志愿者精校过的,错字率极低,还带目录锚点和脚注链接;有些则是早年扫描识别后随便丢上来的,一句话里能有三处识别错误。同一本书在不同来源的文本质量可能差出十倍,这就引出后面要讲的文件校验环节。
1.2 开放获取与作者主动授权:学术与自出版的两条支流
第二类是主动开放的内容。科研领域的开放获取运动这些年推进得比较扎实,大量论文、会议集、部分专著在发表时就以开放许可的方式提供全文,作者或所在机构付费买断了传播限制。教育领域还有一类开放教材,由机构或基金会资助编写,明确允许自由下载、转载甚至改编。自出版作者里也有一部分人会把整本书免费放出,作为引流或者纯粹的兴趣分享。
这类资源的价值密度往往很高,但使用体验通常一般。学术类 PDF 的排版是为了印刷和评审服务的,双栏、密排、公式穿插、图表跨页,在小屏幕上读起来很折磨;文件名经常是一串投稿编号,不打开根本不知道是什么;同一个研究的不同版本(预印本、会议版、期刊版)内容可能差很多,误引版本是很常见的失误。我在整理这类资料时养成一个习惯:下载完立刻把版本信息写进文件名,宁可名字长一点,也不要三个月后对着三个长得一样的 PDF 发懵。
至于作者授权的免费书,判断标准很简单:看作者本人有没有在自己的主页、通讯渠道或者书籍前言里明确说过“可以自由分发”。如果只是某个第三方站点单方面提供下载,而作者毫不知情,那这类就不能算“授权”,后面会讲到怎么绕开这些。
1.3 伪装成电子书的那些东西:把风险识别提前到点击之前
第三类是需要重点防范的。免费电子书是极具吸引力的诱饵,因为它天然对应“我想学点东西”这种正向动机,人在这种心态下警惕性会下降。我见过的套路大致有几种形态:下载下来的是一个压缩包,里面装着扩展名被改过的可执行文件,双击就运行;页面上的“下载”按钮其实是广告位,点了跳到某个要求你先装个“下载助手”的地方;还有一种更隐蔽,文件确实是 PDF,但只有前几页是内容,后面全是引导你访问某处的插页。
识别的关键动作只有三个,但必须形成肌肉记忆。第一,看扩展名和实际文件类型是否一致——把文件下载到本地后,先看它的真实类型,一个号称 EPUB 的东西如果是可执行格式,立刻删掉。第二,看体积是否合理,一本正常的中文文字类书籍,EPUB 通常在一到五兆之间,纯文本 PDF 按页数算每页几十千字节,如果一本两百页的书只有二十千字节,或者反过来有八百兆,都值得怀疑。第三,看来源页面的整体质量,一个正经做内容整理的页面,通常会有版本说明、更新记录、纠错渠道,而一个纯流量页面除了下载按钮什么都没有。
注意:任何要求你先安装客户端、插件或者“专用阅读器”才能拿到电子书的页面,直接关掉。绝大多数格式根本不需要额外软件才能下载。
2. 我筛这类站点的六个硬指标
说完分类,讲方法。我不太愿意在文章里直接甩一串网址,一是这类页面存活周期本来就不长,今天能用明天就没了;二是直接把名字写出来,等于把判断权交出去,读者拿到的是一个黑盒。更有用的做法是给你一套评估框架,你自己看到任何一个资源页面,五分钟之内能判断值不值得留。下面这六条是我实际在用的,按重要性排序。
2.1 元数据是否完整到可以核对
一个资源页面的元数据完整度,几乎等价于它的整理水平。我看的第一眼不是下载按钮,而是它有没有把这几项写清楚:书名(含副标题)、作者、译者、出版社、出版年、版次、ISBN、总页数、文件格式、文件大小。这几项里最关键的是版次和 ISBN,因为它们决定了你拿到的是哪一本书,而不是“一本叫这个名字的东西”。
为什么这么在意版次?因为教材和技术类书籍的版次差异是致命的。同一本讲数据结构的老书,第三版和第五版可能换掉了三分之一的案例,习题编号全变,你按着旧版的页码去对照别人的笔记,永远对不上。文学类稍微好一点,但删节版和全译本的区别也足够影响阅读体验。ISBN 则是唯一标识,有它你就能确认自己下的和别人讨论的是同一本书。
如果页面只写了个书名,连作者都没有,我的做法是直接跳过。不是歧视,是这类页面背后的整理者通常没有做过任何校对,你拿到的东西大概率是某处抓来的二手货,错漏无从追溯。
2.2 下载链路是直连还是层层中转
第二个判断点是路径长度。理想状态是:在资源页面上点一次,文件开始传输。现实中常见的是:点一下跳到一个“请稍候”页面,等十秒再点一下,跳到一个“验证你不是自动化程序”的页面,再点一下,跳到一个下载站,再点一下,最后给你一个限速的链接。每一层中转都是一个潜在的诱导点击位。
我的容忍上限是两次跳转。超过这个数,无论内容多好我都放弃,因为链路的复杂度直接反映了这个页面的商业模式——它不是在分享内容,是在经营流量。你可以自己做个测试:打开一个资源页面,数一数从进入页面到文件开始传输,你需要点击多少次,中间出现过多少个弹窗。这个数字超过三次,就说明这个站点的主要收入不来自内容本身。
还有个小细节:看下载链接的域名。如果资源页面的域名和文件下载的域名完全无关,且下载域名看起来像是随机字符拼的,那要留个心眼。正常的内容站点,文件通常放在自己的存储或者通用对象存储上。
2.3 文件格式的优先级排序
这一条属于经验性的取舍。同样是“有这本书”,不同格式对你的实际价值差别很大。我的一般排序是这样的:
| 格式 | 适用场景 | 主要优势 | 主要短板 |
|---|---|---|---|
| EPUB | 纯文字为主的书籍、小说、非虚构 | 可重排、字号自适应、标注易导出 | 复杂排版和公式支持弱 |
| AZW3 / MOBI | 墨水屏阅读器 | 渲染稳定、翻页快 | 通用性差,转换有损 |
| 文字版 PDF | 教材、技术书、图表多的书 | 版式保真、页码稳定可引用 | 小屏阅读体验差 |
| 扫描版 PDF | 绝版书、老资料 | 唯一可得形态 | 无法检索、体积大、需 OCR |
| 纯文本 / Markdown | 代码类、笔记类 | 极轻、可全文检索 | 丢失所有版式信息 |
这个排序背后的逻辑是可重排性优先于版式保真。因为绝大多数人的阅读场景是手机和墨水屏,屏幕尺寸不固定,能重排的格式意味着你在任何设备上都不用左右拖动。只有在需要精确引用页码、或者书里有大量需要保持相对位置的图表时,PDF 的优势才压过 EPUB。
顺带说一句,不要迷信“高清扫描版”这四个字。扫描件的清晰度取决于原始扫描的分辨率和后期处理,跟你屏幕多大没关系。我见过标着“超清”的文件,打开一看是每页宽度只有八百像素的图,放大两倍就糊成一片。判断方法很简单:打开文件,把页面放大到百分之二百,看正文笔画是否还是连续的。断续、发虚,就是分辨率不够。
2.4 版权声明与纠错通道的存在与否
这一条看起来跟“能不能下到书”无关,但它是判断站点性质的重要信号。一个认真做内容整理的地方,通常会有明确的说明:这些内容是什么来源、依据什么可以公开、如果你认为某处侵犯了你的权益可以通过什么方式联系处理。有这套东西,说明整理者想过合规问题,内容的来源大概率是站得住的。
反过来,一个页面通篇只有“海量资源免费下载”“全网最全”这类话术,没有任何来源说明,也没有任何联系方式,那它的内容是怎么来的就很值得怀疑。这类站点我一般不用,理由很实际:来源不明的文件,你无法判断它有没有被篡改过。正经渠道的数字文件,通常能对得上出版方的原始文件哈希;来路不明的文件,多一个字节你都不知道是什么。
2.5 检索能力:能不能按作者、按主题找
单本下载是低效的。真正有用的资源站点,检索维度要足够细:至少能按书名、作者、主题标签、语言、格式筛选。如果一个站点只能靠一个搜索框输入书名,说明它的后台根本没有结构化整理,你只能“知道书名才能找到书”,这在探索性阅读里毫无价值。
我判断一个站点是否值得长期留着,会做个小测试:搜一个比较冷门的主题词,比如某个细分领域的术语,看返回的结果是不是真的相关,还是把所有含这个字的书名都堆给你。相关性差,说明没有做过主题标引,后面你想按领域系统性地补课,会非常痛苦。
2.6 更新节奏与内容偏向
最后一条比较软,但很实用。观察一段时间,看这个来源更新的内容集中在哪些领域。有的偏人文经典,有的偏理工教材,有的专做某个语种。搞清楚它的偏向,你就能把它放进自己资源清单里的对应位置,而不是每次找书都从头筛一遍。我的做法是给每个来源打个标签,记清楚它擅长什么、不擅长什么,找书的时候先按标签定位,能省掉大量无效点击。
3. 文件落到硬盘上,真正花时间的环节才开始
大部分人把“下载完成”当成终点,其实那只是原材料入库。我粗略算过,一本质量一般的电子书,从下载到真正可读可用,平均还要花二十到四十分钟的处理时间。这个投入是完全值得的,因为处理过的书你才会去读,没处理过的书只会躺在下载文件夹里越堆越多,最后连自己有什么都不知道。这一节讲我固定会做的三件事。
3.1 命名与目录:让文件名自己说话
我见过最典型的失败案例,是一个文件夹里躺着document(3).pdf、新建文件夹 (2)、1.pdf这样的东西。这种状态持续三个月,你就彻底失去对这批资料的掌控了。我的命名规则很土但很有效:
{领域}/{作者} - {书名} ({版次或年份}) [{格式}].{扩展名}举个具体的形态:认知科学/某作者 - 注意力机制导论 (第二版) [EPUB].epub。这个结构里每一项都有用途:领域用于分类浏览,作者和书名用于检索,版次用于区分同书不同版本,格式标签用于在不打开文件的情况下判断用什么设备读。
批量重命名我用一段很短的脚本,把下载目录里的文件按解析出的规则统一整理:
#!/usr/bin/env bash # 把 download/ 下所有 pdf/epub 移入 books/,文件名规范化为「作者 - 书名.扩展名」 # 依赖文件名里已含「作者 - 书名」结构;不匹配的留在原地待人工处理 set -euo pipefail SRC="./download" DST="./books" find "$SRC" -maxdepth 1 -type f \( -iname '*.pdf' -o -iname '*.epub' -o -iname '*.mobi' \) | while IFS= read -r f; do base="$(basename "$f")" name="${base%.*}" ext="${base##*.}" # 统一分隔符:下划线、全角破折号都换成半角 " - " norm="$(printf '%s' "$name" | sed -e 's/_/ /g' -e 's/—/ - /g' -e 's/ */ /g' -e 's/^ *//' -e 's/ *$//')" # 必须包含分隔符才认为是已结构化命名 if [[ "$norm" != *" - "* ]]; then echo "SKIP(未结构化): $base" continue fi target="$DST/$norm.$ext" if [[ -e "$target" ]]; then echo "SKIP(已存在): $target" continue fi mv -- "$f" "$target" echo "OK: $base -> $target" done这段脚本的关键设计是“不匹配就跳过”。自动化的风险在于它会静默地把看不懂的东西塞到某个地方,你要的是“能处理的处理掉,不能处理的报出来”,而不是一个看起来很整齐但内容被搅乱的目录。任何批量操作都应该保留这个兜底逻辑。
3.2 元数据补全与去重
文件名规范了,但阅读器里的书架还是乱的,因为阅读器读的是文件内嵌的元数据,不是文件名。EPUB 的元数据可以很方便地写入,各类管理工具都支持批量编辑;PDF 麻烦一些,标题、作者这些字段有的能改,有的得靠外部数据库辅助。我的做法是分两步:先用文件名解析出作者和书名,批量写进文件内嵌字段;写不进去的(比如扫描版 PDF),就在管理工具里挂一条侧车记录,至少保证书架显示是可读的。
去重这件事比想象中重要。我的书库里同一本书最多出现过六个副本,来源不同、格式不同、质量不同。人工比对太累,我用两个层次判断:第一层按文件内容哈希,完全相同的直接删;第二层按“书名归一化 + 作者 + 页数或文件大小区间”做模糊匹配,命中的列出来人工过一遍。第二层之所以不能全自动,是因为同名不同书、同书不同版的情况太多,尤其是一些通用书名,误删的代价比留着大得多。
import hashlib from pathlib import Path def file_hash(p: Path, chunk=1 << 20) -> str: h = hashlib.sha256() with p.open("rb") as f: while True: b = f.read(chunk) if not b: break h.update(b) return h.hexdigest() def find_duplicates(root: str): seen = {} for p in Path(root).rglob("*"): if p.is_file() and p.suffix.lower() in {".epub", ".pdf", ".mobi", ".azw3"}: h = file_hash(p) seen.setdefault(h, []).append(p) return {h: ps for h, ps in seen.items() if len(ps) > 1}哈希去重只解决“文件字节完全一致”的情况。真正麻烦的是同一本书的不同数字版本,体积差几兆、内容差几页,这种只能靠元数据核对,急不来。
3.3 扫描版的处理链路:先修图,再识别
扫描版 PDF 是最需要加工的一类。直接丢进文本识别工具,效果往往很差,因为原始扫描件通常带着这些问题:页面倾斜、四周大片黑边、纸张泛黄导致对比度低、装订处文字变形、跨页图表被切断。识别前的图像预处理做得好不好,直接决定最终文本的可用性。
我的固定顺序是:先纠偏(把倾斜的页面转正),再裁边(去掉扫描产生的黑框),然后做对比度增强和去噪,最后才是识别。这个顺序不能反,因为如果先识别再修图,识别错误已经固化在文本层里了,修图也救不回来。参数上我的经验值是:倾斜角度超过零点五度就必须纠正,小角度累积到整本书会让阅读产生明显的“晃动感”;裁边时留出五到十像素的余量,裁太狠会切掉页边注和页码。
识别之后一定要做质量抽检,不能全信。抽三处:随机一页的正文、一个含公式或表格的页面、以及一本书的目录页。目录页最容易出问题,因为大量点是特殊符号,识别成逗号句号是常态,而目录错了会直接影响导航。发现问题就整本重跑,改预处理参数而不是手工改几千行。
处理完的扫描版,我一般会生成一个带文本层的版本,同时保留原始扫描件。前者用于检索和引用,后者用于核对——文字识别在数字和单位上出错率不低,遇到可疑内容回到图像层看一眼,是最快的验证方式。
4. 从“存下来了”到“读进去了”还隔着一条流水线
讲完技术处理,聊点更实际的。我观察到一个现象:很多人下载电子书的数量和读完的数量之间,存在一个巨大的落差。这个落差不是因为懒,而是因为下载这个动作本身带来的满足感太强了——你会有一种“我已经拥有这份知识”的错觉。要打破这个错觉,得把下载和阅读之间的路径缩短到几乎没有摩擦,同时给阅读本身建立节奏。
4.1 设备分工:什么内容放在什么屏幕上
我的划分很粗暴但实用:需要反复查阅、图表密集、公式多的资料,放在大屏幕上看;以文字叙述为主、需要长时间沉浸的,放在墨水屏上;碎片时间用来读短篇和做回顾,用手机。这个分工的依据是屏幕特性——墨水屏没有刷新闪烁,长时间阅读眼睛负担小,但翻页慢、不适合来回跳转,正好匹配线性阅读;大屏幕适合需要放大、需要并排对照的场景。
这个分工带来一个直接后果:格式要跟着设备走。给墨水屏的书,必须转成可重排格式,PDF 在那个尺寸上就是灾难。转换的时候要注意几个细节:字体要嵌入或者至少指定一个通用字体族,否则在设备上可能变成默认的等宽字体,中文还会出现缺字;图片要适当降采样,墨水屏的灰度层次有限,原图再精细也显示不出来,反而拖慢翻页;目录层级要保留,重排之后自动生成的目录经常丢失层级关系,得手动检查。
4.2 笔记的三层结构:从划线到能用的东西
我以前的做法是马马虎虎地在书上划线,划完就完了,三个月后回头看,完全想不起来当时为什么划那句。后来改成三层结构,效果好很多。
第一层是划线,只标两类内容:一是让你产生“这和我原来的理解不一样”的句子,二是可以直接拿去用的具体方法、参数、步骤。纯粹写得漂亮的句子不划,因为漂亮不等于有用。
第二层是摘录加工,读完一章之后,把划线内容过一遍,用自己的话压缩成三到五条,写在单独的笔记文件里。这一步的关键是必须脱离原文表述,如果你只是复制粘贴,那等于没加工。我一般的做法是强迫自己写“这句话的意思是……”,写不出来就说明没读懂。
第三层是关联,给每条摘录挂上标签,标明它属于哪个主题、能用在我手头的哪个事情上。这一步决定了这些笔记未来会不会被用到。没有关联的笔记,等于埋在土里。
导出标注这件事,格式支持差别很大。EPUB 的标注导出相对成熟,大部分阅读器都能导出带位置信息的文本;PDF 的标注导出要看具体工具,有的只能导出图片形式的截图,那基本没法用。这也是我倾向 EPUB 的一个现实原因——不只是读着舒服,是读完之后的沉淀成本更低。
4.3 一个能坚持下来的每周节奏
我给自己的安排是这样的,供参考:每周固定一个时间段(我放在周末上午)做“入库处理”,把这一周下载的东西该归档的归档、该转格式的转格式、该识别的识别,不积压;每天固定二十到三十分钟的阅读时间,只读一本,不同时开多本;每读完一章做一次摘录加工;每读完一本写一段不超过五百字的总结,说清楚这本书改变了我哪个认知或者给了我哪个具体方法。
这个节奏里最关键的是“只读一本”。同时开五六本书是阅读效率的最大杀手,因为每次切换都要重新建立上下文,而上下文重建的成本远比想象的高。我试过同时读三本,结果是三本都停在第三章。
提示:给自己设一个上限——未处理的下载文件不超过二十个。到这个数就先停下来做入库,不再下新的。这条规则救过我很多次,否则下载文件夹会变成一个只进不出的黑洞。
5. 那几个反复出现的坑,以及我是怎么排查的
最后这部分是我这些年踩坑的记录,都是重复出现过多次的问题,写下来是因为它们的排查思路可以复用。遇到问题不要急着换来源,先把问题定位清楚,很多时候换来源并不能解决,因为问题出在处理环节而不是资源本身。
5.1 号称高清,打开却是一堆图片
最典型的一次:下了一本四百多页的技术书,体积一百多兆,看体积应该是扫描版,结果打开发现每一页的文字都是图片,完全无法选中、无法搜索,连目录都是图片。这种情况的本质是文件里没有文本层,整本书就是图片的容器。
排查的路径是这样的:先确认是“没有文本层”还是“文本层损坏”。方法很简单,在阅读器里尝试选中一段正文,能选中并且复制出来的是正常字符,说明有文本层;选中之后是空白或者复制出来是乱码,说明文本层有问题或者编码不对;完全无法选中,就是纯图片。
确认是纯图片之后,处理方案就是走识别流程。这里有个参数上的取舍:识别的语言模型要选对,中英文混排的技术书,如果只用中文模型,英文术语和代码片段会识别得一塌糊涂,反之亦然。我的做法是优先选支持多语言混合的模型,如果只能选一个,看这本书的主要语言,然后用第二章讲的抽检方法重点检查另一语言的部分。
还有一个附带问题:图片型 PDF 的页面尺寸往往不统一,有的页大有的页小,识别出来的文本会出现奇怪的断行。解决办法是在识别前统一页面尺寸,或者识别后按段落重新拼接——后者更麻烦,我一般选前者。
5.2 同一本书五个版本,读错了版本白费一周
这个坑我踩得最狠。有次读一本教材,跟着做练习,发现第三章的习题和答案对不上,折腾了半天以为是自己的理解有问题,最后才发现我手上是第三版,参考答案是第五版的,习题编号整体错位。一周时间就这么没了。
根因是版本识别没做。现在我下载任何一本书,第一件事是核对三项:出版年、版次、总页数。这三项里有两项对不上,就说明版本不同。如果这本书我要用来跟着做练习或者引用,我会额外确认 ISBN,因为 ISBN 是唯一标识,同一年同一出版社可能出多个印次,内容有细微修订但版次号不变。
排查版本问题的具体做法:打开文件的版权页(通常在正文前面的几页,或者最后一页),核对出版信息;如果文件没有版权页,看正文里引用的年份和参考文献的最晚年份,能大致定位版本区间;再不行就比对目录结构,不同版次的章节划分通常有调整。
还有一种更隐蔽的情况:删节版冒充全本。某些经典作品的特定版本会删掉部分章节或者段落,但书名页看不出任何提示。判断方法是核对总字数和章节数,和已知的完整版本对比。文学类作品尤其要注意,我现在的习惯是先查清楚这本书的完整版有多少章,再打开文件看目录,章数对得上的才留下。
5.3 批量下载把硬盘塞满,还触发了限流
这个属于操作层面的教训。有段时间我贪心,写了个脚本批量抓取某个主题下的所有资源,结果一夜之间下了八百多本,硬盘直接告急,而且因为请求频率太高,被来源方限制了访问,后面两周都用不了。
现在的做法克制得多:脚本必须带三个约束——并发数不超过二、单次任务总量上限、请求间隔随机化。这三个参数的意义分别是:并发低是为了不给对方服务器造成压力,也是为了避免触发风控;总量上限是强迫自己分批处理,下一批之前先把上一批消化掉;间隔随机化是因为固定间隔的请求模式太容易被识别成自动化行为。
# 带节流的批量下载骨架:串行、限速、失败重试、断点续传 while IFS= read -r url; do # 已下载且大小大于 0 的跳过,实现断点续传的效果 out="download/$(basename "$url")" if [[ -s "$out" ]]; then echo "SKIP: $out" continue fi # 限速 200KB/s,失败重试 3 次,超时 30 秒 curl -L --fail \ --limit-rate 200k \ --retry 3 --retry-delay 5 \ --connect-timeout 30 \ -o "$out" "$url" || echo "FAIL: $url" # 随机间隔 3~8 秒,避免规律性请求 sleep $(( RANDOM % 6 + 3 )) done < urls.txt磁盘管理上还有个容易忽略的点:临时文件的位置。格式转换和 OCR 过程会产生大量中间文件,一本扫描书的中间图像可能有几个吉字节。如果临时目录和系统盘在同一个分区,跑到一半提示空间不足是很常见的。我的做法是把临时目录显式指向一个大容量分区,处理完立刻清理。
5.4 文件名乱码在跨设备同步时才暴露
这个问题平时看不出来,一旦同步到别的设备就麻烦了。原因是文件名的字符编码不一致——早年在某些系统上创建的文件名用的是本地编码,同步到只认另一种编码的设备上,中文全部变成方块或者问号。更麻烦的是,有些同步工具遇到无法解析的文件名会直接跳过,你以为是同步完成了,实际上少了一批文件。
排查方法:在源目录里列出所有文件名,看有没有出现替换字符或者异常符号。批量修复的思路是先把文件名转成统一的编码,再重新写入。如果文件数量多,先小范围试十个,确认转换之后内容没有损坏(改名不影响内容,但脚本写错可能误删),再全量执行。
预防比修复省事:从现在开始,所有新文件都用统一的命名规则和统一的编码写入,脚本里显式指定编码,不依赖系统默认。这条规则看起来琐碎,但它是唯一能避免这个问题反复出现的办法。
5.5 处理链路的顺序问题:格式转换和识别的先后
最后一个坑比较技术性,但踩的人不少。有人拿到扫描版 PDF,想转成 EPUB,于是直接跑转换,结果转出来的 EPUB 打开是一堆图片切片,文字依然不可选。原因是格式转换工具对纯图片 PDF 无能为力,它只能搬运图片,不能变出文本。
正确的顺序是:先识别出文本,再考虑重排。识别之后你得到的是带文本层的 PDF 或者纯文本,前者保留了版式,后者更轻便但丢了排版。要到 EPUB 还需要一步结构化:把纯文本按章节切分、给标题分级、处理脚注和图表引用。这一步自动化程度有限,我的经验是留一半人工,尤其是技术类书籍,公式和代码块必须手工核对,自动转换几乎一定会把它们搞乱。
反过来的操作——EPUB 转 PDF——要简单得多,但要注意一个取舍:转换相当于把可重排的内容固化成一个固定版式,之后在别的设备上就没法自适应了。所以只在你确定要在固定尺寸的设备上阅读、并且需要精确页码时才做这个转换,否则保留 EPUB 更灵活。
我自己的习惯是,一本书只保留一个“主格式”,其余格式在需要时临时生成,用完就删。主格式的选择标准就是前面那个表:文字书用 EPUB,图表书用 PDF,绝版扫描件保留原始 PDF 加一份识别后的文本。这样库存不会膨胀,也不会出现“哪个才是最新版”的困扰。
说到底,找免费电子书这件事,真正稀缺的从来不是链接,而是判断力和处理能力。链接三个月就失效一批,但“怎么看元数据”“怎么核对版本”“怎么把扫描件变成能检索的文本”这些能力是不会过期的。我现在的资源清单比三年前短了很多,只剩五个来源,但每一本下载下来的东西都能在半小时内进入可读状态,读完的东西也能在下一次需要时被检索到。这个转化率,比收藏夹里躺着几百个网址实在得多。