不少人做蜘蛛池,判断目标 URL 有没有被发现的方法很简单:看入口页有没有被搜索蜘蛛抓过。入口页被爬了,就认为目标 URL 已经进入发现队列。这个推断经常不成立,因为爬取入口页和解析页面里的链接、把新 URL 放进待抓列表,是两个环节,中间任何一步出问题,日志上都不会有明显提示。
更可靠的办法是回到服务器日志,逐条核对爬虫的访问轨迹。下面是一套在实际运维中比较常用的判断思路。
第一步:确认日志里的访问者是真的搜索蜘蛛
UA 字符串是最容易伪造的部分,仅凭“Baiduspider”或“Googlebot”字样就下结论,很容易被第三方抓取程序误导。比较稳妥的做法是:
- 对访问 IP 做反向 DNS 解析,确认域名归属与官方一致,再正向解析回同一个 IP;
- 或直接比对搜索引擎官方公布的 IP 段列表;
- 看状态码分布,正常抓取以 200 为主,长期只有 403、404、5xx 的访问记录参考价值有限。
第二步:看入口页之后的访问序列
当搜索蜘蛛真正解析了入口页里的链接,通常会留下几个可辨认的痕迹:
- 入口页被抓取后的短时间内(几分钟到几小时),日志里出现目标 URL 的请求;
- 这些目标 URL 请求的 Referer 字段指向入口页地址;
- 同一个爬虫 IP 段在入口页之后连续请求多条目标链接,而不是只挑一条;
- 目标 URL 的首次抓取时间,和入口页被抓的时间形成明显的前后关系,并且能重复出现。
反过来,如果入口页被反复抓取,但目标 URL 从来没出现过,或者出现的都是很久以前的旧记录,那大概率只是爬了入口页,链接并没有被有效发现。
第三步:排除几种常见误判
- 目标 URL 早就被抓过。如果这些 URL 之前通过站点地图、外链或站内导航被抓取过,日志里当然有记录,但它证明不了入口页的作用。
- Referer 被中间层抹掉。经过 CDN、反向代理或跳转链后,Referer 可能丢失,此时看不出关联,不等于没有发现。
- 日志本身不完整。部分 CDN 默认只保留抽样日志,或者只记录静态资源请求,入口页级别的访问可能缺失。
- 入口页链接由 JavaScript 生成。这种情况下爬虫是否会跟进,取决于它是否执行脚本,日志上没有目标 URL 请求,并不代表入口页有问题。
- 目标 URL 被 robots.txt 或页面级规则拦住。发现和抓取是两件事,被规则限制的 URL 可能出现在日志里也可能不出现,需要单独核对。
第四步:和平台侧数据相互印证
服务器日志只反映请求过什么,不反映是否进入索引。建议把日志和站长平台的抓取统计、URL 提交工具的反馈、以及站点地图的抓取情况对照来看:
- 先在日志中筛出目标 URL 的首次访问时间和来源 Referer;
- 再去站长平台看这段时间的抓取量、抓取频次是否有对应波动;
- 最后看这些 URL 的索引状态是否正常。
三者能对上,说明入口页的发现链路基本是通的;对不上,就要回到入口页本身检查链接写法、响应状态和可访问性。
日志能告诉你搜索蜘蛛来过、请求了什么,但它不能保证抓取频率,也不能保证收录。把日志当作排查工具,而不是效果指标,判断会更稳。
小结
判断入口页的目标 URL 有没有被发现,核心是两件事:确认访问者身份,确认访问序列的关联性。只看入口页有没有被爬,结论往往过于乐观;只看目标 URL 有没有出现在日志里,又容易被历史记录和第三方抓取干扰。把这两步做扎实,再配合平台数据,排查效率会明显提升。