做 URL 发现时,经常会遇到一个看似聪明的做法:在入口页里判断 User-Agent,搜索蜘蛛来的时候输出一大串目标链接,普通用户来的时候只显示“页面维护中”或者干脆一片空白。从数据上看,蜘蛛确实抓到了链接,似乎成本最低。但从搜索引擎的规则角度看,这是在给用户和爬虫返回不同内容,属于隐藏内容的范畴,风险比很多人想的要大。
按 UA 返回不同内容,本质是什么
搜索引擎对“隐藏内容”的判定核心很简单:用户看到的和爬虫看到的是不是同一份内容。如果入口页对搜索蜘蛛输出一批链接,对普通访客输出完全不同的页面,那么这些链接对用户没有实际价值,只是为爬虫准备的。这类做法通常被归入 cloaking(伪装),不管你是用服务端判断 UA、判断 IP 段,还是用前端 JS 判断后动态插入 DOM,性质都一样。
并不是所有差异都算问题
需要区分的是,设备适配、语言切换、登录状态不同导致的页面差异,通常有明确的用户收益,也有对应的技术说明,这类差异一般不会被视为作弊。问题出在差异的目的:如果差异只是为了“让蜘蛛看到用户看不到的东西”,那就踩线了。
具体会带来哪些风险
- 入口页本身的信任度下降。一旦被判定为隐藏内容,页面可能被降权甚至从索引中移除,之后从这个入口发现的链接也会随之失去通道。
- 抓取频次可能被削减。搜索引擎会把抓取资源重新分配到它更信任的站点上,入口页回访间隔被拉长,URL 发现的节奏直接变慢。
- 影响面会扩散到整个域名。入口页往往和主站、其他入口页共用域名,处理范围不一定只限单个 URL。
- 收益不稳定。靠欺骗换来的发现,随时可能因为一次算法更新或人工复核而归零,前期投入的入口页基本作废。
几种常被忽略的变形
- 把链接用 display:none、字体颜色与背景相同、字号设为 1px 等方式藏起来,只有用户看不到。这同样属于隐藏内容。
- 入口页正常展示,但把目标链接集中塞进一个默认折叠、用户几乎不会展开的区块,且内容全是无关文本。折叠本身不是问题,问题是内容对用户没有意义。
- CDN 或 WAF 对疑似爬虫的请求返回验证页。这不是你主动做的,但结果一样:蜘蛛拿到的 HTML 和用户不同。需要单独排查。
不用 UA 判断,也能让入口页被稳定发现
- 直接输出静态 HTML,链接对所有人可见。入口页只要结构清晰、正文里有真实可点的超链接,本身就能被正常抓取,没有必要做差异化。
- 如果链接数量多、影响阅读,可以用分页或原生展开控件,但链接要写在 HTML 里,而不是等用户交互后才由 JS 插入。
- 必须用 JS 渲染时,尽量做服务端渲染或预渲染,保证首屏 HTML 里就包含目标链接。爬虫能不能等到脚本执行完,不同引擎表现并不一致。
- 确实不希望被索引的链接,就用 noindex、robots 或权限控制,不要指望“只给蜘蛛看”这条路,它既不稳定也不安全。
怎么自查有没有踩线
- 用不同的 User-Agent 请求同一个入口页,比如用 curl 分别模拟百度蜘蛛和普通浏览器,对比返回的 HTML 是否一致。
- 用无痕窗口打开入口页,确认你肉眼看到的链接和日志里蜘蛛抓到的链接是同一批。
- 检查服务器日志中蜘蛛请求的响应码和响应大小,如果明显小于普通用户,说明返回内容不同。
- 检查 CDN、WAF 的安全策略,确认没有对搜索蜘蛛返回验证码页或拦截页。
搜索引擎需要的是“用户能看到的链接”,而不是“只有蜘蛛能看到的链接”。前者的发现是可持续的,后者只是在赌没有被发现。
如果已经在用 UA 判断,怎么收尾
把入口页改回统一返回,让链接对用户和爬虫同时可见,然后观察一段时间日志里的抓取频次和响应大小是否恢复正常。不要一边改一边继续上线新的 UA 判断页面,那样很难判断问题是否真的解决。入口页的价值在于让目标 URL 被稳定发现,而不是一次性骗过某次抓取。