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

怎么分析蜘蛛爬虫在网站内的爬行覆盖率?

周末
周末 新人站长
发布于 2026-10-14 06:08 ·1 浏览 ·3 回复
内容摘要

分析蜘蛛爬行覆盖率应先用可爬URL总数而非sitemap数量作分母,按双口径计算,并从日志中经UA筛选和反向DNS验证提取真蜘蛛记录,合并数据库、sitemap与站内爬虫的URL清单,最后用差集按目录聚合定位未抓取缺口。

爬行覆盖率 = 搜索引擎蜘蛛在你的站点上实际抓取的 URL 去重数量 ÷ 站点允许被抓取的 URL 总数。分析它的核心动作只有三步:从服务器日志里提取真蜘蛛请求、拿到全站 URL 清单、两者做差集并按目录聚合定位缺口。

爬行覆盖率怎么算才准确?

结论:分母要用「站点可爬 URL 总数」,而不是 sitemap 里提交的数量,否则会把未提交但通过内链可到达的页面算漏。实操上建议同时算两个口径:覆盖率A = 已爬 URL / sitemap URL 数、覆盖率B = 已爬 URL / 站内可爬 URL 总数(首页出发零屏蔽、可返回 200 的页面)。A 反映 sitemap 提交质量,B 反映真实抓取缺口,B 低于 60% 就说明存在结构性问题。

时间窗口别取太短。Google Search Console 的「抓取统计信息」保留 90 天数据,建议用最近 30 天日志做一次统计,用最近 7 天做异常波动对比。

怎么从服务器日志里提取蜘蛛的爬取记录?

结论:用 UA 字段筛选 + URL 去重即可,但必须做反向 DNS 验证,否则会把冒充蜘蛛的采集器算进去。Nginx/Apache 默认 combined 日志格式下,UA 在第 6 个双引号字段,请求路径在空格分隔的第 7 个字段:


awk -F'"' '{print $6}' access.log | sort | uniq -c | sort -rn | head -20

# 提取 Googlebot 抓取的 URL 并去重
grep -i "Googlebot" access.log | awk '{print $7}' | sort -u > crawled_google.txt

# 提取百度蜘蛛
grep -i "Baiduspider" access.log | awk '{print $7}' | sort -u > crawled_baidu.txt

验证真伪:Googlebot 的官方做法是对来源 IP 做反向 DNS,解析结果必须以 googlebot.com 或 google.com 结尾,再正向解析回去核对;百度蜘蛛的 IP 段在百度搜索资源平台的「抓取诊断」里有官方公布列表。第三方采集器(如各种 Python-requests、Scrapy 打上假 UA)如果混入统计,覆盖率会被系统性高估。

全站 URL 清单怎么拿到?

结论:优先从数据库或 CMS 导出,其次用 sitemap,最后用站内爬虫跑一遍,三条来源取并集。sitemap 单文件上限是 50,000 个 URL 且不超过 50MB(未压缩),超过要拆分成索引文件,很多站点覆盖率低正是因为 sitemap 被截断。用 Screaming Frog(免费版可爬 500 个 URL)或 wget --spider -r 跑一遍全站,能捞出没进 sitemap 的内链页面。

怎么做差集,找出没被爬的页面?

结论:用 comm -23 求差集,再按目录聚合,就能看出是整站问题还是局部问题。两个文件都必须先 sort -u 排好序:

# 全站路径归一化(去掉域名)
cat all_urls.txt | sed 's#^https\?://[^/]*##' | sort -u > all_paths.txt

# 未被 Google 抓取的路径
comm -23 all_paths.txt crawled_google.txt > not_crawled.txt

# 按一级目录聚合,看哪个板块最严重
cut -d/ -f2 not_crawled.txt | sort | uniq -c | sort -rn | head -20

如果差集集中在 /tag/ /search/ 这类参数或聚合页,属于正常现象,蜘蛛在主动节省抓取预算;如果集中在商品详情页或文章详情页,就是真问题。

覆盖率低有哪些常见原因,怎么排查?

结论:按「先封禁、后结构、再性能」的顺序排查,80% 的缺口出在前两项。逐条核对:

  1. robots.txt 误屏蔽:用 curl -A "Googlebot" https://example.com/robots.txt 拉取实际生效内容,再在 GSC 的 robots.txt 测试工具里验证某条 URL 是否被拦。
  2. noindex 或 X-Robots-Tag 误加:会导致「抓取了但不索引」,在日志里表现为抓取量正常但索引量为零。
  3. 内链孤岛:Google 官方建议重要页面的点击深度不超过 3 层。用 Screaming Frog 的「爬取深度」报告筛出深度为 0(无内链指向)的页面。
  4. JS 渲染依赖:Googlebot 能渲染 JS 但有排队延迟,百度对 JS 渲染的支持有限,内容靠前端异步加载的页面建议改 SSR 或首屏直出。
  5. 服务器拖慢抓取:GSC 抓取统计里有「抓取响应时间」,服务器平均响应超过 500ms 时蜘蛛会主动降频。日志中 5xx、429、超时请求占比超过 1% 就要先修服务端。
  6. 抓取预算被稀释:分页、筛选、排序参数会生成海量近似 URL。用 canonical 指向主 URL,或在 robots.txt 里直接屏蔽参数路径。

优化后怎么验证有效?

结论:观察 14-30 天的抓取频次趋势,而不是看单日数据。在 GSC「设置 → 抓取统计信息」里看按响应类型(200/301/404/5xx)分组的折线图,在百度搜索资源平台看「抓取频次」和「抓取异常」两个报表。判断标准:目标目录的日均抓取 URL 去重数上升,且 5xx 占比下降,两个指标同时改善才算修复成功。

整体思路就是:日志提数 → 验证蜘蛛真伪 → 全站清单求差集 → 按目录定位缺口 → 逐条排查封禁/结构/性能 → 用 14 天以上的趋势数据验收。覆盖率是结果指标,真正的抓手永远是内链结构、robots 规则和服务器响应速度这三件事。

怎么分析蜘蛛爬虫在网站内的爬行覆盖率?,本文转载自 GJ站长论坛,原文地址:https://www.gj0.com/thread-1941.html
转载请注明出处,版权归原作者所有。
—/ 5暂无评分
还没有评分,来打第一分吧

全部回复 3

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

三步法框架没问题,但真正决定覆盖率数字准不准的,其实是差集之前那两步——状态码过滤和 URL 归一化,多数人是在这里把缺口算错的。

先说过滤。 日志里第 9 个字段是状态码,别把 301/302/404/403 也算成"被爬了"。建议 grep -i Googlebot access.log* | awk '$9==200 || $9==304 {print $7}',只留 200 和 304——304 是蜘蛛复访,属于有效抓取,404 和跳转不算覆盖。另外多个归档日志必须用 zgrep 或 zcat 合流,否则你统计的只是最后一天。

再说归一化,这步最坑。 同一个页面可能以 http/https、带不带 www、尾斜杠、大小写、URL 编码、tracking 参数等形式出现,不统一就会把覆盖率系统性拉低。建议统一处理:去协议和域名、去尾部斜杠、path 转小写、剥离 ? 后的无关参数(id 类必要参数保留)。差集前两边都跑 sort -u。

**目录聚合除了看差集,更建议把"URL 数"和"抓取次数"按一级目录并排统计。** 如果某目录 URL 占比 20% 却只拿到 3% 的配额,那是配额被别处吃掉了;如果 URL 数和抓取数同时低,才是真的没被发现。这两种情况解法完全不同——前者调内链和权重分配,后者只能靠提交和外部引流。

最后补一点,别只看覆盖率这一个快照,记录新页面从上线到首次被抓的延迟,比数字本身更能反映蜘蛛对你站的信任度。最常见的坑是盯着覆盖率调结构,却没发现抓取配额全被排序参数页和老列表页吃掉了,那内链再怎么优化也是白费。

liulian
liulian 归队站长新人站长 #1475 2楼 2026-10-14 06:51
juming:三步法框架没问题,但真正决定覆盖率数字准不准的,其实是差集之前那两步——状态码过滤和 URL 归一化,多数人是在这里把缺口算错的。 **先说过滤。** 日志里…

你补的这两步确实是分水岭,但归一化有个反向的坑:归得太狠会让覆盖率虚高。

把 /page/2、/page/3 用规则合并成一个 path,分母会人为变小,算出来的覆盖率好看但没有意义。所以归一化前得先分两类:别名(http/https、www、尾斜杠、大小写、无意义 tracking 参数)该合并;独立资源(分页、筛选、语言版本、带 id 的详情页)必须保留。中文路径统一编码前建议先 urldecode 再 encode,否则 %E4 和 %e4 会被当成两个 URL。

再补两个实操上的细节。一是 zgrep 默认会输出文件名前缀,grep -i Googlebot access.log* | awk '{print $7}' 在混了 .gz 之后 $7 会错位,用 zcat access.log*.gz access.log 2>/dev/null | awk '{print $7}' 或者加 -h 更稳;字段位置也随日志格式变,动手前先 head -1 确认一下。二是去重和计数要分开:URL 去重用 sort -u,但统计"抓取次数"时同一秒的并发重试会让行数偏高,稳妥点按 (ip, url, 秒) 去重再数。

你那个「URL 占比 vs 配额占比」的并排表思路很好,我再加一列会更清楚:把每个目录的抓取次数再按状态码拆成 200 / 304 / 3xx / 4xx-5xx。304 基本不耗多少配额,真正吃配额的是重定向链和 5xx 重试——如果某目录看着抓取次数不低,但里面一大半是 301 空跑,那实际有效抓取是断崖式下跌的,这种情况优化内链确实没意义,得先修跳转。

首次抓取延迟建议做成 P50/P90 两档,再和 GSC 网址检查里的「已发现-尚未编入索引」对一下,就能分清是发现慢还是抓取慢,这俩的解法完全相反。

lqyyzz
lqyyzz 观望站长 #1478 3楼 2026-10-14 06:57
liulian:你补的这两步确实是分水岭,但归一化有个反向的坑:归得太狠会让覆盖率虚高。 把 `/page/2`、`/page/3` 用规则合并成一个 path,分母会人为变…

归一化的双向坑确实是分水岭,我按你说的拆成两块落地:别名类(协议、www、尾斜杠、大小写、utm/fbclid 这类)统一 301 到规范 URL,日志侧直接把 301 的源和目标 path 合并成一个;独立资源类(分页、筛选、语言、带 id 详情页)走白名单,规则文件里显式登记,宁可漏合也不错合。中文路径除了 urldecode→统一小写→再 encode,还得加一步 Unicode NFC 规范化,macOS 出身的文件名是 NFD,不归一化会平白多出一份"重复页面"。

日志那条命令我一般写成 zcat -f access.log*.gz access.log 2>/dev/null | grep -i googlebot | awk '{print $7}' | sort -u,-f 比多文件通配稳。字段错位还有个隐藏来源:确认是不是 combined,vhost_combined 或加了 $request_time 之后 $7 就飘了,先 head -1 数一下空格确实必要。

按 (ip, url, 秒) 去重可以这么写,秒直接从时间戳里切:

zcat -f access.log* 2>/dev/null | grep -i googlebot \
| awk '{split($4,t,":"); print $7, t[2]":"t[3]":"t[4]}' | sort -u | wc -l

你加的状态码列我认为比"URL 占比 vs 配额占比"更有诊断价值,补一句:301 的 Location 落点要算进"已爬",因为蜘蛛确实抓了目标页,只有链长 ≥2 跳的才单列成"跳转损耗"。5xx 重试更值得警惕,服务器持续 5xx 会让 Googlebot 主动降速,这时候覆盖率跌下来是服务器拖的,修内链纯属白干。

P50/P90 那招我再接一层:P90 高但 GSC「已发现-尚未编入索引」量大,是抓取慢;P90 高而这个数字小,多半是发现慢,去查 sitemap 更新时机和内链深度,两条路的解法确实相反。