实战干货:Python工业数据采集结合LLM批量生成优质小说章节标题
在网文创作领域章节标题的重要性不言而喻。一个好的标题不仅能精准概括章节核心内容还能极大提升读者的点击欲望和阅读粘性。但对于日更数千甚至上万字的作者来说每天为多个章节构思吸引人的标题往往是一件耗时耗力的事情。本文将分享一个全流程自动化解决方案通过Python实现小说内容的工业数据采集结合大语言模型LLM批量生成符合网文风格的优质章节标题。这套方案不仅能将作者从繁琐的标题构思中解放出来还能保证标题风格的一致性和吸引力。一、系统整体架构设计整个自动化系统采用模块化设计分为五个核心模块各模块职责清晰便于后期维护和扩展。系统整体流程如下小说内容采集数据清洗与预处理提示词工程模块LLM标题生成结果过滤与导出各模块的核心功能小说内容采集模块负责从目标站点获取小说的章节标题和正文内容处理网站防护机制数据清洗与预处理模块去除采集内容中的噪声数据格式化文本结构提示词工程模块构建符合网文标题风格的提示词模板注入上下文信息LLM标题生成模块调用大模型API批量生成章节标题处理异常情况结果过滤与导出模块过滤不符合要求的标题将结果导出为可编辑格式二、核心模块实现详解2.1 小说内容采集模块采集模块是整个系统的基础我们使用curl_cffi库来模拟浏览器TLS指纹有效绕过大部分网站的基础防护机制。相比传统的requests库curl_cffi在应对现代网站防护方面表现更加出色。fromcurl_cffiimportrequestsfrombs4importBeautifulSoupimporttimeimportrandomclassNovelCrawler:def__init__(self):self.sessionrequests.Session()self.headers{User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36,Accept-Language:zh-CN,zh;q0.9}defget_chapter_content(self,url):try:# 添加随机延时避免请求过于频繁time.sleep(random.uniform(1,3))responseself.session.get(url,headersself.headers,impersonatechrome125)response.encodingutf-8soupBeautifulSoup(response.text,html.parser)# 根据目标站点结构调整选择器titlesoup.find(h1,class_chapter-title).text.strip()contentsoup.find(div,class_chapter-content).text.strip()return{original_title:title,content:content}exceptExceptionase:print(f采集失败:{url}, 错误:{e})returnNone关键注意点必须添加合理的请求间隔避免给目标站点造成过大压力使用impersonate参数模拟真实浏览器的TLS指纹加入异常处理机制确保采集过程的稳定性遵守目标站点的robots.txt协议和相关法律法规2.2 数据清洗与预处理采集到的原始内容通常包含大量的HTML标签、广告信息、空行和特殊字符需要进行清洗才能用于后续的标题生成。importredefclean_text(text):# 移除HTML标签textre.sub(r[^],,text)# 移除多余的空白字符textre.sub(r\s, ,text)# 移除特殊字符textre.sub(r[^\u4e00-\u9fa5a-zA-Z0-9。()],,text)# 截断过长内容避免超出LLM上下文限制iflen(text)2000:texttext[:2000]...returntext.strip()2.3 提示词工程与LLM调用提示词的质量直接决定了生成标题的效果。我们需要设计一个精准的提示词模板明确告诉大模型我们需要什么样的标题。fromopenaiimportOpenAIimportosclassLLMTitleGenerator:def__init__(self):self.clientOpenAI(api_keyos.getenv(LLM_API_KEY),base_urlos.getenv(LLM_BASE_URL))self.prompt_template 你是一位资深的网文编辑擅长创作吸引人的小说章节标题。 请根据以下章节内容生成一个符合网文风格的章节标题。 要求 1. 标题长度控制在8-15个字之间 2. 突出章节的核心冲突或悬念 3. 语言简洁有力具有吸引力 4. 避免使用过于生僻的词汇 5. 风格与示例保持一致 示例标题 - 深夜的神秘访客 - 生死一线的对决 - 隐藏多年的秘密 章节内容{content} 请直接输出标题不要添加任何额外解释。 defgenerate_title(self,content):try:promptself.prompt_template.format(contentcontent)responseself.client.chat.completions.create(modelqwen-turbo,messages[{role:user,content:prompt}],temperature0.7,max_tokens50)returnresponse.choices[0].message.content.strip()exceptExceptionase:print(f标题生成失败:{e})returnNone提示词优化技巧提供多个高质量的示例标题引导大模型生成符合预期风格的内容明确指定标题的长度范围和核心要求适当调整temperature参数平衡生成结果的稳定性和多样性对于不同类型的小说玄幻、都市、悬疑等可以设计不同的提示词模板2.4 批量处理与结果导出最后我们将各个模块整合起来实现批量处理和结果导出功能。importcsvdefmain():crawlerNovelCrawler()generatorLLMTitleGenerator()# 章节URL列表chapter_urls[https://example.com/chapter/1,https://example.com/chapter/2,# 更多章节URL]results[]forurlinchapter_urls:chapter_datacrawler.get_chapter_content(url)ifnotchapter_data:continuecleaned_contentclean_text(chapter_data[content])new_titlegenerator.generate_title(cleaned_content)ifnew_title:results.append({original_title:chapter_data[original_title],new_title:new_title,content:cleaned_content[:100]...})print(f生成成功:{new_title})# 导出为CSV文件withopen(generated_titles.csv,w,newline,encodingutf-8-sig)asf:writercsv.DictWriter(f,fieldnames[original_title,new_title,content])writer.writeheader()writer.writerows(results)print(f共生成{len(results)}个标题结果已保存到generated_titles.csv)if__name____main__:main()三、效果展示与优化方向3.1 实际效果展示我们使用某热门玄幻小说的10个章节进行测试以下是部分生成结果对比原始标题LLM生成标题第三十二章 冲突宗门内的正面冲突第三十三章 出手长老级别的出手第三十四章 底牌隐藏的终极底牌第三十五章 震惊全场为之震惊第三十六章 约定一年后的生死约可以看到生成的标题不仅准确概括了章节内容还比原始标题更具吸引力和悬念感。3.2 系统优化方向上下文增强在生成当前章节标题时加入前1-2章的内容摘要让大模型更好地理解剧情发展脉络多模型对比测试不同大模型的生成效果选择最适合网文风格的模型批量并发处理使用异步调用或多线程技术提高批量生成的效率标题多样性为每个章节生成多个候选标题供作者选择风格迁移通过微调或few-shot学习让生成的标题更贴近特定作者的风格四、总结本文介绍的PythonLLM小说章节标题自动生成系统实现了从数据采集到标题生成的全流程自动化。通过合理的架构设计和提示词工程生成的标题在准确性和吸引力方面都达到了不错的效果。这套方案不仅适用于小说章节标题生成还可以轻松扩展到其他文本标题生成场景如技术文章标题、短视频标题、公众号文章标题等。在实际应用中我们可以根据具体需求调整提示词模板和系统参数以获得最佳的生成效果。需要注意的是自动化工具只是辅助创作的手段不能完全替代人类的创造力。作者可以将生成的标题作为参考结合自己的创作思路进行调整和优化最终创作出更加优秀的作品。本文提供的代码仅为核心实现思路在实际生产环境中还需要加入更完善的错误处理、日志记录、配置管理等功能以保证系统的稳定性和可维护性。