Z-BlogPHP文章采集去重,避免重复内容
Z-BlogPHP采集文章时,重复内容通常来自标题相同、正文相似或来源URL一致。
去重核心思路是入库前拦截 + 入库后清理,而不是等搜索引擎判重后再补救。
下面按准备、操作、避坑、验证四个环节展开,零基础也能照着做。
先搞清楚重复是怎么进来的
Z-BlogPHP本身没有强制的采集去重机制,重复内容一般有三个来源:
- 采集插件重复抓取同一来源:不同时间采集同一批源站,标题和正文完全一样。
- 标题被改写但正文未变:伪原创工具只改标题,正文原样入库。
- 多插件交叉采集:两个采集插件同时运行,同一篇文章被写入两次。
判断依据很简单:登录Z-BlogPHP后台,进入文章管理,按标题排序,如果出现连续多条标题高度相似,基本就是重复入库了。
入库前拦截:配置采集插件去重
大多数Z-BlogPHP采集插件都带有去重选项,以常见的采集插件为例,进入后台 -> 插件管理 -> 采集设置,重点检查以下配置:
- 标题重复检测:开启后,标题完全相同的文章不会重复入库。
- 来源URL去重:同一源地址只采集一次,建议开启。
- 正文相似度阈值:部分插件支持设置相似度百分比,建议设为80%以上才判定为重复。
如果插件没有内置去重,可以在采集规则里加一条过滤条件:
过滤规则:标题包含“已采集”则跳过
或者采集完成后先不发布,进入草稿箱人工抽检,确认无重复再批量发布。
入库后清理:用SQL找出重复文章
已经入库的重复内容需要手动清理。
操作前务必先备份数据库,宝塔面板用户可以在数据库 -> 备份中一键备份。
登录phpMyAdmin或通过命令行进入MySQL,执行以下SQL查询重复标题:
SELECT log_Title, COUNT(*) AS cnt
FROM zbp_post
GROUP BY log_Title
HAVING cnt > 1
ORDER BY cnt DESC;
其中zbp_post是Z-BlogPHP默认文章表,如果你的表前缀不是zbp_,请替换成实际前缀。
查询结果会列出所有重复标题及出现次数。
找到重复文章后,保留最新或内容最完整的一条,删除其余重复项。
删除前建议先导出这些文章的ID,方便核对:
SELECT log_ID, log_Title, log_PostTime
FROM zbp_post
WHERE log_Title = '重复的标题';
确认无误后,在后台文章管理中逐条删除,或通过SQL批量删除指定ID。
避坑:去重时容易踩的坑
- 不要直接删除数据库记录:Z-BlogPHP的文章可能关联标签、评论、附件表,直接删
zbp_post会导致关联数据残留。建议通过后台删除,或同时清理zbp_post、zbp_tag关联表。 - 相似度判断不要设太低:阈值设成50%会把正常文章误判为重复,建议80%起步。
- 采集频率不要过高:短时间内大量采集容易触发源站反爬,也可能导致插件写入异常产生重复。
- 伪原创不等于去重:只改标题不改正文,搜索引擎仍可能判定为重复内容,建议正文至少做段落重组。
验证去重效果
清理完成后,回到Z-BlogPHP后台文章管理,按标题排序检查是否还有连续重复项。
同时可以用以下SQL复查:
SELECT COUNT(*) AS total,
COUNT(DISTINCT log_Title) AS unique_titles
FROM zbp_post;
如果total和unique_titles数值接近,说明标题层面去重基本完成。
正文相似度则需要通过搜索引擎site查询或站内搜索抽查,确认没有大批量雷同内容。
常见疑问
采集插件本身没有去重功能怎么办?
可以在采集规则中设置“标题过滤”,或者采集后先存草稿,用上面的SQL定期排查。
去重后原来收录的重复页面会消失吗?
删除重复文章后,原URL会返回404。建议在Z-BlogPHP后台设置404跳转到首页或相关栏目,减少对搜索引擎的影响。
正文相似但标题不同,SQL能查出来吗?
纯SQL只能查标题完全相同的。正文相似度需要借助插件或外部工具,例如用Python脚本计算文本相似度后再处理。
Z-BlogPHP文章采集去重的关键是把好入库关,再定期用SQL清理存量重复内容。
建议每次批量采集后都执行一次标题查重,养成习惯后重复内容会明显减少。