海洋 CMS 采集如何跳过已采集内容
结论:海洋CMS 采集想跳过已采集内容,不能只靠一个开关,要三件事一起做——**增量采集(只拉最新 1-3 页)+ 采集规则里指定查重字段(一般是影片名)+ 数据库层兜底(唯一索引或入库前查重)**。只做其中一件,重复内容迟早会进来。
海洋CMS 采集为什么会重复入库?
结论:因为默认采集是"全量拉取 + 直接写入",采集器只负责把接口返回的数据塞进影片表,不做查重判断。
海洋CMS(海洋影视管理系统,PHP + MySQL 的影视建站程序)的采集流程是:按采集节点里配置的接口地址抓取列表 → 解析成数组 → 循环入库。只要同一部影片在两次采集的结果里都出现,就会写进两条记录(v_id 不同、v_name 相同),前台表现就是重复影片、重复播放列表。
海洋CMS 默认表前缀是 sea_,影片主表是 sea_data,常用字段有 v_id(主键)、v_name(影片名)、v_addtime(入库时间)。如果你安装时改过前缀,以实际表名为准,用 phpMyAdmin 或 Navicat 看一眼就知道。
增量采集:跳过已采集内容最省事的办法
结论:把"采集全部 / 采集 50 页"改成"只采最新 1-3 页",能挡掉 90% 以上的重复。
绝大多数资源库接口(苹果 CMS 资源库、海洋资源库、自定义采集接口)的返回结果都是按更新时间倒序的,第 1 页就是最近几小时更新的内容。具体操作:
- 采集节点设置里,采集页数填 1-3 页,不要填几十页;
- 点「采集最新」而不是「采集全部」;
- 定时采集(计划任务)按 每小时 1 次、每次只跑第 1 页 配置,而不是每天跑一次全量。
采集规则里怎么设置查重字段?
结论:查重字段优先选 v_name(影片名),不要用 v_id——因为资源站的 ID 和本站的 v_id 是两套体系,永远不会冲突。
在采集节点的字段绑定 / 入库选项中,把「重复判断」或「查重字段」指向影片名。判断逻辑是一句 SQL:
SELECT v_id FROM sea_data WHERE v_name = '影片名' LIMIT 1;
有结果就跳过或只更新播放地址,没结果才 INSERT。
注意点:影片名查重会误杀同名不同剧集(比如两部叫《狂飙》的内容),如果你的站会采综艺分集或同名短剧,建议改成「影片名 + 年份」或「影片名 + 主演」组合查重,误杀率会降到 1% 以下。
数据库层面怎么兜底去重?
结论:给查重字段加唯一索引,让重复数据在写入那一刻就被 MySQL 拒绝,比程序判断更可靠。
ALTER TABLE sea_data ADD UNIQUE KEY uk_v_name (v_name(100));
v_name(100) 是前缀索引——因为影片名是变长字段,整列做唯一索引容易超长报错。
加索引前必须先清掉表里已有的重复数据,否则 ALTER 语句会直接失败:
DELETE t1 FROM sea_data t1
INNER JOIN sea_data t2
WHERE t1.v_name = t2.v_name AND t1.v_id > t2.v_id;
这条语句的意思是:同名影片只保留 v_id 最小的那条。执行前务必先备份数据库,删除是不可逆的。
另外,采集入库时可以用 INSERT IGNORE 或 ON DUPLICATE KEY UPDATE 替代普通 INSERT,前者遇重复静默跳过,后者重复时更新播放地址,适合资源站换线路的场景。
为什么设了跳过还是重复?三个高频原因
结论:去重失效基本出在这三处,按顺序排查即可。
第一,播放地址带了随机参数。 资源站返回的播放链接常带 ?t=1699999999 这类时间戳,导致地址字段每次都不同,按地址查重必然失败。解决方法是入库前先对地址做一次截断或哈希再比对。
第二,标题里的空白和全半角没统一。 " 流浪地球 " 和 "流浪地球" 在 MySQL 里是两条不同记录。入库前用 trim() 加全角转半角处理一次即可。
第三,定时任务没有记录上次采集位置。 如果你的采集节点是"按 ID 区间采集"而不是"按最新页采集",就必须把上一次采到的最大 ID 存下来,下次从 上次ID + 1 开始。
收尾
跳过已采集内容这件事,本质是把"事后清理"改成"事前拦截":用增量采集控制来源范围,用影片名查重拦住绝大部分重复,再用唯一索引做最后一道闸门。三步做完,重复数据基本归零;漏掉任何一步,早晚都要回头手动删数据。
原文链接:https://www.gj0.com/thread-598.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。