一 说明
小说添加模块是运营在后台能通过用户反馈或者主动添加的方式人工录入小说列表地址,并自动解析章节规则。
定时任务在实习中,考虑到实际量级,是单机非动态定时任务,后续会升级为定时任务集群(简历亮点可以上升)
注:添加模块只验证章节规则信息,用于后续模块需要抓取所有章节,并非用于抓取最新更新章节。
需要明确两点:
(1)因为正版有防盗章节,所以盗版小说的可读章节是要少于正版的,而且越来越多
(2)正版的更新不需要及时性,不是项目的目标人群
1 产品原型图
二 亮点说明
1 正版源和盗版源章节的选择:M和PC的区别
(1)正版
正版源在业务上有三个需求:1个添加之前已存在的所有章节;2是最新更新的章节;3 小说的基本信息录入
本添加小说模块就是要实现正版的所有章节的通用规则实现:
采用方案,正版使用PC网站,不用分页,能一下解析到所有章节(但是本期不做所有章节的保存)
使用jsoup直接解析html,而不是解析产品;分析到具体的列表元素,如 .content ul li等
后续会升级为 保持每个正版网站的惟一解析规则,即不再为单独一本书添加(本期不做,P4会迭代)
(2)盗版
盗版源在业务上只有一个需求,就是正版已经获取的完整章节列表后,得到最新更新的章节。
经统计,PC端很多源最新更新章节都是包含防盗章节,不可读;但是M站大部分是已经去除防盗的,所以选择m站
且大部分源在header里,都会直接包含最新更新的三要素:章节名、章节地址、录入时间(这个以我们录insert的时间为准)
盗版的抓取规则为:取这两个值
2 定时任务配置
直接在项目里添加schedule,并配置任意规则,只要能启动就行;本期只做抓取的实现,不做定时抓取。
如果想自己实现定时抓取,需要每个小说增加一定的间隔,10秒以上;否则,容易封ip
3 定时抓取的规则(暂时不做)
产品要求小说常规更新时间前2个小时每5分钟更新一次;其他时间每1个小时更新一次
方案:
(1)常规更新时间比较复杂,基本不处理;暂以上次更新时间为准(p4会更新),增加jobType字段 1为5分钟 2为1小时
(2)配置两个周期的定时任务:5分钟一次、1小时一次
5分钟 job要做两个事情:所有jobType都会进行判断,是不是在前后30分内,是的话jobType置成1,且进行抓取;否则,将jobType置成2,不抓取
1小时的job ,只对jobType为2的小说进行抓取
三 数据表设计
1 yike_novel_advice(用户提供的小说添加名称)
字段 | 类型 | 可空 | 备注 |
id | int | 自增 | |
BookName | varchar(30) | 小说名称 | |
Status | tinyint(1) | 1 有效,未处理 0 无效,已处理 | |
AddTime | dateTime | ||
UpdateTime | dateTime | 更新时间 |
2 yike_novel_main_source(正版和盗版的主源,盗版会变动)
正版和盗版分为两行
字段 | 类型 | 可空 | 备注 |
id | int | 自增 | |
NovelId | int(11) | 新增到novel表后小说id | |
BookName | varchar(30) | ||
SourceUrl | varchar(255) | 小说列表页网址 | |
SearchRegex | varchar(255) | 小说章节解析规则 如meta[property=og:novel:latest_chapter_name] | |
Type | tinyint(1) | 1-正版源 2-非正版抓取源 | |
JobType | tinyint(1) | 1-5分钟 2-1小时 | |
Status | tinyint(1) | ||
AddTime | dateTime | ||
UpdateTime | dateTime | 更新时间 |
3 yike_novel 小说详情表(p1表)
四 服务设计
1 增加NovelSourceType枚举: 1-正版源 2-非正版抓取源
2 增加JobType枚举:1-5分钟 2-1小时
3 小说基本信息不是本期的重点,可以适当抓取即可,封皮直接用正版源的地址(找不到,可以放“”)
4提交流程:
运营提交网址解析成功后,接口直接返回正版和非正版的规则;提交接口直接提交