欢迎光临
我们一直在努力

实战干货:Python工业数据采集结合LLM批量生成优质小说章节标题

在这里插入图片描述
在网文创作领域,章节标题的重要性不言而喻。一个好的标题不仅能精准概括章节核心内容,还能极大提升读者的点击欲望和阅读粘性。但对于日更数千甚至上万字的作者来说,每天为多个章节构思吸引人的标题,往往是一件耗时耗力的事情。

本文将分享一个全流程自动化解决方案,通过Python实现小说内容的工业数据采集,结合大语言模型(LLM)批量生成符合网文风格的优质章节标题。这套方案不仅能将作者从繁琐的标题构思中解放出来,还能保证标题风格的一致性和吸引力。

一、系统整体架构设计

整个自动化系统采用模块化设计,分为五个核心模块,各模块职责清晰,便于后期维护和扩展。系统整体流程如下:

#mermaid-svg-cieGrStNjMQAtnCx{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-cieGrStNjMQAtnCx .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-cieGrStNjMQAtnCx .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-cieGrStNjMQAtnCx .error-icon{fill:#552222;}#mermaid-svg-cieGrStNjMQAtnCx .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-cieGrStNjMQAtnCx .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-cieGrStNjMQAtnCx .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-cieGrStNjMQAtnCx .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-cieGrStNjMQAtnCx .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-cieGrStNjMQAtnCx .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-cieGrStNjMQAtnCx .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-cieGrStNjMQAtnCx .marker{fill:#333333;stroke:#333333;}#mermaid-svg-cieGrStNjMQAtnCx .marker.cross{stroke:#333333;}#mermaid-svg-cieGrStNjMQAtnCx svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-cieGrStNjMQAtnCx p{margin:0;}#mermaid-svg-cieGrStNjMQAtnCx .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-cieGrStNjMQAtnCx .cluster-label text{fill:#333;}#mermaid-svg-cieGrStNjMQAtnCx .cluster-label span{color:#333;}#mermaid-svg-cieGrStNjMQAtnCx .cluster-label span p{background-color:transparent;}#mermaid-svg-cieGrStNjMQAtnCx .label text,#mermaid-svg-cieGrStNjMQAtnCx span{fill:#333;color:#333;}#mermaid-svg-cieGrStNjMQAtnCx .node rect,#mermaid-svg-cieGrStNjMQAtnCx .node circle,#mermaid-svg-cieGrStNjMQAtnCx .node ellipse,#mermaid-svg-cieGrStNjMQAtnCx .node polygon,#mermaid-svg-cieGrStNjMQAtnCx .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-cieGrStNjMQAtnCx .rough-node .label text,#mermaid-svg-cieGrStNjMQAtnCx .node .label text,#mermaid-svg-cieGrStNjMQAtnCx .image-shape .label,#mermaid-svg-cieGrStNjMQAtnCx .icon-shape .label{text-anchor:middle;}#mermaid-svg-cieGrStNjMQAtnCx .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-cieGrStNjMQAtnCx .rough-node .label,#mermaid-svg-cieGrStNjMQAtnCx .node .label,#mermaid-svg-cieGrStNjMQAtnCx .image-shape .label,#mermaid-svg-cieGrStNjMQAtnCx .icon-shape .label{text-align:center;}#mermaid-svg-cieGrStNjMQAtnCx .node.clickable{cursor:pointer;}#mermaid-svg-cieGrStNjMQAtnCx .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-cieGrStNjMQAtnCx .arrowheadPath{fill:#333333;}#mermaid-svg-cieGrStNjMQAtnCx .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-cieGrStNjMQAtnCx .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-cieGrStNjMQAtnCx .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-cieGrStNjMQAtnCx .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-cieGrStNjMQAtnCx .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-cieGrStNjMQAtnCx .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-cieGrStNjMQAtnCx .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-cieGrStNjMQAtnCx .cluster text{fill:#333;}#mermaid-svg-cieGrStNjMQAtnCx .cluster span{color:#333;}#mermaid-svg-cieGrStNjMQAtnCx div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-cieGrStNjMQAtnCx .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-cieGrStNjMQAtnCx rect.text{fill:none;stroke-width:0;}#mermaid-svg-cieGrStNjMQAtnCx .icon-shape,#mermaid-svg-cieGrStNjMQAtnCx .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-cieGrStNjMQAtnCx .icon-shape p,#mermaid-svg-cieGrStNjMQAtnCx .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-cieGrStNjMQAtnCx .icon-shape .label rect,#mermaid-svg-cieGrStNjMQAtnCx .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-cieGrStNjMQAtnCx .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-cieGrStNjMQAtnCx .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-cieGrStNjMQAtnCx :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

小说内容采集

数据清洗与预处理

提示词工程模块

LLM标题生成

结果过滤与导出

各模块的核心功能:

  • 小说内容采集模块:负责从目标站点获取小说的章节标题和正文内容,处理网站防护机制
  • 数据清洗与预处理模块:去除采集内容中的噪声数据,格式化文本结构
  • 提示词工程模块:构建符合网文标题风格的提示词模板,注入上下文信息
  • LLM标题生成模块:调用大模型API,批量生成章节标题,处理异常情况
  • 结果过滤与导出模块:过滤不符合要求的标题,将结果导出为可编辑格式

二、核心模块实现详解

2.1 小说内容采集模块

采集模块是整个系统的基础,我们使用curl_cffi库来模拟浏览器TLS指纹,有效绕过大部分网站的基础防护机制。相比传统的requests库,curl_cffi在应对现代网站防护方面表现更加出色。

from curl_cffi import requests
from bs4 import BeautifulSoup
import time
import random

class NovelCrawler:
def __init__(self):
self.session = requests.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;q=0.9"
}

def get_chapter_content(self, url):
try:
# 添加随机延时,避免请求过于频繁
time.sleep(random.uniform(1, 3))
response = self.session.get(url, headers=self.headers, impersonate="chrome125")
response.encoding = "utf-8"
soup = BeautifulSoup(response.text, "html.parser")

# 根据目标站点结构调整选择器
title = soup.find("h1", class_="chapter-title").text.strip()
content = soup.find("div", class_="chapter-content").text.strip()

return {"original_title": title, "content": content}
except Exception as e:
print(f"采集失败: {url}, 错误: {e}")
return None

关键注意点:

  • 必须添加合理的请求间隔,避免给目标站点造成过大压力
  • 使用impersonate参数模拟真实浏览器的TLS指纹
  • 加入异常处理机制,确保采集过程的稳定性
  • 遵守目标站点的robots.txt协议和相关法律法规

2.2 数据清洗与预处理

采集到的原始内容通常包含大量的HTML标签、广告信息、空行和特殊字符,需要进行清洗才能用于后续的标题生成。

import re

def clean_text(text):
# 移除HTML标签
text = re.sub(r'<[^>]+>', '', text)
# 移除多余的空白字符
text = re.sub(r'\\s+', ' ', text)
# 移除特殊字符
text = re.sub(r'[^\\u4e00-\\u9fa5a-zA-Z0-9,。!?;:""''()()]', '', text)
# 截断过长内容,避免超出LLM上下文限制
if len(text) > 2000:
text = text[:2000] + "…"
return text.strip()

2.3 提示词工程与LLM调用

提示词的质量直接决定了生成标题的效果。我们需要设计一个精准的提示词模板,明确告诉大模型我们需要什么样的标题。

from openai import OpenAI
import os

class LLMTitleGenerator:
def __init__(self):
self.client = OpenAI(
api_key=os.getenv("LLM_API_KEY"),
base_url=os.getenv("LLM_BASE_URL")
)
self.prompt_template = """
你是一位资深的网文编辑,擅长创作吸引人的小说章节标题。
请根据以下章节内容,生成一个符合网文风格的章节标题。
要求:
1. 标题长度控制在8-15个字之间
2. 突出章节的核心冲突或悬念
3. 语言简洁有力,具有吸引力
4. 避免使用过于生僻的词汇
5. 风格与示例保持一致

示例标题:
– 深夜的神秘访客
– 生死一线的对决
– 隐藏多年的秘密

章节内容:{content}

请直接输出标题,不要添加任何额外解释。
"""

def generate_title(self, content):
try:
prompt = self.prompt_template.format(content=content)
response = self.client.chat.completions.create(
model="qwen-turbo",
messages=[{"role": "user", "content": prompt}],
temperature=0.7,
max_tokens=50
)
return response.choices[0].message.content.strip()
except Exception as e:
print(f"标题生成失败: {e}")
return None

提示词优化技巧:

  • 提供多个高质量的示例标题,引导大模型生成符合预期风格的内容
  • 明确指定标题的长度范围和核心要求
  • 适当调整temperature参数,平衡生成结果的稳定性和多样性
  • 对于不同类型的小说(玄幻、都市、悬疑等),可以设计不同的提示词模板

2.4 批量处理与结果导出

最后,我们将各个模块整合起来,实现批量处理和结果导出功能。

import csv

def main():
crawler = NovelCrawler()
generator = LLMTitleGenerator()

# 章节URL列表
chapter_urls = [
"https://example.com/chapter/1",
"https://example.com/chapter/2",
# 更多章节URL
]

results = []
for url in chapter_urls:
chapter_data = crawler.get_chapter_content(url)
if not chapter_data:
continue

cleaned_content = clean_text(chapter_data["content"])
new_title = generator.generate_title(cleaned_content)

if new_title:
results.append({
"original_title": chapter_data["original_title"],
"new_title": new_title,
"content": cleaned_content[:100] + "…"
})
print(f"生成成功: {new_title}")

# 导出为CSV文件
with open("generated_titles.csv", "w", newline="", encoding="utf-8-sig") as f:
writer = csv.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学习,让生成的标题更贴近特定作者的风格
  • 四、总结

    本文介绍的Python+LLM小说章节标题自动生成系统,实现了从数据采集到标题生成的全流程自动化。通过合理的架构设计和提示词工程,生成的标题在准确性和吸引力方面都达到了不错的效果。

    这套方案不仅适用于小说章节标题生成,还可以轻松扩展到其他文本标题生成场景,如技术文章标题、短视频标题、公众号文章标题等。在实际应用中,我们可以根据具体需求调整提示词模板和系统参数,以获得最佳的生成效果。

    需要注意的是,自动化工具只是辅助创作的手段,不能完全替代人类的创造力。作者可以将生成的标题作为参考,结合自己的创作思路进行调整和优化,最终创作出更加优秀的作品。

    本文提供的代码仅为核心实现思路,在实际生产环境中,还需要加入更完善的错误处理、日志记录、配置管理等功能,以保证系统的稳定性和可维护性。

    赞(0)
    未经允许不得转载:171主机测评 » 实战干货:Python工业数据采集结合LLM批量生成优质小说章节标题
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址