在做蜘蛛池或入口页时,有一种情况很容易被忽略:链接确实存在于页面上,但要满足某个条件才输出——比如先判断 Cookie、先校验登录态、先经过一段 JS 交互。对普通访客来说没问题,对搜索蜘蛛来说,这些链接很可能等于不存在。
搜索蜘蛛抓取时的默认状态
搜索蜘蛛发起请求时,基本可以理解为一个“干净”的匿名访问:
- 不会带上你浏览器里的登录 Cookie 或会话标识;
- 不会先完成登录、验证码、滑块等交互;
- 不会点击按钮、滚动加载或提交表单;
- 通常按固定 IP 段和 User-Agent 访问,行为比真实用户更“机械”。
所以,如果你的入口页逻辑是“没有 login_token 这个 Cookie 就返回一个空框架或跳转到登录页”,搜索蜘蛛拿到的就是那个空框架或登录页,里面的目标 URL 一个也发现不了。
几种常见的“登录/Cookie 门槛”写法
1. 服务端判断 Cookie 再输出链接
这是最直接的一种。后端检测不到指定 Cookie,就只渲染页面骨架,链接放在另一个需要鉴权的接口里。搜索蜘蛛看到的 HTML 里没有目标 URL 的痕迹,URL 发现自然无从谈起。
2. 前端 JS 判断后再插入链接
页面初始 HTML 是空的,JS 读取 localStorage 或 Cookie,满足条件才用 DOM 操作把链接写进去。部分搜索引擎能执行 JS,但执行环境通常没有你的登录态,判断结果仍是不通过。即使 JS 能跑,被插入的链接是否被继续抓取也要看渲染是否稳定、是否有超时。
3. 未登录直接 302 到登录页
搜索蜘蛛跟到登录页后,看到的是表单和少量说明文字。原入口页里的链接不会被解析,因为链接根本没出现在响应内容里。
核心问题不是“搜索蜘蛛能不能执行 JS”,而是“它在没有登录态的情况下能看到什么”。页面是否输出链接,取决于你的服务端判断逻辑。
如果真的需要登录态才能看到链接
这取决于目的。如果这些 URL 本来就只给特定用户看,那不被搜索蜘蛛发现是正常设计,不需要折腾。如果目的是让搜索蜘蛛发现并抓取这些 URL,就需要让链接出现在一个匿名可访问的页面上,常见做法有:
- 单独做一个公开入口页:不依赖任何 Cookie,服务端直接输出目标链接的 HTML,结构简单、可缓存。
- 用 sitemap 补充:把目标 URL 写进可公开访问的 sitemap,作为 URL 发现的辅助通道,但 sitemap 本身也不能被权限拦截。
- 服务端渲染:把链接直接输出到初始 HTML,而不是等 JS 执行后再插入,减少一层不确定性。
- 检查是否有拦截规则误伤:有些站点是防火墙或 WAF 规则把未知 UA 当成异常流量,返回登录页或挑战页。这种情况要先在日志里确认搜索蜘蛛到底收到了什么状态码。
不要用“给搜索蜘蛛单独放行”来解决
一种常见的错误做法是:检测到搜索蜘蛛的 User-Agent 就返回带链接的版本,检测到普通访客就返回登录墙。这属于向搜索引擎和用户展示不同内容,存在被判定为伪装的风险,轻则该页面不被信任,重则影响整站抓取。除非差异只是样式或广告位,且不改变核心内容,否则不建议这么做。
怎么确认搜索蜘蛛到底看到了什么
不用猜,可以直接验证:
- 用不带 Cookie 的请求抓取入口页,把 UA 换成常见的搜索蜘蛛标识,看返回的 HTML 里有没有目标链接;
- 在搜索引擎的站长工具里用 URL 检查功能查看“已抓取的页面”和渲染结果;
- 翻服务器日志,看搜索蜘蛛访问入口页时的状态码、响应大小和频率。如果响应大小明显小于你浏览时的页面,多半就是被拦在门外了。
小结
搜索蜘蛛不会带着你的登录态访问。入口页如果靠 Cookie 或登录判断来输出链接,URL 发现基本不会发生。要么接受这个结果,要么把链接放到一个匿名可访问、服务端直接输出的公开入口页上,并用日志和抓取工具验证搜索蜘蛛真正拿到了什么。把这两件事分清楚,比反复猜测“它为什么不来抓”更有用。