做蜘蛛池的人常有一个共同的困惑:入口页铺了几百上千个,每天也看服务器日志,抓取记录零零散散,但说不清这套东西到底有没有在工作。问题往往不在池子本身,而在于没有固定的观测口径——今天看总请求数,明天看状态码,后天看 User-Agent,每次得出的结论都不一样,也就没法比较。
这篇讲的是观测方法,不讨论怎么让蜘蛛多来。目标只有一个:让你在两周、一个月这样的时间尺度上,能判断入口页是在正常运转、在缓慢退化,还是已经空转。
先分清三类可观测的东西
蜘蛛池的链路很长,从入口页到目标页中间隔着跳转、渲染和抓取调度。如果不先把观测对象分开,很容易把 A 的表现算到 B 头上,最后归因全错。
- 发现层:蜘蛛有没有来请求入口页的 URL。这一层看访问日志最直接,有就是有,没有就是没有。
- 抓取层:请求之后有没有把入口页正常取走。看状态码、响应体积、是否被 robots 或 meta robots 挡住。
- 后续层:蜘蛛有没有顺着入口页继续走到你真正关心的页面。这一层在入口页日志里只能看到间接线索,需要结合目标页自身的访问记录一起看。
日志里真正值得看的字段
一条访问记录能拆出很多信息,但日常观测不需要全部。下面几项基本够用:
- 请求时间:用来判断访问是集中在某个时段还是全天分散。
- 完整请求 URL:注意带参数和不带参数要分开统计,否则同一个入口页会被算成好几条。
- 状态码:区分正常、被拦、找不到、服务端出错四类。
- User-Agent:用于初步区分来源,但不要只凭它下结论。
- 来源 IP:观察是否集中在少数网段。
- 响应字节数:这一项经常被忽略,但很有用。状态码 200 但字节数接近零,通常意味着页面是空的或被中途截断。
三个容易被误读的指标
单日抓取总量
这个数字每天的波动本来就不小,看绝对值意义有限,看一段时间内的趋势才有参考价值。如果某天翻倍,先别急着高兴,看看是不是把自己家的监控程序也统计进去了。
200 状态码的占比
200 占比高,只能说明服务器没拒绝请求,不能说明页面内容对蜘蛛有价值。一个返回 200 的空壳页,和一个返回 200 的正常页,在状态码统计里长得一模一样。
User-Agent 与 IP 的对应关系
同一个 UA 大量来自同一个 C 段,或者 UA 与已知搜索蜘蛛的标识对不上,都值得留个心。日志里的标识可以伪造,不要只靠单一维度判断。
给自己搭一张简单的观测表
不需要复杂系统,一张表加几行脚本就能跑起来:
- 每天固定同一时间导出前一天的日志,时间点不要随意变动。
- 按入口页 URL 归类,统计每个 URL 被请求的次数。
- 记录状态码分布和平均响应字节数。
- 每周汇总一次,且只和上周同一口径的数据比。
- 至少保留两周以上的历史,否则看不出是波动还是变化。
几种典型的自欺场景
- 只看总请求数,不看这些请求落在哪些 URL 上。
- 把自家的可用性监控、爬虫程序算成搜索蜘蛛的访问。
- 把入口页被访问等同于链路有效,完全不看后续层。
- 数据刚有波动就改配置,导致前后完全不具可比性。
观测之后要做什么
观测的目的不是每天调参数。多数时候,数据有起伏是正常的,这时候最该做的是不动。真正需要处理的信号其实只有几类:某个入口页连续多天零请求;状态码出现大面积异常;响应字节数整体突然掉到接近零;或者某个网段的访问占比短时间内明显上升。
不同站点、不同域名、不同时期的表现差别很大,别人的数字只能当参照,不能当标准。观测真正的价值,在于跟自己的历史比,而不是跟别人的截图比。