很多站点的抓取情况是靠感觉判断的:最近好像抓得挺勤,或者感觉新页面一直没动静。感觉容易骗人。真正能回答“蜘蛛翻过哪些 URL”的,只有服务器访问日志,加上一份你自己维护的 URL 清单。把这两份东西对起来,抓取覆盖才从印象变成可以核对的事实。
先有一份“期望被发现的 URL”清单
没有清单,日志就只是一堆路径。清单的来源可以有几个:Sitemap 里提交的地址、栏目页和列表页能点到的地址、数据库或后台导出的公开内容地址。合并之后做去重和归一化,把大小写、结尾斜杠、常见跟踪参数统一成一种写法,否则同一页会以多个样子出现,差集算不准。
清单里要先剔除本来就不该被抓的:后台、登录、购物车、批量导出、测试目录、纯参数筛选页。这些抓不到是正常的,混在清单里只会制造假问题。
日志里需要看哪几列
至少保留时间、请求路径、状态码、UA、IP、响应字节数和 Referer。只看总量没有意义,一天十万次请求,可能九万次都落在几个列表页和参数页上,真正的新内容一次没碰。
- 时间:看新页面发布之后多久出现第一次抓取,而不是看全天总量。
- 路径:确认被抓的是内容页,还是被筛选参数、分页、站内搜索占满了。
- 状态码:200 是正常,3xx 看跳转链,4xx 和 5xx 要单独拉出来。
- 响应字节数:明显偏小的 200 往往是空壳页或错误页。
- Referer:能大致看出蜘蛛是从哪个入口页走过来的,对判断内链路径有帮助。
UA 只能作为初筛,不能当唯一依据。伪造 UA 的情况不少,结合 IP 段、抓取行为和官方验证方式一起看更稳妥,这一步不必在本文展开。
做一次差集,看漏掉的 URL 长什么样
把清单里的 URL 和日志中真实出现过的路径对齐,剩下的就是没有被抓到的部分。这部分通常不是铁板一块,可以分成几类:
- 完全没出现:大概率是没有入口,或者入口藏得太深。
- 只出现一次就再没来过:可能是首轮抓取失败,或者页面被判定价值不高。
- 出现过但状态码不对:5xx、403、软 404 都会让这一趟白跑。
- 只抓到了参数变体:同一页有多个地址写法,被抓的是不是你希望的那个。
漏抓的常见原因
按经验,原因往往集中在下面几处,而不是“蜘蛛不喜欢这个站”这种说法。
- 内链没有指向,Sitemap 里也漏了,页面等于没有对外通道。
- 链接由脚本渲染后才出现,首轮取到的 HTML 里根本没有这个地址。
- 层级太深,要经过四五层列表才点得到。
- robots.txt、noindex、canonical 设置时误伤了自己的正常页面。
- 服务器不稳定,抓几次超时或 5xx 之后,抓取节奏明显放慢。
- 参数页太多,把抓取额度大量消耗在低价值地址上。
补漏的先后顺序
补漏不建议从“再多提交几次”开始,先处理会反复制造问题的环节。
- 把服务器和响应状态稳定下来,5xx、超时、连接重置先解决。
- 检查 robots 和页面级指令,确认没有误拦正常内容。
- 给缺入口的页面补内链,从相关栏目页或正文里自然指向。
- 更新 Sitemap,让清单和站点实际结构保持一致。
- 收敛低价值 URL,减少无效抓取对正常页面的挤占。
这几步做完再观察日志,通常能看到原先“完全没出现”的路径开始出现。出现之后还要继续看第二趟、第三趟,确认不是抓一次就走。
多久核对一次比较合适
内容更新频繁的站点,半个月到一个月核对一次就够,重点是看趋势而不是单次快照。更新慢的站点可以拉长到季度。每次记录三类数字:清单总量、日志中出现过的比例、状态码异常的比例。连续几次对比,比一次性的结论可靠得多。
抓取覆盖不是一次性验收,而是持续维护的事。清单、日志、内链、Sitemap 四样东西保持同步,蜘蛛的访问记录才有参考价值。