蜘蛛池入口頁的做法里,按 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 更容易被發現,而不是让蜘蛛單獨看到一份用戶看不到的頁面。两個版本的差异越小,長期跑下去越省事,也越不容易在某個時間点突然失去抓取。