常见問题

蜘蛛池入口頁做 UA 分流只给搜尋蜘蛛看連結,算隐藏内容吗

入口頁按 UA 给搜尋蜘蛛單獨返回一份带連結的 HTML,是蜘蛛池里常见的做法,但容易被判定為隐藏内容。本文說明它和正常内容适配的区別、缓存层可能造成的内容不一致問题,以及更稳妥的排查方式與替代做法,重点在連結可见性和日誌核對。

常见問题

蜘蛛池入口頁做 UA 分流只给搜尋蜘蛛看連結,算隐藏内容吗

入口頁做 UA 判断,指的是服務器或 CDN 根據 User-Agent 里的蜘蛛标识,返回一份和普通訪客不同的 HTML。常见形態是:普通用戶打開只看到一個空壳頁或提示頁,带蜘蛛标识的請求則拿到完整的連結列表。它确實能让搜尋蜘蛛在這次抓取里看到連結,但“能看到”和“能長期這样用”是两回事。

先分清两種情况

一種是内容适配:主内容和連結對所有人都在,只是给爬虫返回更简洁的版本,去掉彈窗、广告脚本和多余的埋点。另一種是隐形斗篷:普通用戶根本看不到的内容,只给爬虫看。前者風險低,後者属于典型的欺骗性做法,被识別出来之後的代價通常不小。做蜘蛛池入口頁时,很多人走的是第二種,這一点要自己心里有數。

搜尋蜘蛛這次會看到什么

主流搜尋引擎抓取时一般會带自己的 UA,同时也有以普通浏览器 UA 做一次渲染對比的机制。也就是说,同一個 URL 在短時間内很可能被請求两次:一次是蜘蛛身份,一次是近似普通用戶身份。两次返回的 HTML 结构差异太大,尤其是“連結數量從 0 變成 200”這種,很容易被判断成刻意隐藏内容。

几個容易踩坑的地方

  • 缓存层會把两份内容混在一起。CDN 或反向代理如果只按 URL 缓存、不按 UA 分流,就可能出現普通用戶拿到爬虫版、爬虫拿到空壳版的情况,等于白做,還多留下一次内容不一致的记錄。
  • 日誌里看到蜘蛛抓取,不等于内容被采用。抓取只是把内容取回去,是否用于發現新 URL、後續怎么處理,是另外一回事。有的入口頁被抓了几個月,目标 URL 依然没有動静,問题常常不在“發現”环节,而在目标頁本身。
  • UA 可以伪造,判断逻辑別寫死。只看 UA 字符串就返回特供内容,很容易被普通請求头命中,日誌里也會混進大量假蜘蛛,導致你對抓取量的判断失真。
  • 抓取配額可能被入口頁吃掉。蜘蛛每次来都拿到一大堆新連結,站点的抓取预算會被入口頁占掉,真正需要更新、需要重新抓取的頁面反而排在後面。

想確認連結是否被發現,更稳妥的做法

  1. 入口頁尽量保持同一份 HTML:連結對所有人可见,可点击,有可讀锚文本。
  2. 用真實浏览器和蜘蛛 UA 分別請求一次,比對返回内容是否一致。命令行加 UA 參數即可,同时留意响應头和狀態碼。
  3. 去看目标 URL 所在服務器的日誌:有没有出現搜尋蜘蛛 IP,請求的是不是目标頁本身,返回的是 200 還是別的狀態碼。
  4. 如果目标頁本身還有正常内鏈能通到它,優先把這條鏈路做通,而不是只依赖入口頁。
  5. 控制入口頁上的連結總量,按主题分批,一批對應一组内容相關的頁面。
如果同一個 URL 對搜尋蜘蛛和普通用戶長期返回差异明顯的内容,風險不只是這次不抓,而是整站层面可能被一並處理。入口頁這種中間頁被标记,牵连的往往是同域下的其他頁面。

一個简單的自检清單

  • 用普通 UA 請求入口頁,HTML 源碼里能否看到目标連結?看不到就按高風險處理。
  • 入口頁返回狀態碼是否為 200,有没有被 WAF 或風控誤拦成 403。
  • 連結是否寫在 HTML 源碼里,而不是只靠 JS 脚本或事件绑定生成。
  • 目标頁自己是否可正常訪問、是否有實质内容,別把“没被發現”全算在入口頁头上。

UA 分流本身不是不能用,但它解决的是服務器负载和渲染成本的問题,不是“让蜘蛛多看到几條連結”。如果目的只是给目标 URL 多一條被發現的入口,把連結稳定放在 HTML 里、控制每頁連結數量、把目标頁本身做扎實,通常比折腾判定逻辑更省事,也更容易在日誌里看清真實情况。