很多站点的内容並不完全公開:有的要登入,有的要付費,有的被彈窗和驗證碼挡在前面。這類站点常有一個疑問——蜘蛛到底能不能進来,能進到哪一层。答案不取决于蜘蛛本身,而取决于服務器在未登入狀態下返回了什么。
先看蜘蛛拿到的那份 HTML
蜘蛛的請求和普通未登入訪客的請求基本一致:没有 Cookie、没有會话、不會点击按钮、不會滚動,也不會执行驗證碼。所以判断标准很简單——用不带任何身份信息的請求去訪問這個 URL,返回的狀態碼和 HTML 就是蜘蛛看到的東西。
- 返回 200 且有正文:蜘蛛能讀到,哪怕頁面顶部有“登入後查看完整内容”的提示。
- 返回 200 但正文為空、内容是脚本加载後才出現:多數情况下蜘蛛看不到實质内容。
- 返回 302 跳轉到登入頁:蜘蛛跟過去,最终讀到的只是登入頁,内容頁等于不存在。
- 返回 401、403 或驗證碼頁:抓取直接失敗,重试几次後可能降低對這個站的抓取频率。
几種常见的“墙”,性质並不一样
硬登入墙
整站或整個栏目必须登入,未登入請求统一跳登入頁。這種结构下,蜘蛛能建立索引的基本只有登入頁和少數公開頁。想要内容被收錄,就得先在结构上分出一层不需要登入也能看到的公開頁,例如简介頁、目錄頁、试讀頁,並把内鏈指向這些公開頁,而不是指向登入拦截後的地址。
付費墙與“首篇免費”
付費墙通常對未登入訪客返回部分内容或摘要。這類頁面可以正常被抓取,關键是让 HTML 里真的有可讀的文字,而不是一两句提示语。若使用结构化資料,應如實标注訪問限制,不要把付費内容标成完全免費——标注和頁面實际狀態不一致,属于容易被判定的問题。
彈窗與遮罩
很多订阅彈窗、地区選擇彈窗盖在正文上方。只要正文仍在 HTML 里、只是被 CSS 遮住,通常不影响抓取;但如果正文也是脚本加载後插入、且被彈窗替換掉,那就另当別论。稳妥的做法是让正文先出現在 HTML 中,彈窗在其後叠加。
驗證碼與人机校驗
對搜尋引擎蜘蛛做驗證碼校驗,基本等于主動放弃抓取:它無法完成交互,只會反复收到拦截頁。如果确實需要對普通流量做防護,應把校驗設定在不影响正常抓取的位置,並避免把整站入口都放在校驗之後。
可以做的几件事
- 把公開内容與受限内容分成两類 URL,公開的那部分放内鏈、放進 Sitemap。
- 摘要頁、目錄頁、作者頁這類不设墙的頁面,承担把蜘蛛带到内容頁的职责。
- 受限頁面若仍需被索引,至少要有一段真實、稳定的描述性文字。
- 结构化資料按實际訪問規則填寫,不夸大可訪問性。
- 用不带 Cookie 的請求定期抽查關键 URL,確認狀態碼和正文没有變化。
给蜘蛛單獨放行、對普通訪客返回不同内容,属于典型的伪装抓取做法,短期可能看起来有效,但一旦被發現,影响面往往比不做更大。
几個容易踩的坑
- 把登入跳轉寫成 200 返回一個空白頁面,形成软 404,蜘蛛會在這些地址上反复浪費時間。
- 用 UA 關鍵詞放行,誤伤了正常訪客和第三方工具,也给了伪造請求可乘之机。
- 付費内容全部放在脚本渲染後加载,蜘蛛訪問时拿到的只有骨架。
- 受限頁面仍然大量出現在内鏈和 Sitemap 里,把抓取路径引向無法讀取的地址。
怎么確認實际情况
服務器日誌里看未登入請求(没有 Cookie 的請求)對應的狀態碼和响應長度,是最直接的判断方式。搜尋控制台里的 URL 检查工具能看到蜘蛛最终拿到的 HTML,注意看正文是否在其中。對關键頁面用命令行請求一次、只保留响應头,也能快速確認重定向鏈和狀態碼。
结论不复杂:蜘蛛只能讀到服務器在未登入狀態下愿意给出的内容。站点要做的事情,是决定哪些頁面公開、把這些頁面用稳定的路径交出去,並让受限頁面在结构里保持清晰的邊界。