1. 项目背景与核心思路
去年我在追更一部网络小说时,每天都要手动刷新页面查看更新,这种重复劳动让我萌生了写个爬虫自动抓取的想法。用Python实现基础爬虫功能并不复杂,但作为一个喜欢折腾的程序员,我总觉得单纯抓取内容少了点意思。直到某天看到AI生成技术的讨论,突然想到:为什么不给每章内容自动生成吸引眼球的标题呢?
这个项目的核心分为两部分:
- 传统爬虫模块:负责定时抓取小说网站的最新章节内容
- AI增强模块:基于章节正文自动生成符合网络文学风格的标题
这种组合不仅解决了追更的痛点,还能通过AI生成标题来提升阅读体验——毕竟很多网络小说的章节标题实在太过直白(比如"第356章 大战开始")。实测下来,这套系统让我追更的乐趣直接翻倍,每次打开都能看到AI生成的骚气标题,比如"虚空裂变!主角觉醒上古血脉的惊天逆转"。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 爬虫模块实现细节
2.1 目标网站分析与反爬对策
针对小说网站的爬取,我选择了requests-html库而不是常见的Scrapy,因为:
- 动态渲染支持:现代小说网站普遍采用异步加载(如分页内容)
- 内置CSS选择器:比BeautifulSoup更简洁的DOM操作
- 自动重试机制:应对网络波动
典型代码结构:
python复制from requests_html import HTMLSession
session = HTMLSession()
r = session.get('https://www.example.com/chapter/123')
r.html.render(sleep=2) # 等待动态加载
content = r.html.find('.chapter-content', first=True).text
应对反爬的关键配置:
- 随机User-Agent轮换(准备20+常见浏览器标识)
- 请求间隔随机化(2-5秒浮动)
- 代理IP池备用(免费方案可用github上的proxy-list)
- 模拟鼠标移动轨迹(通过pyppeteer实现)
重要提示:务必遵守robots.txt规则,控制请求频率,避免对目标服务器造成压力
2.2 内容清洗与存储
原始HTML需要经过多重处理:
- 广告过滤:用对比算法识别正文区域(基于文本密度和标签分析)
- 格式标准化:统一全角/半角标点、去除特殊空白符
- 分段优化:合并短段落(<50字)、拆分超长段落(>500字)
存储方案对比:
- SQLite:轻量但扩展性差
- MongoDB:适合文档结构,但需要额外部署
- 最终选择:本地JSON文件+Git版本控制(方便内容回溯)
3. AI标题生成模块
3.1 模型选型与微调
测试了三种主流方案:
- GPT-3.5 API:效果惊艳但成本高($0.002/千token)
- 本地部署ChatGLM-6B:需要16GB显存,响应慢
- 最终方案:微调DistilGPT2(300MB显存即可运行)
微调数据准备:
- 爬取3000组"章节内容-标题"配对样本
- 人工筛选出500组高质量样本(标题字数8-15字)
- 数据增强:同义词替换(使用Synonyms库)
关键训练参数:
python复制training_args = TrainingArguments(
output_dir='./results',
num_train_epochs=3,
per_device_train_batch_size=8,
logging_dir='./logs',
save_steps=10_000,
save_total_limit=2,
prediction_loss_only=True,
learning_rate=5e-5
)
3.2 生成策略优化
原始模型直接生成会出现以下问题:
- 标题过长(超过20字)
- 包含敏感词(如"死亡"、"屠杀"等)
- 风格不符(过于学术化)
解决方案:
- 长度控制:在generate()中设置max_length=15
- 关键词过滤:建立200+词的屏蔽词库
- 风格引导:在prompt中加入"请用网络小说风格生成标题,包含以下元素:"
- 夸张形容词(惊天、绝世)
- 悬念设置(!、?)
- 战力体系(境界、血脉)
示例生成效果:
code复制原始内容:主角在秘境中发现上古功法
生成标题:《秘境惊变!混沌功法现世的万古机缘》
4. 系统集成与优化
4.1 定时任务管理
使用APScheduler实现智能调度:
- 新书检测:每天0点全量爬取目录页
- 更新检查:每30分钟检测最新章节(高频时段缩短至15分钟)
- 错峰策略:访问量低谷期(凌晨2-5点)执行资源密集型操作
避免被封的关键技巧:
python复制def random_delay():
delay = random.choice([2, 2.3, 1.7, 3, 4.5]) # 非整数延迟
time.sleep(delay)
4.2 用户交互设计
控制台界面功能:
- 快捷键翻页(←→方向键)
- 标题评分系统(按1-5星收藏优质标题)
- 手动修正接口(输入"r"重新生成当前标题)
数据反馈闭环:
- 用户评分高的标题加入微调数据集
- 频繁触发重新生成的章节内容会被重点标注
5. 踩坑实录与性能优化
5.1 内存泄漏问题
初期版本运行24小时后内存占用达8GB,原因:
- requests-html会话未及时关闭
- 生成模型未做内存清理
解决方案:
python复制# 上下文管理器确保资源释放
with HTMLSession() as session:
# 爬取操作...
del session # 显式删除
# 模型清理
import torch
torch.cuda.empty_cache()
5.2 标题质量波动
发现某些章节生成的标题总是偏离主题,排查发现:
- 正文前200字包含大量设定说明(非情节内容)
- 对话占比过高时模型容易跑偏
改进方法:
- 内容预处理:提取中间1/3段落(通常为核心情节)
- 关键实体提取:用LAC分词器识别人名、地名作为生成锚点
5.3 性能数据对比
优化前后指标对比(处理100章的平均值):
| 指标 | 初始版本 | 优化版本 |
|---|---|---|
| 内存占用 | 3.2GB | 1.1GB |
| 单章处理时间 | 8.7s | 3.2s |
| 标题好评率 | 62% | 83% |
关键优化手段:
- 缓存模型tokenizer
- 异步IO处理网络请求
- 预处理阶段并行化
6. 扩展应用场景
这套技术栈稍作修改就能应用于:
-
自媒体运营
- 批量生成短视频脚本标题
- 知乎回答/公众号文章标题优化
-
网文创作辅助
- 为作家提供标题灵感
- 自动生成章节概要
-
企业级应用
- 新闻简报自动摘要
- 合同关键条款提取
实际测试将技术应用于公众号标题生成后,点击率提升37%。核心调整点:
- 训练数据替换为10w+爆款文章标题
- 加入热点关键词实时检索(通过百度指数API)
- 输出多样性控制(temperature参数调至0.9)
这个项目最让我惊喜的是AI模块与传统爬虫结合产生的化学反应——原本枯燥的技术工具突然有了创作乐趣。现在每次运行爬虫都像开盲盒一样期待会生成什么奇葩标题,这种编程带来的额外快乐,或许就是开发者最好的奖励。
