日志是 URL 发现最原始的证据
关于 URL 发现,站长手上通常只有三样东西:Sitemap 的提交记录、后台的抓取统计、以及服务器日志。前两样是汇总或抽样,只有日志是逐条留痕的——什么时间、哪个来源、请求了哪个路径、返回了什么状态码。想回答「这条内链到底有没有被蜘蛛走过」,日志是最直接的依据。
要注意的是,日志能说明的是「来过没来过」,不是「会不会收录」。把它当成发现路径的体检表,比当成效果指标更合适。
先把日志里的行分清楚
原始日志混着页面、静态资源、接口请求和各类爬虫,直接看会糊成一片。建议先按路径聚合,把下面几类分开:
- 入口请求:蜘蛛对首页、栏目页、列表页、Sitemap 文件的访问。
- 落地抓取:从入口页链接带出来的详情页、文章页请求。
- 资源请求:css、js、图片、字体,和页面发现关系不大,先过滤。
- 重复记录:CDN 回源、负载均衡多节点写入造成的同一次请求多条日志。
过滤完之后,剩下的条目才值得逐条对照站点结构。
确认访问者是不是搜索蜘蛛
UA 字符串可以随意伪造,只看 UA 容易把扫描器当成搜索蜘蛛。比较稳妥的做法是同时满足两个条件:UA 匹配,且来源 IP 通过反向 DNS 解析回落到对应域名。这一步做不到全量验证,但至少能排除掉大部分噪音。
如果站点放在 CDN 后面,日志里看到的往往是 CDN 节点 IP 而不是真实来源。这时需要开启真实 IP 透传,或者直接使用源站日志做核对。
把入口请求和落地抓取对上
按时间顺序排列同一来源的请求,通常能看出链条:入口页被抓取后几秒到几分钟内出现的同源请求,多半就是跟随链接的结果。反过来,如果某个详情页只在 Sitemap 被读取的那一刻前后出现一次,而入口页之后完全没有它,那说明内链这一路没走通——可能是链接被脚本渲染、被 nofollow 标记,或者根本没写。
这条时间线不需要非常精确,粗粒度的先后关系已经足够判断路径是否成立。
把「从没出现过」的页面筛出来
更实用的一步是做差集:拿站点的 URL 清单减去日志中出现过的路径。差集里的页面大致对应几种情况:
- 站内没有任何内链指向它,也没进 Sitemap——典型的孤岛页面。
- 被 robots.txt 或页面级规则挡住了入口。
- 链接存在,但指向的是一个重定向或 404,蜘蛛跟到一半就停了。
- 只是日志保留期太短,页面被抓的时候记录已经滚掉了。
前三种是可以动手修的,第四种需要先调整日志保留策略再判断。
几个常见的误判
- 缓存命中被当成没抓取:返回 304 或由 CDN 直接响应的请求,可能在源站日志里看不到完整记录。
- 日志轮转造成断档:按天切割又只保留几天,跨周期的回访就丢了。
- 把其他爬虫算进来:SEO 工具、监控探针、聚合服务的抓取混在一起,会高估入口的实际效果。
- 只统计次数不看路径:同一个 URL 被反复请求,可能是参数变体造成的重复发现,而不是抓取积极性高。
响应时间也在日志里
日志通常带响应耗时字段,这个数字值得单独看一遍。响应经常超过几秒的页面,被抓取的频次往往偏低,尤其是内链层级较深的部分。服务器稳定性对 URL 发现的影响,很多时候不是「被抓不到」,而是「抓得少」,日志里的耗时分布能反映这一点。
如果一批页面同时在某个时间段出现超时,先查那一时段的服务器和数据库压力,再讨论抓取问题,顺序不要颠倒。
把结论落回站点动作
日志核对的价值在于可以形成闭环。筛出来的孤岛页面补内链,被挡住的入口检查规则,频繁重复的路径统一 URL 形态,响应过慢的页面排查后端。整体上建议按周或按月做一次核对,把 URL 清单和日志差集固定成一张表,这样每次改动之后能看出入口结构有没有变化。
比起点开一堆工具猜测原因,一条条日志对着看更省时间,也更接近事实。