做站的时候常會遇到一種情况:頁面在浏览器里看着没問题,用戶点開、關掉彈窗就能看到内容,但在日誌里,蜘蛛對同一批 URL 的抓取要么很少,要么抓到的响應特別短。問题往往出在“软性拦截”上——不是 403 那種硬拦,而是彈窗、登入、地域規則這類把内容挡在中間的東西。無论是做蜘蛛池還是單站点运营,判断依據最终都要落到日誌上。
用戶看不到,不等于蜘蛛抓不到
搜尋引擎蜘蛛拿到的是 HTTP 响應加上渲染後的 DOM,它不受彈窗遮挡、滚動位置、鼠标悬停的影响。反過来说,只要响應里带着完整正文,即使頁面上盖着一层“订阅我們的推送”,蜘蛛仍然能讀到。真正让内容消失的,是正文压根没進响應,或者要经過登入、同意、地域校驗之後才被 JS 請求回来。
所以排查前先分清两件事:是“视觉上被挡住”,還是“資料上没返回”。前者對抓取影响有限,後者才會造成實际的内容缺失。
常见的几類软性拦截
覆盖式彈窗與 Cookie 同意條
這類彈窗如果只是用 CSS 定位盖在正文上,正文仍在 HTML 里,蜘蛛一般能拿到。但当彈窗逻辑是“先隐藏正文容器,用戶同意後再用 JS 填充”时,抓取结果可能就是一個空壳。做法上,正文尽量直出,彈窗用脚本後置叠加,別让同意狀態决定正文是否出現在初始响應里。
登入墙與會員可见
把正文完整放在登入之後,蜘蛛和未登入用戶一样看不到。如果這部分内容确實想让搜尋引擎了解,常见做法是保留一段公開可见的摘要或首屏内容,其余部分再要求登入。需要注意的是,不要给蜘蛛返回完整内容、给用戶返回登入提示,這属于對抓取的区別對待,風險不小。
地域限制與 CDN 規則
按 IP 或地区做跳轉、返回不同語言版本、直接 403,是服務器與合規配置里常见的一环。問题在于蜘蛛的抓取 IP 未必属于你预期的地区,可能被規則誤伤。如果站点确實需要地域規則,建议先把主要搜尋蜘蛛的 IP 段放行,再用日誌核對是否還有被拦的记錄。
付費墙與内容截断
付費墙最容易踩的坑是“首段直出、其余由 JS 拉取”,如果拉取接口對未登入請求返回空,蜘蛛看到的就是一篇只有開头、没有正文的頁面。可以保留可公開的段落作為獨立、完整的信息單元,別让公開部分讀起来像被截断的残篇。
怎么確認蜘蛛到底有没有被拦
- 在訪問日誌里找蜘蛛 UA 的請求,看狀態碼是不是 200,再看响應字节數是否明顯小于正常頁面。
- 同一 URL 對比用戶訪問與蜘蛛訪問的返回長度,差得多就值得查。
- 關注被抓取的 URL 里,登入頁、跳轉頁、驗證頁的占比是否異常升高。
- 渲染類抓取要看渲染後的正文是否為空,而不是只看初始 HTML。
這几步做完,基本能判断是“蜘蛛没来”,還是“来了但没拿到東西”。两種情况的處理方向完全不同。
處理时的一点原則
不管用哪種方式,核心是让公開层的内容真實、稳定、可复用:正文直出,交互元素後置;该公開的部分不要藏在 JS 請求之後;地域和反爬規則给已知搜尋蜘蛛留出通道。改完之後,用日誌里蜘蛛請求的狀態碼和字节數變化来驗證,而不是凭感觉判断。
不要為了抓取专门给蜘蛛返回一套和用戶不同的内容。這類区別對待一旦被识別,损失通常比少抓几個頁面更大。
收尾核對
把上面几類拦截列成清單,逐項對照:彈窗是否影响初始响應、正文是否依赖登入、地域規則是否誤伤、付費墙是否只留下残段。改完後观察一到两周的抓取日誌,看正文完整返回的比例有没有變化。抓取這件事很少有一步到位的調整,多數时候是靠日誌反复核對,慢慢收敛的。