入口页做 UA 判断,指的是服务器或 CDN 根据 User-Agent 里的蜘蛛标识,返回一份和普通访客不同的 HTML。常见形态是:普通用户打开只看到一个空壳页或提示页,带蜘蛛标识的请求则拿到完整的链接列表。它确实能让搜索蜘蛛在这次抓取里看到链接,但“能看到”和“能长期这样用”是两回事。
先分清两种情况
一种是内容适配:主内容和链接对所有人都在,只是给爬虫返回更简洁的版本,去掉弹窗、广告脚本和多余的埋点。另一种是隐形斗篷:普通用户根本看不到的内容,只给爬虫看。前者风险低,后者属于典型的欺骗性做法,被识别出来之后的代价通常不小。做蜘蛛池入口页时,很多人走的是第二种,这一点要自己心里有数。
搜索蜘蛛这次会看到什么
主流搜索引擎抓取时一般会带自己的 UA,同时也有以普通浏览器 UA 做一次渲染对比的机制。也就是说,同一个 URL 在短时间内很可能被请求两次:一次是蜘蛛身份,一次是近似普通用户身份。两次返回的 HTML 结构差异太大,尤其是“链接数量从 0 变成 200”这种,很容易被判断成刻意隐藏内容。
几个容易踩坑的地方
- 缓存层会把两份内容混在一起。CDN 或反向代理如果只按 URL 缓存、不按 UA 分流,就可能出现普通用户拿到爬虫版、爬虫拿到空壳版的情况,等于白做,还多留下一次内容不一致的记录。
- 日志里看到蜘蛛抓取,不等于内容被采用。抓取只是把内容取回去,是否用于发现新 URL、后续怎么处理,是另外一回事。有的入口页被抓了几个月,目标 URL 依然没有动静,问题常常不在“发现”环节,而在目标页本身。
- UA 可以伪造,判断逻辑别写死。只看 UA 字符串就返回特供内容,很容易被普通请求头命中,日志里也会混进大量假蜘蛛,导致你对抓取量的判断失真。
- 抓取配额可能被入口页吃掉。蜘蛛每次来都拿到一大堆新链接,站点的抓取预算会被入口页占掉,真正需要更新、需要重新抓取的页面反而排在后面。
想确认链接是否被发现,更稳妥的做法
- 入口页尽量保持同一份 HTML:链接对所有人可见,可点击,有可读锚文本。
- 用真实浏览器和蜘蛛 UA 分别请求一次,比对返回内容是否一致。命令行加 UA 参数即可,同时留意响应头和状态码。
- 去看目标 URL 所在服务器的日志:有没有出现搜索蜘蛛 IP,请求的是不是目标页本身,返回的是 200 还是别的状态码。
- 如果目标页本身还有正常内链能通到它,优先把这条链路做通,而不是只依赖入口页。
- 控制入口页上的链接总量,按主题分批,一批对应一组内容相关的页面。
如果同一个 URL 对搜索蜘蛛和普通用户长期返回差异明显的内容,风险不只是这次不抓,而是整站层面可能被一并处理。入口页这种中间页被标记,牵连的往往是同域下的其他页面。
一个简单的自检清单
- 用普通 UA 请求入口页,HTML 源码里能否看到目标链接?看不到就按高风险处理。
- 入口页返回状态码是否为 200,有没有被 WAF 或风控误拦成 403。
- 链接是否写在 HTML 源码里,而不是只靠 JS 脚本或事件绑定生成。
- 目标页自己是否可正常访问、是否有实质内容,别把“没被发现”全算在入口页头上。
UA 分流本身不是不能用,但它解决的是服务器负载和渲染成本的问题,不是“让蜘蛛多看到几条链接”。如果目的只是给目标 URL 多一条被发现的入口,把链接稳定放在 HTML 里、控制每页链接数量、把目标页本身做扎实,通常比折腾判定逻辑更省事,也更容易在日志里看清真实情况。