在蜘蛛池里,入口頁的职责是把 URL 交出去,让搜尋蜘蛛知道“這里有個地址”。但知道不等于看到——如果目标 URL 打開後要求登入、彈驗證碼,或者需要過一段 JS 挑战,搜尋蜘蛛拿到的往往只是那道门,而不是门後的頁面。理解這一点,能帮你判断某次抓取到底是失敗了,還是压根没開始。
先分清“發現”和“抓取”是两步
搜尋蜘蛛從入口頁讀到連結,只是把 URL 记下来,放進待抓队列。真正来訪时,它以未登入的身份發起請求,不带你的 Cookie,也不會替你点按钮、輸密碼。所以“URL 被發現了”和“URL 的内容被抓到了”是完全不同的狀態。前者靠入口頁,後者取决于目标 URL 自己愿不愿意把内容交给一個陌生訪客。
被登入墙挡住时,通常會發生什么
返回登入頁或跳轉
如果未登入訪問被 302 跳到 /login,搜尋蜘蛛會停留在登入頁。它能拿到的内容就是登入頁的内容,跟你的目标頁面無關。這種情况若長期存在,那個 URL 在搜尋引擎眼里就是一個登入頁,而不是你希望它認识的那個頁面。
返回 401 或 403
有些站点直接返回 401 或 403。這類狀態碼會让抓取立刻結束,队列里的這次訪問算一次失敗。偶尔一次問题不大,但如果每次来都被拒,重复几次後抓取频率通常會自動降低。
彈驗證碼或 JS 挑战
驗證碼、滑块、几秒盾這類拦截,一般靠 JS 执行後寫 Cookie 才能通過。搜尋蜘蛛大多不执行完整交互,頁面就停在挑战頁。结果和登入墙類似:請求成功返回 200,但内容几乎是空壳。
哪些情况其實還能正常抓取
- 付費墙但首屏正文可见:蜘蛛看到的和普通訪客一致,抓取不受影响。
- 正文需要登入,但标题、摘要、结构化資料未登入可见:至少能被识別成一個真實頁面,而不是空壳。
- 拦截只针對可疑来源,對已驗證的搜尋蜘蛛放行:這類白名單机制要确保配置長期有效,別在換 CDN 之後失效。
- 目标 URL 另有公開的静態版本或精简版本:入口頁直接指向那個版本,绕開登入逻辑。
這些做法的共同点是:让“未登入訪客”能看到真實内容,而不是专门给搜尋蜘蛛造一個假頁面——後者一旦被發現,風險比不收錄大得多。
排查时可以按這個顺序看
- 用無痕窗口、不带 Cookie 打開目标 URL,看到什么,大概率就是搜尋蜘蛛看到的東西。
- 看服務器日誌里搜尋蜘蛛那次請求的狀態碼和响應体大小,空壳頁面通常只有几 KB。
- 確認跳轉鏈條有多長,登入跳轉往往還叠着地区跳轉、語言跳轉。
- 如果入口頁指向的是短鏈,检查短鏈最终落到的是不是登入頁。
發現一個 URL 的成本很低,抓到内容才需要目标 URL 配合。入口頁做得再好,也解决不了门後不让進的問题。
几個常见誤区
一是以為“提交了就一定會抓”,提交只影响排队顺序,不影响能否拿到内容。二是把登入頁的 200 狀態碼当成抓取成功,實际上抓到的是另一張頁面。三是给搜尋蜘蛛單獨開一個免登入通道,却不做任何来源校驗,等于给所有人開了後门。稳妥的做法還是让公開内容保持公開,需要權限的部分就不要指望被收錄。
把入口頁和“门後的可達性”分開看,很多“URL 一直不收錄”的疑問其實就有了答案:不是蜘蛛没来,而是它来了,站在门口没進去。