蜘蛛池入口页的做法里,按 User-Agent(UA)返回不同内容是很常见的一类。思路通常很简单:识别到搜索蜘蛛的 UA,就返回一版纯链接列表,尽量多放目标 URL;识别到普通浏览器,就返回一版看起来正常的页面。这样做的人往往是想让蜘蛛看到更多链接,同时不想让访问者觉得页面奇怪。
常见的 UA 区分做法
- 蜘蛛 UA 返回精简 HTML,普通用户返回带样式和正文的完整页面。
- 蜘蛛 UA 返回的链接数量明显多于普通用户版本。
- 非蜘蛛 UA 直接跳转到首页或其他页面,甚至返回空白。
- 只允许特定 UA 访问,其他请求一律 403。
搜索蜘蛛看到的内容和别人不一样,会有什么后果
搜索引擎对这件事的容忍度很低。抓取系统通常不会只看一次请求,常见做法是拿不同 UA、不同来源去对比同一个 URL 的返回结果。如果普通用户看到的内容和蜘蛛看到的差异很大,而且差异正好体现在链接、正文这类会影响判断的部分,就可能被认定为隐藏真实内容,也就是常说的 cloaking。
一旦被这样判定,影响往往不只是入口页本身:入口页被抓取和信任的程度下降后,上面的目标 URL 被再次访问的概率也会跟着降低,之前积累的抓取路径可能慢慢失效。这里的因果关系不是必然的,不同搜索引擎的处理力度不一样,但风险方向是一致的。
判断标准大致可以概括为:用户看到的内容,和蜘蛛看到的内容,是不是同一份。差异越大、越针对搜索引擎,风险越高。
哪些差别影响较小,哪些风险明显
影响较小的情况
- 两版内容主体相同,只是排版、CSS、脚本加载方式不同。
- 因为缓存或 CDN 节点不同导致的轻微差异。
- 根据语言或地区返回不同语言版本,并且对普通用户也是同样规则。
风险明显的情况
- 蜘蛛版塞进大量用户看不到的链接,用户版几乎没有链接。
- 用户版是正常文章,蜘蛛版却是纯链接列表。
- 对非蜘蛛 UA 直接 403 或跳转,把入口页做成只对蜘蛛开放。
换句话说,问题不在于页面长得不一样,而在于入口页的主要用途是不是只服务搜索引擎。如果用户版本本身也有可读内容、也能点到这些链接,性质就完全不同。
如果确实需要控制蜘蛛看到的内容,可以怎么做
- 优先保证同一个 URL 对所有人返回同一份内容,链接放在页面里对用户也有意义。
- 需要控制抓取量时,用 robots.txt 的 Crawl-delay 或服务器限速,而不是砍掉用户可见的内容。
- 链接列表可以长,但让它对用户也是可用的,必要时做分页,而不是只对蜘蛛展开。
- 入口页不要只服务蜘蛛,保留最基本的导航和说明文字,页面本身才站得住。
- 用服务器日志观察蜘蛛实际拿到的返回内容,而不是只看自己设定的规则。
自查时重点看这几项
- 用普通浏览器 UA 和蜘蛛 UA 各请求一次入口页,对比返回的 HTML 是否一致。
- 确认用户版和蜘蛛版的链接集合相差多少条,差异是不是集中在链接上。
- 检查有没有针对非蜘蛛 UA 的 403、302 或空白返回。
- 看入口页被访问时的状态码是否稳定,避免正常限速被误判成异常。
- 目标 URL 在普通访问下是否也能打开,而不是只在蜘蛛 UA 下才通。
总的来说,蜘蛛池入口页的价值在于让目标 URL 更容易被发现,而不是让蜘蛛单独看到一份用户看不到的页面。两个版本的差异越小,长期跑下去越省事,也越不容易在某个时间点突然失去抓取。