番茄小说下载器:5种格式存档全本小说,3条路径跑通服务
番茄小说下载器:5种格式存档全本小说,3条路径跑通服务【免费下载链接】fanqienovel-downloader下载番茄小说项目地址: https://gitcode.com/gh_mirrors/fa/fanqienovel-downloader凌晨两点,你追的小说正更新到关键剧情,平台却弹出内容违规,暂时下线。想存下来慢慢看,网页版章节却打不开了。fanqienovel-downloader(番茄小说下载器)就是为这种时刻准备的:整本小说批量抓取,转成TXT、EPUB、HTML等5种格式离线翻,追更也不掉队。番茄小说下载器全景速览用不用,先看这张表。它回答的是最实际的问题:它能干什么,对我有什么用:能力维度项目实现方式用户感知到的价值找书与下载Web搜索 ID/链接直连,两种入口贴个链接就能入库,不用翻目录找格式转换整本TXT / 分章TXT / EPUB / HTML / LaTeX 五种保存模式按阅读设备挑格式:阅读器配EPUB,手机TXT最省事实时进度WebSocket推送进度与当前章节名(说人话就是:页面自己刷新,不用手动点刷新)看着章节一章章滚过去,进度条直接给百分比批量任务下载队列 自动去重一次丢5本书进去,按队列顺序一本本跑完更新追踪record.json 记录已下载书目,一键全部更新作者追更,你点一下同步,不重复下载旧章节多平台运行Python源码 / Docker / 安卓Termux从NAS到手机,都能跑它不是万能药:只支持番茄小说网页端这一个平台,其他网站不在能力范围;受特殊权限限制的章节可能不完整,平台页面结构变化后也可能要升级版本(v1.1.5及以下版本就曾因API失效整体罢工)。功能清单看完,一个更实际的问题:它凭什么能稳定抓下几千章而不被封?跟着一本书的一次下载走一遍就明白了。一本书从点击下载到落盘经历了什么在Web界面点下下载后,请求要经过四个节点才变成盘上的文件。节点一:拿目录。程序第一件事不是抢正文,而是解析书籍的目录页,把章节标题 → 章节ID的映射表抠出来,顺手带走书名和连载状态。# 抓取书籍目录页,解析出书名、章节列表与连载状态 url fhttps://fanqienovel.com/page/{novel_id} response req.get(url, headersself.headers) # 每次随机挑选的浏览器UA ele etree.HTML(response.text) # XPath 定位目录区块里每一章的链接 a_elements ele.xpath(//div[classchapter]/div/a) chapters {a.text: a.xpath(href)[0].split(/)[-1] for a in a_elements if a.xpath(href)}完整实现见 src/main.py 中的_get_chapter_list方法。节点二:并发抓每一章。这是反爬手段集中发力的地方:所有章节被扔进线程池,数量由xc控制(默认16);每次请求之间随机睡50~150毫秒,打散请求节奏;单章失败重试3次,连续失败7次则判定cookie失效,自动换一个新身份。def _download_chapter(self, title, chapter_id, existing_content): retries 3 while retries 0: content self._download_chapter_content(chapter_id) # 每次请求之间随机延迟,打散请求节奏(毫秒级) time.sleep(random.randint(self.config.delay[0], self.config.delay[1]) / 1000) # 连续失败超7次:cookie大概率失效,换新身份再试 if self.tcs 7: self.tzj self._get_initial_chapter_id() self._get_new_cookie(self.tzj) continue节点三:解码与清洗。平台抓回来的正文不是纯文本,里面掺着自定义伪字符,程序靠 charset.json 里的映射表把每个字符反向还原;主解析路径失败时,还会降级到备用API端点再试一次。这一步在页面上毫无感知,却决定了落盘正文能不能读。节点四:格式转换与落盘。按 save_mode 设置,同一份章节数据被拆成5种不同产出。以EPUB为例:它还会从书页面的元数据块里取作者和封面URL,把封面插成全书第一页。# 生成EPUB:自动附带作者、封面与目录 book epub.EpubBook() book.set_title(name) author self._get_author_info(novel_id) # 从页面ldjson元数据里取 if author: book.add_author(author) if self._get_cover_url(novel_id): self._add_cover_to_epub(book, cover_url) # 封面图插到全书最前面 epub.write_epub(output_path, book, {})一句话概括设计哲学:把反爬对抗藏在调度层,业务层无感知——你只关心存成什么格式,它不关心平台怎么变脸。机制讲透了,最朴素的问题来了:它到底怎么跑起来?上手路径:跑通番茄小说下载器的三条路只想试试的人直接源码跑Web版,4条命令:git clone https://gitcode.com/gh_mirrors/fa/fanqienovel-downloader cd fanqienovel-downloader pip install -r requirements.txt python src/server.py跑起来后浏览器打开 http://localhost:12930 ,应看到搜索框和设置面板;搜修仙会出书目列表,点开一本书,进度条立刻开始动。如果卡在这一步,通常是依赖没装全:优先安装根目录的requirements.txt,再对照报错信息补缺。要长期跑服务的人:用Docker部署番茄小说下载器想让它在NAS或云服务器上长期跑,容器化路径最省心。仓库里的 docker-compose.yml 开箱即用:配置数据和下载内容分别挂到fanqie_data、fanqie_downloads两个命名卷,重建容器不丢书架,还限制了1G内存上限防止吃满。cd fanqienovel-downloader docker compose up -d一两分钟后docker compose ps应看到一个 running 状态的容器,浏览器打开 http://127.0.0.1:12930 即同一套Web界面。如果卡在构建阶段,别慌,大概率是基础镜像python:3.13-slim拉取慢,先换镜像源再重试。想在手机上用的人Termux路径只跑 src/ref_main.py 这个终端版(没有Web界面),适合轻度使用,换源等完整步骤写在 phone.md 里,核心就几行:pip install requests ebooklib tqdm beautifulsoup4 CFLAGS-O0 pip install lxml # 部分设备编译lxml会挂,加这个参数能过 python src/ref_main.py运行后是终端里的编号菜单:输入2搜索,输入ID或链接下载。如果lxml装不上,通常是缺C编译器,先apt install clang libxml2 libxslt再重装。能跑只是及格线。真正拉开差距的,是几个藏在配置里的开关。进阶玩法:让下载器为你打工让电子书阅读器常备新书源。把 save_mode 设为3(EPUB)即可。它和下完TXT再手动转EPUB的区别在于:作者、封面、目录全自动填充,封面直接从书籍页面元数据抓取——阅读器里打开就是你的书皮,而不是一片灰。相关逻辑集中在 src/main.py 的_download_epub方法里,想改排版样式就从这里入手。丢5本书进队列,每晚自动追更。Web版的书库页会读取下载记录,一键更新全部把所有已下载书目按ID塞进队列;队列自带去重(同一本书不会重复入队),还有一个每5分钟清理一次完成记录的后台线程。把它挂在常驻的服务器上,你只需要偶尔看一眼追更的书出了没。按自家网络调请求压力。设置页暴露两个核心字段:delay(单次请求延迟区间,默认[50, 150]毫秒)和xc(并发线程数,默认16),改动后写入data/web_config.json即刻生效,不用碰源码。配置玩熟了,接下来是血泪经验。⚠️ 避坑与调优症状:一启动下载就报ProxyError: Unable to connect to proxy。原因多半是系统残留了代理或加速器环境变量,requests把请求全转给了一个不存在的代理。处理很简单:清掉http_proxy/https_proxy再运行,或干脆关掉加速器——这是项目QA里出现频率最高的报错,没有之一。症状:下载到一半,个别章节内容为空或乱码。通常是cookie临时失效或网络抖动。程序对单章有3次自动重试,连续失败7次会自动换新cookie,大多数情况会自愈;如果整本书都下不动,先确认版本在v1.1.6以上,老版本的API接口已经整体失效,改配置救不回来。两个最值得记住的调优参数,给具体数值区间:参数默认值推荐区间适用场景xc并发线程数16移动网络 4~6;家庭宽带 8~12;企业千兆 16~24家庭宽带设8是甜点,再高收益递减还更容易触发风控delay请求延迟(毫秒)[50, 150]稳定网络[30, 100];频繁失败[200, 500]先调高保成功率,再逐步调低追速度症状:存出来的EPUB章节顺序乱了。原因是书名里章节标题不符合第N章式写法,程序从标题里抽不出数字排序,只能退回原始顺序。偶发一两章不用管;如果一本书普遍错乱,检查一下该书目录页的章节命名方式,这属于内容侧问题,不是程序bug。最后说点不那么技术的。边界、合规与生态法律边界:工具定位是个人学习与收藏用途,下载内容请勿用于商业传播,尊重原作者版权与平台使用条款。项目采用AGPL-3.0协议,修改源码再分发需保留相同协议并注明来源。技术边界:只支持番茄小说网页端,不适用于其他小说平台;付费、VIP独占等受限内容可能不完整;程序依赖平台页面结构,平台改版后无保证,社区有衍生检测工具用于盯页面结构变化。社区边界:遇到问题或有功能想法,到项目Issue区提交即可;作者在上学期间,回复可能不及时,稍安勿躁。它适合用阅读器、手机看小说,又受不了断网就没书看的人。第一件该做的事,就是打开Web版,把正在追的第一本书丢进去,选EPUB格式,然后在文件管理器里看到那张自动抓来的封面——仓库地址就是你开头git clone用的那个。跑通之后,欢迎在Issue里晒出你的第一个EPUB封面。【免费下载链接】fanqienovel-downloader下载番茄小说项目地址: https://gitcode.com/gh_mirrors/fa/fanqienovel-downloader创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考