很多站点的内容并不完全公开:有的要登录,有的要付费,有的被弹窗和验证码挡在前面。这类站点常有一个疑问——蜘蛛到底能不能进来,能进到哪一层。答案不取决于蜘蛛本身,而取决于服务器在未登录状态下返回了什么。
先看蜘蛛拿到的那份 HTML
蜘蛛的请求和普通未登录访客的请求基本一致:没有 Cookie、没有会话、不会点击按钮、不会滚动,也不会执行验证码。所以判断标准很简单——用不带任何身份信息的请求去访问这个 URL,返回的状态码和 HTML 就是蜘蛛看到的东西。
- 返回 200 且有正文:蜘蛛能读到,哪怕页面顶部有“登录后查看完整内容”的提示。
- 返回 200 但正文为空、内容是脚本加载后才出现:多数情况下蜘蛛看不到实质内容。
- 返回 302 跳转到登录页:蜘蛛跟过去,最终读到的只是登录页,内容页等于不存在。
- 返回 401、403 或验证码页:抓取直接失败,重试几次后可能降低对这个站的抓取频率。
几种常见的“墙”,性质并不一样
硬登录墙
整站或整个栏目必须登录,未登录请求统一跳登录页。这种结构下,蜘蛛能建立索引的基本只有登录页和少数公开页。想要内容被收录,就得先在结构上分出一层不需要登录也能看到的公开页,例如简介页、目录页、试读页,并把内链指向这些公开页,而不是指向登录拦截后的地址。
付费墙与“首篇免费”
付费墙通常对未登录访客返回部分内容或摘要。这类页面可以正常被抓取,关键是让 HTML 里真的有可读的文字,而不是一两句提示语。若使用结构化数据,应如实标注访问限制,不要把付费内容标成完全免费——标注和页面实际状态不一致,属于容易被判定的问题。
弹窗与遮罩
很多订阅弹窗、地区选择弹窗盖在正文上方。只要正文仍在 HTML 里、只是被 CSS 遮住,通常不影响抓取;但如果正文也是脚本加载后插入、且被弹窗替换掉,那就另当别论。稳妥的做法是让正文先出现在 HTML 中,弹窗在其后叠加。
验证码与人机校验
对搜索引擎蜘蛛做验证码校验,基本等于主动放弃抓取:它无法完成交互,只会反复收到拦截页。如果确实需要对普通流量做防护,应把校验设置在不影响正常抓取的位置,并避免把整站入口都放在校验之后。
可以做的几件事
- 把公开内容与受限内容分成两类 URL,公开的那部分放内链、放进 Sitemap。
- 摘要页、目录页、作者页这类不设墙的页面,承担把蜘蛛带到内容页的职责。
- 受限页面若仍需被索引,至少要有一段真实、稳定的描述性文字。
- 结构化数据按实际访问规则填写,不夸大可访问性。
- 用不带 Cookie 的请求定期抽查关键 URL,确认状态码和正文没有变化。
给蜘蛛单独放行、对普通访客返回不同内容,属于典型的伪装抓取做法,短期可能看起来有效,但一旦被发现,影响面往往比不做更大。
几个容易踩的坑
- 把登录跳转写成 200 返回一个空白页面,形成软 404,蜘蛛会在这些地址上反复浪费时间。
- 用 UA 关键词放行,误伤了正常访客和第三方工具,也给了伪造请求可乘之机。
- 付费内容全部放在脚本渲染后加载,蜘蛛访问时拿到的只有骨架。
- 受限页面仍然大量出现在内链和 Sitemap 里,把抓取路径引向无法读取的地址。
怎么确认实际情况
服务器日志里看未登录请求(没有 Cookie 的请求)对应的状态码和响应长度,是最直接的判断方式。搜索控制台里的 URL 检查工具能看到蜘蛛最终拿到的 HTML,注意看正文是否在其中。对关键页面用命令行请求一次、只保留响应头,也能快速确认重定向链和状态码。
结论不复杂:蜘蛛只能读到服务器在未登录状态下愿意给出的内容。站点要做的事情,是决定哪些页面公开、把这些页面用稳定的路径交出去,并让受限页面在结构里保持清晰的边界。