ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Trae+Python小说爬虫5:翻页章节链接与双页小说章节的配置化抓取

2026/9/29 21:34:49 拓冰建站 浏览量
Trae+Python小说爬虫5:翻页章节链接与双页小说章节的配置化抓取 1. 翻页章节链接 双页小说章节到底难在哪如果你正在用 Trae 配合 Python 写小说爬虫大概率已经踩过两个坑一是目录页本身要翻页章节链接散落在index_1.html、index_2.html这种分页里二是点进某一章后正文只显示一半底部写着本章未完点击下一页继续阅读而第二页的地址规律是xxx_2.html。这两件事单独看都不复杂叠在一起就容易乱翻页时链接拼错、双页合并时顺序颠倒、断点续传把补充页当成新章节重复写入。这篇要解决的就是这个组合场景。目标很明确把目录翻页抓链接和单章双页合并正文做成一套可复用的配置化流程你只需要改几个参数——网址、翻页页数、标题和正文的元素标签、保存路径——就能套到别的站点上。适合已经跑通过单页爬虫、想进一步处理复杂目录结构的人也适合用 Trae 生成代码后不知道怎么调参的新手。我试过把这两步拆开写结果维护两套逻辑反而更乱后来统一到一个process_single_chapter里用is_supplement标记区分主页面和补充页代码清爽很多。下面按前置准备 → 配置骨架 → 验证 → 排障的顺序展开你可以直接复制去改。2. 前置准备TaoToken 与 Trae 的配合方式在写爬虫之前先把模型调用这条链路理顺。Trae 里做代码生成和调试时如果直接连官方接口网络波动和额度管理会比较麻烦用 TaoToken 做统一入口会省心一些。它的官网是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 地址是 https://taotoken.net/api 注意 API 这条不带 UTM 参数。具体操作上你需要在 TaoToken 控制台创建一个 API Key然后把它填到 Trae 的模型配置里。控制台入口在这里https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 创建 Key 的页面是 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。拿到 Key 之后如果你只是想先验证模型能不能正常对话可以用模型对话页测试https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 。这里有个细节要注意Trae 里配置自定义模型时Base URL 填https://taotoken.net/api不要带后面的路径模型名按你实际用的填。配置完先发一句你好确认连通再去写爬虫代码避免把网络问题和代码问题混在一起排查。如果你打算长期用 Trae 做编码和 Agent 任务可以了解下 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。提示API Key 不要硬编码进爬虫脚本里也不要提交到 Git。建议用环境变量或单独的配置文件读取Trae 生成代码时也提醒它别把 Key 写死。3. 可复制的 Trae 任务配置与翻页参数骨架这一节是核心。先给 Trae 一段清晰的 Prompt让它按你的站点结构改代码。关键是把翻页规律和双页规律讲清楚Trae 才能准确修改。3.1 给 Trae 的 Prompt 模板你可以直接把下面这段丢给 Trae把方括号里的内容换成你的实际站点信息这是一个 Python Selenium 的小说爬虫需要处理两种翻页情况 1. 目录页翻页第1页是 [基础URL]第2页是 [基础URL]2/第3页是 [基础URL]3/ 以此类推最多翻到第 [N] 页。请把翻页范围做成可配置参数。 2. 单章双页一个章节有两个页面第1页链接形如 xxx.html 第2页是在第1页链接后加 _2 再接 .html即 xxx_2.html。 要获取完整章节内容需要先抓第1页正文再抓第2页正文 按顺序合并写入同一个章节标题下第2页内容标注续。 请修改代码 - 翻页页数、基础URL、标题元素XPath、正文元素XPath、保存路径都做成变量方便替换 - 双页合并时第2页请求失败不能影响第1页已写入的内容 - 断点续传要能区分主页面和补充页避免重复写入。Trae 拿到这段后通常会帮你把get_parse_save_data里的翻页循环和process_single_chapter里的补充页逻辑对齐。下面是我实测下来比较稳的参数骨架。3.2 翻页与双页的核心参数把这几组参数单独拎出来改站点时只动这里参数名作用示例值base_url目录第1页地址https://example.com/indexlist/167845/max_pages目录最多翻几页10page_pattern翻页URL拼接方式f{base_url}{page}/title_xpath章节标题选择器//*[idwrapper]/article/h1content_xpath正文选择器//*[idbooktxt]//psupplement_suffix补充页后缀规则_2save_path保存目录D:\文档\大创\小说文本翻页循环的骨架长这样注意range(2, max_pages 1)的边界# 处理第一页 all_chapter_links self.get_chapter_links_from_page(base_url) # 处理后续页面max_pages 可配置 for page in range(2, self.max_pages 1): page_url f{base_url}{page}/ self.random_delay(3, 6) page_links self.get_chapter_links_from_page(page_url) if page_links: all_chapter_links.extend(page_links) else: logging.warning(f第{page}页无链接停止翻页) break双页合并的关键在 URL 拼接。很多人写成xxx.html_2正确做法是用os.path.splitext拆开扩展名再拼import os base, ext os.path.splitext(chapter_url) # basexxx, ext.html chapter_url_2 f{base}_2{ext} # 得到 xxx_2.html然后主页面和补充页分别调用同一个处理函数用is_supplement区分# 主页面 self.process_single_chapter(chapter_url, index, total, f, is_supplementFalse) # 补充页 self.process_single_chapter(chapter_url_2, index, total, f, is_supplementTrue)在process_single_chapter内部补充页的标题要加标识避免和主页面混淆if is_supplement: chapter_title_text 续这样写入 TXT 后同一章的两页内容会连在一起阅读时不会断。3.3 请求头与反爬参数Selenium 这边主要靠ChromeOptions伪装。User-Agent 从列表里随机取加上禁用自动化检测的选项options.add_argument(fuser-agent{random.choice(USER_AGENTS)}) options.add_argument(--disable-blink-featuresAutomationControlled) options.add_experimental_option(excludeSwitches, [enable-automation]) options.add_experimental_option(useAutomationExtension, False)随机延迟别省random_delay(2, 5)在翻页和章节之间都调用一次能明显降低被限流的概率。翻页间隔可以拉长到 3 到 6 秒因为目录页请求更敏感。4. 验证请求用样例章节确认链接拼接与双页合并配置改完别急着跑全本先拿一个样例章节验证。这一步能帮你快速定位是翻页错了还是双页拼错了。4.1 验证翻页链接拼接先只跑目录抓取把链接 dump 出来看python spider.py --url https://example.com/indexlist/167845/ --dump-links --debug跑完检查生成的.links.txt文件重点看三件事第1页链接数量是否合理、第2页链接是否和第1页不重复、翻页到最后一页时有没有报错。如果第2页链接和第1页一样说明page_pattern拼错了检查base_url结尾有没有多余的斜杠。4.2 验证双页合并结果挑一个章节单独测。在代码里临时把all_chapter_links截断成前两个章节all_chapter_links all_chapter_links[:2]跑完后打开 TXT看第一个章节的内容。正常结果应该是标题出现一次正文连续中间有续标识没有重复段落。如果发现第2页内容跑到下一章去了说明补充页的index传参有问题检查process_single_chapter调用时index是否和主页面一致。4.3 成功结果的判断标准一次成功的抓取日志里应该能看到这样的序列处理第 1/2 章→处理第 1/2 章补充部分→处理第 2/2 章→处理第 2/2 章补充部分。如果补充部分频繁失败但主页面成功多半是_2.html这个页面不存在有些章节本身只有一页这时候要允许补充页 404 时静默跳过而不是报错中断。# 补充页请求失败时记录但不影响主流程 if not success and is_supplement: logging.info(f章节 {index} 无补充页跳过) return True5. 本篇常见错排查5.1 翻页链接重复或漏抓最常见的原因是base_url结尾斜杠处理不一致。有的站点第1页是.../167845/第2页是.../167845/2/如果你base_url写成.../167845拼出来就变成.../1678452/。统一在配置里保证base_url以/结尾翻页时直接f{base_url}{page}/。另一个原因是翻页终止条件写错。用if not page_links: break比固定range更稳因为不同站点总页数不一样硬编码容易多翻出空页。5.2 双页合并顺序颠倒如果 TXT 里先出现续再出现正文说明主页面和补充页的调用顺序反了。检查这两行的先后self.process_single_chapter(chapter_url, ...) # 必须先 self.process_single_chapter(chapter_url_2, ...) # 必须后还有一种情况是补充页 URL 拼成了xxx.html_2请求直接 404日志里会看到补充页全部失败。用os.path.splitext就能避免。5.3 断点续传把补充页当新章节downloaded_chapters集合里如果只存了主页面 URL补充页每次都会重新抓。解决办法是把补充页 URL 也存进去或者在判断时用主页面 URL 做 key# 用主页面URL作为进度key补充页跟随主页面 progress_key chapter_url.replace(_2.html, .html) if progress_key in self.downloaded_chapters: return True5.4 正文选择器抓不到内容不同站点正文容器差异很大content_selectors列表里多放几个备选。如果所有选择器都失败先手动打开页面用 F12 看正文的父元素 class 或 id再补进列表。注意有些站点正文在 iframe 里Selenium 需要先switch_to.frame才能抓到。5.5 翻页时 driver 会话失效长时间翻页容易遇到invalid session id。在翻页循环里加重建逻辑except Exception as e: if invalid session id in str(e).lower(): self.init_driver() self.driver.get(self.url) time.sleep(2)配合max_retries重试基本能扛住长任务。6. 把流程固化下来下次直接换参数整套流程跑通后你会发现真正需要改的只有开头那几行配置base_url、max_pages、title_xpath、content_xpath、save_path以及双页后缀规则_2。把这几个抽成配置文件或命令行参数换站点时不用动核心逻辑。如果你在 Trae 里做这类爬虫任务建议把模型接入也固定下来用 TaoToken 的 API 地址https://taotoken.net/api配合 API Key 管理省得每次换环境重新配。长期做编码和 Agent 的话Coding Plan 那条链路会更顺https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。接入细节看文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。最后留个实用习惯每次改完配置先跑--dump-links验证链接再截断章节数验证双页合并两步都过了再跑全本。这样出问题时能立刻定位是翻页层还是章节层比一口气跑完再回头查日志省事得多。