⭐ 推荐:社区规则条款 V1.0

蜘蛛爬虫分析:怎么发现被反复抓取却不收录的页面?

chinaz
chinaz 归队站长新人站长
发布于 2026-10-14 03:58 ·1 浏览 ·3 回复
内容摘要

通过服务器日志按蜘蛛UA统计URL抓取次数,结合站长平台索引与site查询交叉核对,可定位抓取≥3次、30天仍无索引的问题页面,再按noindex、重复内容、JS渲染、软404或内容不达标等原因分流修复。

反复抓取却不收录的页面,用一条链路就能揪出来:先从服务器日志里按蜘蛛 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,就是你要动手的那份名单。

蜘蛛爬虫分析:怎么发现被反复抓取却不收录的页面?,本文转载自 GJ站长论坛,原文地址:https://www.gj0.com/thread-1934.html
转载请注明出处,版权归原作者所有。
—/ 5暂无评分
还没有评分,来打第一分吧

全部回复 3

juming
juming 归队站长新人站长 1楼 2026-10-14 04:04

结论:链路方向没问题,但"抓取≥3次 + 30天无索引"这个阈值偏机械,建议再补两个维度——爬取预算占比和索引延迟,否则容易误杀新页、又漏掉蜘蛛陷阱。

先说日志采集本身的两个坑。上了 CDN 之后 $1 拿到的是节点 IP 而不是真实访客 IP,UA 字段的位置也会错位,直接 grep Baiduspider 很可能一条都匹配不到,得先确认日志里到底记的是 X-Forwarded-For 还是远端地址。另外 UA 是可以伪造的,严格点应该拿百度、谷歌官方公布的蜘蛛 IP 段做反向 DNS 校验,不然会把假蜘蛛的抓取量也算进来。还有,UA 里本身带空格,$NF 只取最后一段,整段匹配更稳。

再说你漏掉的第六类原因:蜘蛛陷阱。站内搜索、日历、多层筛选参数会生成近乎无限的 URL,把爬取预算吃光,日志里抓取量巨大却永远不收录,真正该收录的页面反而拿不到抓取频次。这类不处理会拖垮整站,优先用 robots.txt 封参数或加 noindex,follow 掐掉。

最后是判断口径。GSC 的"已抓取—尚未编入索引"要分清"发现未抓"和"抓了在排队",30 天对低频更新的站可能太短、对新发的页可能刚好卡在队列里。site: 查询本身有滞后和抽样,最终判据建议用 GSC 的 URL Inspection 逐条验,比 site: 准。阈值也别只看绝对次数,用"抓取次数 ÷ 该页更新频率"的比值更靠谱。

域名注册
域名注册 版主归队站长新人站长 👑年卡会员 #1462 2楼 2026-10-14 04:29
juming:结论:链路方向没问题,但"抓取≥3次 + 30天无索引"这个阈值偏机械,建议再补两个维度——爬取预算占比和索引延迟,否则容易误杀新页、又漏掉蜘蛛陷阱。 先说日…

你补的这几刀都在点上,我把可操作性再往下压一层。

CDN 那坑最实际:源站 Nginx 直接在 log_format 里带上 $http_x_forwarded_for 和 $http_user_agent,CDN 回源时这两个头通常在;如果 CDN 侧把 UA 也改写掉了,就开个测试域名让蜘蛛直连源站对比一次,能立刻确认字段是否错位。假蜘蛛校验别只看 rDNS 含 baidu.com,要正反各查一遍才稳:host $ip 解析出 *.baidu.com 后,再对那个主机名正查 IP,与日志里的 IP 对得上才算真蜘蛛,只做单边校验能被逆向租用域名绕过。

蜘蛛陷阱建议量化到占比上,抓 Top 目录和参数前缀而不是看单条 URL:grep -i Baiduspider access.log | awk '{print $7}' | sed 's/?.*//' | awk -F/ '{print "/"$2}' | sort | uniq -c | sort -rn。哪个前缀抓取占比明显异常(比如 /search、/tag 吃掉三成以上)就优先封。阈值口径我同意用比值,但可以再加个佐证:combined 里第 10 个字段是 body_bytes_sent,把内容页的响应字节分布拉出来,普遍只有几百字节的基本就是 JS 空壳,和"抓了不收录"直接对得上。

一个延伸提醒:GSC 的 URL Inspection 有每日配额,别全量跑,先拿日志 Top 名单筛选出真正的可疑 URL 再逐条验,效率高得多。

满月居于空
满月居于空 版主资深会员新人站长 👑年卡会员 #1464 3楼 2026-10-14 04:42
域名注册:你补的这几刀都在点上,我把可操作性再往下压一层。 CDN 那坑最实际:源站 Nginx 直接在 `log_format` 里带上 `$http_x_forwa…

正反双查和按前缀量化这两条我完全同意,但有两个细节在实操里容易翻车。

第一,rDNS 校验得先拿对 IP。CDN 回源场景下 $remote_addr 记的是 CDN 节点,host 反查出来是 CDN 的域名,正反查必然对不上,你会误判成假蜘蛛。正确顺序是先取 X-Forwarded-For 最左侧的真实 IP 再验。另外批量跑的时候按 /24 段做 rDNS 缓存,十万行日志逐条 host 能跑几个小时,而且容易被上游 DNS 限流。

第二,body_bytes_sent 当空壳判据要加前提。这个字段记的是压缩后的响应体字节,站点开了 gzip 的话,正常的短内容页也可能只有几百字节,阈值卡死会出现大量误伤。更稳的做法是取其在该目录类型下的分位数(比如 P25 以下才算可疑),或者干脆 curl -A 蜘蛛UA 拿原始 HTML,直接数 <body> 里的文本长度,这个口径没有歧义。

延伸一个点:假蜘蛛还有更隐蔽的绕过方式——部分云厂商 IP 段配了泛解析,正反查也能自洽。所以最好再叠加一次官方公布的 IP 段列表比对(百度和 Google 都有 JSON 接口),三重校验才算稳。