蜘蛛池的入口页是批量存在的,失效往往也是批量发生的:目标页下线、内容被删、模板改版、域名不再续费,都会让一批 URL 进入打不开的状态。很多人只关心怎么把蜘蛛引进来,却很少关心这些页面挂掉时返回了什么。而返回什么,往往决定了蜘蛛下一次还愿不愿意来。
几种状态码在蜘蛛眼里的差别
404:页面不存在,但不是终点
404 表达的是这个地址现在没有内容。对搜索引擎来说,它意味着这次抓取没有拿到东西,但地址本身并没有收到永久删除的明确信号。结果是蜘蛛可能在一段时间里反复回来确认,尤其是那些之前抓取过、还有点重要性的入口页。少量 404 无所谓,成百上千条同时出现,抓取资源就会被大量消耗在确认这些死链上。
410:明确告诉对方不用再来了
410 的语义比 404 更强,等于这个地址已被永久移除。搜索引擎收到 410 后,通常会更果断地把 URL 从待抓队列里清掉,重复确认的次数比 404 少。对于确定不会再恢复的入口页,410 是更省抓取预算的一种表达。不过要注意,返回 410 之后这段历史基本就断了,如果后面还想恢复,等于从头再来。
软 404:页面能打开,内容却是空的
服务器返回 200,但页面只有一个空模板、一段暂无内容或者一段跳转脚本,这是最容易出问题的一种。搜索引擎需要额外判断才能识别出这是一个空页面,判断成本高,而且不同爬虫的策略不一样,有的会当成正常页面继续抓,有的会降低对整站的整体印象。批量入口页如果都用同一套空模板,特征会非常集中。
301/302:把访问者送去别处
跳转本身不是失效处理,而是转移。入口页不再需要、但目标页仍然存在时,可以用 301 把访问关系一起送过去;如果只是临时调整,用 302。要注意的是,跳转目标必须真实相关,否则蜘蛛跟过去发现内容对不上,反而会把这批跳转当成异常。用跳转兜底时,尽量避免多级跳转链。
按场景选,而不是一套规则用到底
入口页只是暂时停用
如果只是暂时不推这个入口,内容还在、以后可能恢复,建议保留页面并返回 200,或者做一个简短的说明页。返回 404 或 410 之后再想恢复,之前积累的抓取记录基本要重新建立。
目标页已经彻底下线
入口页存在的意义就是导向目标页。目标页没了,入口页继续返回 200,只会让蜘蛛一次次抓到空壳。这种情况下,如果整批入口页都不再有价值,返回 410 是比较干净的做法;如果还有一部分内容可以保留,就把入口页改成一个有实际内容的落地页,而不是留一个跳空的跳转。
整个域名准备弃用
停止解析、直接让域名不可访问,是较差的选择——蜘蛛拿到的是连接失败,既学不到已删除,也无法判断这套站点是否还活着,可能还会在较长时间里继续尝试。更稳妥的顺序是:先让入口页统一返回 410,等抓取记录里这些 URL 的访问明显减少之后,再考虑停止解析或释放服务器。
几个常见的误区
- 把 404 当成已经删干净:404 之后蜘蛛仍可能反复确认,数量一多消耗的是整站的抓取预算。
- 首页返回 200、其他页返回 404:状态不一致会让蜘蛛难以判断站点状态,通常不如整体统一处理。
- 用 JS 跳转代替服务端状态码:JS 跳转对蜘蛛来说仍是一次正常的页面抓取,起不到告知失效的作用。
- 批量改成空白页:空白页返回 200,属于典型的软 404,特征集中且容易被识别。
- 改完就不看了:状态码改了之后,蜘蛛的行为要过一段时间才反映出来,不看日志就不知道有没有生效。
一个可执行的处理顺序
- 先列出失效入口页清单,区分暂时停用、彻底不用、目标页仍在三类。
- 目标页仍在的,优先用 301 指向最相关的替代页面,并确认目标页可访问。
- 彻底不用的,统一返回 410,并确认返回的是真正的服务端状态码,而不是页面里的文字说明。
- 暂时停用的,保留可访问的页面并给一点实际内容,不要只留空模板。
- 处理完成后观察一段时间的抓取日志,看这些 URL 的访问频次有没有下降,再决定下一步动作。
状态码是给蜘蛛看的语言,不是给用户看的装饰。与其让一批空页面继续返回 200,不如用明确的状态码告诉对方这里已经结束了。