很多人判断蜘蛛池有没有在跑,只看一件事:日志里有没有蜘蛛。有来访就放心了。但真正要看的是下一段——蜘蛛从入口页出发之后,有没有继续往目标站走。如果入口页天天有蜘蛛,目标站的抓取量却纹丝不动,问题通常不在“蜘蛛池没用”,而在链路的某一环断了。
先分清两件事:来访和传递
蜘蛛来访只说明入口页被发现了,链接传递才决定目标站能不能被顺带发现。这两件事的检查入口不一样:前者看入口站的访问日志,后者要看目标站的日志里有没有出现对应的抓取记录。如果只有前者没有后者,就可以按下面的顺序往下排。
第一处:入口页自己是不是可抓的
这是最容易被忽略、也最容易修的一环。先确认三件事:
- 状态码:入口页返回 200。如果返回 301、302 或 404,蜘蛛会按规则处理,未必按你预想的方式继续。
- robots 与 meta:入口站自己的 robots.txt 没有把整站挡掉,页面也没有 noindex。这两处只要中一个,蜘蛛来了也等于白来。
- 响应时间:入口页打开慢,蜘蛛可能在超时前就撤了。不要只看自己浏览器的速度,要看服务器端的首字节时间。
第二处:链接是不是真的能被爬到
入口页面上看得见和爬得到是两回事。常见的情况有:
- 链接是用 JS 渲染出来的,而蜘蛛拿到的是未渲染的 HTML;
- 链接带 nofollow,或者被脚本拦截了默认跳转;
- 链接文本为空、图片链接缺 alt,或者被 CSS 层遮住,人点得到但结构上不明显;
- 锚点指向占位地址,实际跳转靠脚本完成。
判断方法很直接:把入口页的 HTML 源码拉下来,用文本方式搜目标域名。源码里搜不到,就别指望蜘蛛能顺着走过去。
第三处:跳转方式决定了蜘蛛跟到第几跳
如果入口页和目标站之间还有中间层,跳转方式就格外重要。301 是明确可跟的;302 一般也会跟,但语义上不是永久迁移;JS 跳转和 meta refresh 的可靠性明显更低,多跳之后更容易断。中间层越多,每一跳都打折,最后能到目标站的抓取自然就少了。
第四处:目标站自己接不接得住
入口页一切正常,也可能是目标站把蜘蛛挡在门外:目标站的 robots.txt、防火墙规则、CDN 的爬虫策略、频繁出现的 5xx,都会让蜘蛛拿到页面却无法正常抓取。还有一种情况是目标站内容长期不变,蜘蛛来了几次发现没有新东西,来访频率自然下降。这不是链路问题,是内容更新的问题。
一个可复用的排查顺序
- 在入口站日志里确认蜘蛛确实来过,记录时间与 UA;
- 同一时间段去目标站日志里找,看有没有对应来源的抓取;
- 没有的话,回到入口页,用源码搜目标域名,确认链接存在;
- 确认链接存在后,检查跳转类型和跳转层数;
- 最后检查目标站的 robots、防火墙规则与响应状态。
排查时别一次改好几处。一处一处改,每改一处观察几天日志,才能知道是哪一步起了作用。
几个常见的判断误区
第一,把蜘蛛来访量当成效果指标。来访量高但目标站抓取没变化,说明传递环节有问题,加再多入口站也只是在同一个断点上加量。第二,只看页面能不能打开,不看源码里有没有链接。第三,频繁调整入口页结构和跳转方式,导致日志里几种情况混在一起,反而没法判断。
入口页、链接、跳转、目标站,这四段任何一段断了,后面的量都上不来。与其急着加资源,不如先把这几段的日志对一遍,找到卡点再动手,通常比盲目扩容更省事。