影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容
1. 认识影刀:什么场景该用RPA采小说数据
起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化:榜单页一轮抓取→详情页逐本打开采集→章节页选择性下载。
和前面几个案例不同的是,起点的小说详情点击会打开新标签页。影刀处理新标签页的固定模式:点击前先记下原网页对象→点击后"获取已打开的网页对象"拿到新页面的对象→在新页面操作完→关闭新标签页→回到原页面继续循环下一个。三个网页对象变量不要混用:
榜单页对象 = 获取已打开的网页对象() For 小说 in 榜单小说列表: 详情页对象 = None # 新标签页 点击小说链接 # 这会打开新标签页 详情页对象 = 获取已打开的网页对象(匹配方式="当前选中的网页") 提取详情页数据... 关闭标签页(详情页对象) 切换回 榜单页对象 # 继续循环 End For2. 元素定位四合一:分类榜单的表格型页面
起点分类榜单是标准表格布局,结构极其规整。这反而是最容易踩坑的——规整意味着所有行class一样,元素定位时容易误匹配。
榜单页每行包含9个字段:排名/书名/作者/分类/字数/收藏/月票/状态/更新时间。定位时:
- 用
table.rank-table tbody tr定位行元素(不要选整个table,取其tbody内的tr) - 书名在
tr td:nth-child(2) a,作者在td:nth-child(3) - 字数/收藏/月票这些数字字段在各自的
td中,有些带单位(万字/万),取值时要去掉单位 - 状态字段(连载/完结)有个小图标+文字的组合,取textContent即可
关联父元素法:把每一行tr作为父元素,然后关联找到内部的书名a标签(获取关联元素),拿到书名文本和详情页链接。一个tr下面的td各取所需,不用重复定位整行。
正则应用:字数如"120.5万字"需要转成数值,正则\d+\.?\d*匹配数字部分。
3. 变量与数据类型:小说数据结构
小说榜列表 = [] 单本小说 = { "rank": "", # 排名 "title": "", # 书名 "author": "", # 作者 "category": "", # 分类 "word_count": "", # 总字数 "favorite": "", # 收藏数 "monthly_ticket": "",# 月票 "status": "", # 连载/完结 "update_time": "", # 最后更新时间 "intro": "", # 简介(从详情页获取) "tags": [], # 标签(从详情页获取) "total_chapters": 0, # 总章节数 "vip_chapters": 0, # VIP章节数 "url": "" # 详情页地址 }数据表格在影刀中创建:新建数据表格(["排名","书名","作者","字数","收藏","月票","状态","更新时间"])。数据表格比Excel轻量,适合采集过程中的临时存储。写入方式:数据表格.追加行([排名, 书名, 作者,...])。全部采集完再一次性导出到Excel。
4. 流程控制:三层循环+区间翻页
分类榜单有几十页,每页几十本,加上详情页是第三层。三层的流程控制要格外小心变量覆盖。
分类URL = "https://www.qidian.com/rank/..." 打开网页 分类URL 总采集数 = 0 目标采集数 = 500 # 本次计划采集500本 已采集书名 = [] # 去重用 无限循环: # 翻页循环 获取相似元素 ".rank-table tbody tr" For tr in 相似元素: # 行循环 If 总采集数 >= 目标采集数: 退出所有循环 End If 排名 = 关联获取 tr下 td:nth-child(1) 的text 书名 = 关联获取 tr下 a.rank-book-name 的text If 书名 in 已采集书名: Continue End If 作者 = 关联获取 tr下 td:nth-child(3) 的text 字数 = 关联获取 tr下 td:nth-child(4) 的text 收藏 = 关联获取 tr下 td:nth-child(5) 的text 月票 = 关联获取 tr下 td:nth-child(6) 的text 状态 = 关联获取 tr下 td:nth-child(7) 的text 更新 = 关联获取 tr下 td:nth-child(8) 的text 书名链接 = 关联获取 a.rank-book-name 的href属性 # 详情页(新标签页) 原有页面 = 获取已打开的网页对象() 点击 书名链接 详情页 = 获取已打开的网页对象(匹配="当前选中") 提取 简介/标签/章节信息... 单本小说 = {排名, 书名, 作者, ...} 小说榜列表.append(单本小说) 已采集书名.append(书名) 总采集数 += 1 关闭标签页(详情页) 切换回 原有页面 # 继续循环下一本 End For 点击下一页 If 下一页元素.class 包含 "disabled": 退出无限循环 End If If 总采集数 >= 目标采集数: 退出无限循环 End If End 无限循环翻页判断和之前一样:class里不勾disabled,到最后一页时disabled让元素校验失败,走找不到元素分支退出。
5. 网页自动化:新标签页处理是核心
起点每本书的详情页是点击书名打开的新标签页。影刀处理流程:
点击前:先原有页面 = 获取已打开的网页对象()把榜单页存下来。
点击后:用详情页 = 获取已打开的网页对象(匹配方式="匹配当前选中的网页")拿到新打开的详情页。注意这里的匹配方式不能是"按标题/网址",因为不知道每本书的具体URL。
操作详情页:所有用"网页对象=详情页"的指令都在新页面执行。提取书名/简介/标签/章节等字段。
关闭返回:操作完用关闭标签页(详情页)→回到榜单页对象→继续循环下一行。
一个关键踩坑:如果网络慢,点击后新标签页还没完全加载,获取已打开的网页对象会拿到旧页面。解决方法:点击后等待(2)或等待元素出现(详情页的某个特征元素, timeout=10),确认新页面加载完再获取对象。
6. 数据处理:榜单数据对比分析
数据分析分两个维度:
单日榜单快照:按收藏数降序排列,看头部作品。按字数分类统计(100万字以下/100-300万/300万以上)。按状态分(连载vs完结)算比例。
跨日排行榜变化监控:每天都抓一次榜单,对比前后两天的排名变化:
- 新增上榜:昨天不在今天在
- 掉榜:昨天在今天不在
- 排名跃升(上升超过10名)
- 排名暴跌(下降超过10名)
用Excel的VLOOKUP做两个日期的关联比对。影刀流:读昨天Excel→读今天Excel→数据表格做匹配→标记变化类型→写入变化报告。
7. 鼠标键盘图像:榜单页操作较少
起点榜单页是比较干净的HTML页面,元素定位都能命中的话不需要图像操作。但是某些分类页有"加载更多"按钮(非标准分页),这时候:
- 点击"加载更多"按钮后等待1-2秒
- 需要单独处理
未找到元素的情况:Try: 点击加载更多 Catch: Continue(没有更多就跳过) - 如果按钮位置在可视区域外,影刀会自动滚动到按钮位置再点击,不需要手动滚动
8. 进阶技能:章节结构分析+内容摘要
进入详情页后,可以进一步获取章节信息。起点章节列表是单独的一个tab页,URL格式通常为https://www.qidian.com/book/{bookId}/catalog。
获取章节信息的目的不是爬全部小说内容(那是版权红线),而是做市场分析:
- 总章节数:看作品连载进度
- VIP章节数:看付费转化节点
- 章节平均字数:每章字数稳定性
- 更新频率:最近10章的发布时间间隔
章节列表页面有大量分页,建议只采集前3页和最后1页的章节信息。前3页看出书前期节奏,最后1页看最新章节更新频率。
9. 平台实战:起点中文网 + Excel报告
起点采集实战
步骤:选中基准分类(如"玄幻")→抓取前10页榜单(每页20本=200本)→逐个打开详情页获取补充信息→写入Excel。
单次采集200本书,每本详情页花费2-3秒,总耗时约15-20分钟。严格控制速度,不要对服务器造成压力。
Excel市场分析报告
在Excel中生成摘要:
- 头部作品Top 10表格
- 分类下连载率(连载占比vs完结占比)
- 平均字数和收藏分布
- 新书入榜趋势(同比上周)
home.linyan.cloud 提供了起点小说数据采集的完整模板和分析报告生成器。
10. 系统联动:采集→分析→报告→推送
影刀采集 200本基本信息 → Excel原始数据 Python分析模块(pandas): - 按分类汇总字数分布 - 计算收藏-月票相关性 - 识别新锐作品(短期收藏增速Top) → 生成分析报告Excel + 摘要文本 影刀读取摘要 → 飞书定时推送计划任务设置:每周一早上8点自动运行一次,采集一周的榜单变化。分析报告自动归档到D:/book_reports/目录。
11. 工程化规范
采集频率:单次运行不要超过500本书。每本书详情页操作后等待2-3秒。
去重策略:书名作为去重主键不够(可能重名),用"书名+作者"联合主键。
新标签页资源管理:每处理完一个详情页就关闭标签页,不要堆着几十个标签。实测超过15个标签页时浏览器内存占用飙升,影刀操作可能卡顿。
异常处理:
- 详情页加载超时→记入失败列表→跳过继续下一本
- 章节页被反爬拦截(验证码)→暂停整个流程,通知人工处理
- 网络断开→在当前book处理完后优雅退出,不要丢数据
日志规范:每10本书打一次日志:"进度: 10/200, 当前: 《xxx》"。
12. 速查表 / 常见报错
| 报错 | 原因 | 解决 |
|---|---|---|
获取已打开的网页对象失败 | 新标签页未完全加载 | 点击后加等待或等待特征元素出现 |
| 元素校验失败(详情页) | 部分书详情页结构不同 | 降低属性匹配门槛,只用短CSS选择器 |
| 新标签页操作后循环回到旧页面时失败 | 网页对象变量混淆 | 操作新页面前先存旧页面对象 |
| 采集速度太慢 | 每本书详情页交互过多 | 能走API就走API,不用逐页解析 |
| 排行榜数据不完整 | 部分行有隐藏/折叠 | 检查DOM里隐藏的display:none元素 |
| 字数变科学计数法 | 长数字写入Excel | 设置文本格式的列 |
Cannot read property of null | 部分字段在详情页可能不存在 | 加try-except默认值兜底 |
采集参数建议:单次运行上限500本,每本间隔2-3秒,每小时不超过300次详情页请求。
内容标签:#影刀RPA #起点中文网 #小说数据采集 #新标签页处理 #Excel报告 #飞书通知
作者:林焱