反复抓取却不收录的页面,用一条链路就能揪出来:先从服务器日志里按蜘蛛 UA 统计每个 URL 的抓取次数,再用站长平台的索引查询逐条核对,抓取 ≥3 次、观察 30 天仍无索引记录的 URL,就是问题页面。
怎么从服务器日志里找出被反复抓取的页面?
结论:日志是唯一能拿到"蜘蛛真实抓了谁、抓了几次"的数据源,站长平台给不了这个粒度的原始记录。
前提是你的服务器保留了 access log。Nginx 默认 combined 格式里,$1 是访客 IP,$7 是请求 URL,$NF 通常是 UA。按蜘蛛 UA 过滤后聚合计数即可:
grep -i "Baiduspider" access.log \
| awk '{print $7}' \
| sort | uniq -c | sort -rn | head -50
# 谷歌蜘蛛,同时看状态码分布($9 是状态码)
grep -i "Googlebot" access.log \
| awk '{print $9, $7}' | sort | uniq -c | sort -rn | head -50
操作要点有三个。第一,日志按天切割,只分析最近 7 到 30 天的窗口,再早的数据对收录判断没有参考价值。第二,统计口径要排除静态资源,用 grep -vE "\.(js|css|png|jpg|woff2)$" 过滤掉,否则图片和脚本会占满头部排名。第三,同时统计状态码,200 和 404、301 的处理逻辑完全不同。
怎么判断这些页面到底有没有被收录?
结论:没有单一工具能给出 100% 准确的收录结果,必须用平台数据和 site: 查询交叉验证。
三种手段配合使用:一是百度搜索资源平台的"普通收录—索引量"和"抓取频次"曲线,看整体趋势;二是 Google Search Console 的"页面编入索引"报告,它会直接列出"已抓取—尚未编入索引"的 URL 分组,这是最接近答案的一份清单;三是 site:具体URL 的逐条查询。
顺序是:先从日志拿到 Top 抓取 URL 名单,再拿这份名单去 GSC 的索引报告和 site: 里逐一比对。名单高度重合的那批 URL,就是重点排查对象。
反复抓取却不收录,常见原因有哪几类?
结论:抓取频繁说明蜘蛛认可这些 URL 的优先级,不收录几乎都是"内容层面判定无价值"或"指令层面明确拒绝"两类原因。
按排查顺序排列:
第一类,meta robots 写了 noindex。 这是最典型也最容易被忽略的情况——robots.txt 允许抓取,所以蜘蛛天天来;meta 标签写着 noindex,所以永远不收录。用 curl -I 看响应头里的 X-Robots-Tag,或直接看页面源码里的 meta 标签,10 分钟能排查完。
第二类,重复内容。 筛选用参数页(?from=、?utm_、?sort=)、分页页、标签聚合页大量同质化。检查 canonical 标签是否指向自己而非主版本页。
第三类,JS 渲染导致正文为空。 蜘蛛拿到的是空壳 HTML,正文靠前端渲染。测试方法是禁用 JS 抓取页面,看正文是否还在。
第四类,软 404(返回 200 状态码但内容为空或提示不存在)。 这类页面在日志里状态码是 200,但内容判定为空,会被反复抓取反复丢弃。
第五类,内容本身不达标。 字数不足、信息重复、无独立价值。这类没有技术解法,只能合并或改写。
找出来之后怎么处理?
结论:按原因分流处理,技术类问题修复后 3 到 14 天通常能看到索引变化,内容类问题只能靠改写或下线。
参数页和重复页:加 canonical 指向主版本,或用 robots.txt 屏蔽。确认 noindex 的页面:从 sitemap 里同步移除,否则会持续消耗抓取预算(搜索引擎在单位时间内分配给一个站点的抓取配额)。低质聚合页:合并到主页面后返回 410。内容可救的页面:改写后到 GSC 用"网址检查"提交重新抓取,百度端用"普通收录"接口提交。
复盘频率建议每周一次,固定观察 30 天窗口,记录"抓取次数"和"是否收录"两列数据,看哪些页面在被修复后从"抓取高频但不收录"名单里消失。
总结
整条链路是:日志统计抓取频次 → 平台数据和 site: 核对收录 → 按 noindex、重复内容、JS 渲染、软 404、内容质量五类分流。日志里抓取次数高但 30 天无索引的 URL,就是你要动手的那份名单。