做 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 被稳定發現,而不是一次性骗過某次抓取。