站点出问题的时候,很多人第一反应是去后台看抓取统计,但那些数字是汇总过的,看不出具体路径。真正能回答“蜘蛛走过哪些 URL、在哪儿停住”的,通常是服务器自己的访问日志。它不讨好任何人,记录的是一次次真实请求。
先确认日志里有哪些列
不同环境导出的字段不一样,但排查 URL 发现和抓取路径,至少要能拿到这几项:
- 请求时间,最好精确到秒,注意时区;
- 请求方法与完整 URL,含查询参数;
- 状态码和响应字节数;
- User-Agent,用来区分不同搜索蜘蛛与普通访问;
- Referer,有的话可以还原它是从哪个页面走到这里的。
如果站点前面挂了 CDN 或 WAF,日志里的 UA 和 IP 可能已经被改写,先确认拿到的是不是原始记录,否则后面的判断都会偏。
状态码分布比抓取总量更有信息量
总量只说明蜘蛛来得多不多,状态码分布才说明它有没有走通。
几个值得单独拉出来的信号
- 404 / 410:说明某些 URL 还在被别的页面引用,但目标已经不存在,这条路径等于白走;
- 301 / 302:看跳转层数,一层是正常的,三层以上会让蜘蛛在队列里多绕一圈;
- 5xx 与超时:属于服务器侧的问题,出现集中时段时,蜘蛛往往会主动压低该目录的抓取频率;
- 304:属于正常复查,内容没变时的回应,不用当成异常。
把日志和 Sitemap、内链交叉对照
最直接的做法是做两次差集。先把 Sitemap 里声明的 URL 拿出来,和日志中出现过的 URL 比对:只存在于 Sitemap、日志里几乎没出现过的,多半是站内没有入口的孤岛页;反过来,日志里被频繁抓取但不在 Sitemap 里的,往往是参数组合或历史遗留地址,属于抓取预算的消耗项。
再把主要列表页、栏目页的内链导出,看看日志里的抓取是否沿着这些链接往下走。如果某一层之后几乎没有请求,问题通常不在内容质量,而在链接本身没被解析出来。
几种反复出现的漏抓形态
- 分页很深的列表页之后的 URL,蜘蛛爬到第几页就停了;
- 只有执行脚本后才出现在 DOM 里的链接,未被解析时等于不存在;
- 筛选、排序、追踪参数生成的 URL 汪洋,真正的详情页被稀释在中间;
- 只能通过站内搜索或表单到达的页面,没有任何可跟的链接;
- 服务器抖动期间反复超时的目录,恢复后抓取节奏也需要一段时间才回来。
反推之后怎么验证
根据日志定位到问题,调整时尽量一次只改一处:补一条内链、收敛一类参数、修掉一批 5xx。改动之后继续按周对比日志,观察对应目录的请求量、状态码和出现过的 URL 数量有没有变化。
这个过程没有捷径,也不需要每天翻。每周固定看一次,把差异记下来,几周之后路径的形状自然会清楚。
日志是观察工具,它只能告诉你过去发生过什么,不能保证某条 URL 一定在某个时间被抓到。把它当成排查线索,而不是结果指标。