同一篇文章,用戶打開能看到全文,搜尋引擎抓到的却可能是半頁空白。這種差异通常不是技術故障,而是内容被挡在了交互之後。登入、彈窗、点击展開,這些對用戶体驗友好的设計,恰好是爬虫過不去的地方。
爬虫看到的版本,是没有交互的那一版
搜尋引擎抓取一個 URL 时,拿到的是服務器返回的 HTML,再加上一段有限時間的渲染。它不會登入,不會点按钮,不會關彈窗,也不會在頁面上停留几秒等你操作。所以那些需要用戶做点什么才會出現的内容,在抓取视角里往往是不存在的。
這不等于頁面一定收錄不了,但它會让頁面的内容量、主题相關性都低于你的预期。最终决定收錄與否的,還是爬虫實际拿到的那份内容。
三種最常见的遮挡方式
登入墙和付費墙
把正文放在登入後才能訪問的路径下,爬虫基本只能看到一個登入表單或者一段简介。整站大范围這么做,能被收錄的有效頁面會明顯减少。
比較務實的做法是:把文章标题、開头一两段、目錄或摘要留在公開可訪問的 HTML 里,只把完整正文放在登入之後。這样頁面至少有一個明确的主题和可判断的内容量。
彈窗、Cookie 提示和遮罩层
用戶第一次訪問时彈出的订阅框、地区選擇框、同意條款横條,如果盖住了首屏正文,並且在渲染快照生成时仍然存在,爬虫看到的就是這一层遮罩。移動端的整屏彈窗尤其容易出問题。
点击展開、折叠面板和加载更多
标簽頁里只渲染目前選中的那一栏、常见問题預設折叠、列表只顯示十條剩下的靠点击加载,都是很常见的實現。如果内容是点击之後才由 JavaScript 請求回来的,没被点開的部分就不會出現在渲染结果里。
一個折中的办法是:折叠面板里的文本仍然寫在 HTML 中,只用 CSS 控制顯示與隐藏。這样虽然用戶需要点击才能看到,但内容本身存在于源碼里,被讀到的概率高得多。
為什么這件事直接影响收錄结果
- 内容變薄:爬虫拿到的正文可能只有几百字甚至更少,頁面容易被判断為信息量不足。
- 主题判断偏移:真正有價值的部分没被抓到,頁面在索引里對應的主题可能變成彈窗文案或導航文字。
- 多版本並存:同一份内容既有带登入參數的地址,又有公開地址,容易形成重复,索引里留下哪一個並不由你决定。
- 更新不生效:你改的是登入後的正文,爬虫每次看到的還是那份舊快照,索引自然跟着不動。
自查:怎么知道爬虫看到了什么
- 用浏览器的無痕模式打開頁面,不做任何点击,看首屏能看到多少正文。這大致就是爬虫的第一印象。
- 禁用 JavaScript 再打開一次。如果正文几乎消失,說明依赖前端渲染,需要確認服務端是否有兜底輸出。
- 用搜尋引擎提供的 URL 检查類工具查看渲染後的 HTML,重点看正文是否出現在里面。
- 查看抓取日誌中该 URL 的返回字节數,和用戶實际看到的頁面体积對比,差距過大通常意味着内容是後加载的。
- 检查登入、彈窗相關的參數是否出現在被收錄的 URL 中,避免同一内容生成多條索引记錄。
處理时的几個原則
- 關键内容預設可见:标题、正文主体、必要說明尽量直接由服務端輸出,不依赖点击或滚動触發。
- 遮罩別压首屏:彈窗尽量延後出現,或至少不要覆盖正文区域。
- 分頁内容给獨立地址:靠加载更多拼接的長列表,考虑给每一頁一個可抓取的 URL。
- 付費墙留一個公開入口:摘要頁可收錄,完整内容留在登入後,两者用規范标簽理清關系。
- 別把收錄問题變成隐藏問题:為了塞内容而用隐藏层堆關鍵詞是另一回事,這里说的只是正常排版的折叠與切換。
判断标准很简單:把頁面当成一個從不点击、從不登入的訪客,他能讀到什么,搜尋引擎大致也就讀到什么。收錄問题的排查,很多时候從這里開始就够了。