搜索抓取

蜘蛛被挡在门外:登录墙、Cookie 跳转与弹窗怎么影响抓取

很多抓取问题不是链接没写对,而是请求进来后被拦住了:登录墙、地区跳转、同意弹窗、UA 拦截都会让蜘蛛拿到与用户不同的页面。本文梳理这些常见堵点的表现、日志特征,以及放行时该守住哪些原则。

搜索抓取

蜘蛛被挡在门外:登录墙、Cookie 跳转与弹窗怎么影响抓取

很多站点反映蜘蛛不来抓,排查到最后会发现:链接没问题,Sitemap 也提交了,问题出在请求进来之后被拦住。蜘蛛拿到的不是页面,而是一个登录页、一次跳转、一层遮罩,或者一张验证码。这种问题在日志里常表现为状态码正常,但返回内容不对,只看状态码很容易漏过去。

登录墙与权限判断:蜘蛛看到的是登录页

内容放在登录之后,蜘蛛自然拿不到。更隐蔽的情况是:站点对未登录用户做统一跳转,先 302 到登录页,再让登录页返回 200。蜘蛛顺着链接爬进来,读到的是一堆重复的登录模板,真正的正文 URL 从来没有被真正抓取过。

如果确实有需要公开的内容,通常的做法是让它在未登录状态下也能直接访问,而不是靠跳转兜底。检查时重点看:

  • 正文 URL 未登录访问时返回的是正文还是登录页模板;
  • 是否存在“先跳转再返回 200”的链路,让状态码看起来是健康的;
  • 会员区、后台、预览页是否与公开内容混在同一套模板和链接里。

Cookie 跳转:第一次访问就被送走

地区选择、语言切换、A/B 分流,常常靠 Cookie 或请求头做判断。问题在于蜘蛛第一次访问时既没有 Cookie,UA 也和浏览器不同,站点就可能把它重定向到另一个版本,甚至重定向回首页。

几种典型表现:

  • 没有地区 Cookie 时默认跳到某个分站,蜘蛛始终停在入口;
  • 分流脚本把一部分请求分到 B 版本,导致同一 URL 反复返回不同内容;
  • 语言判断写到跳转逻辑里,爬虫拿到的永远是默认语言的那一版。

比较稳妥的处理是:让默认版本直接返回内容,把地区、语言切换做成页面上的显式链接,而不是隐式跳转。

同意弹窗与遮罩层:渲染层面的堵点

Cookie 同意条、订阅弹窗、App 下载引导,多数不会影响原始 HTML,但会影响渲染结果。如果弹窗以遮罩形式覆盖正文,而正文又是前端异步加载,蜘蛛渲染时可能先拿到遮罩层,正文还没挂上来就被判定为渲染完成。

另外,部分弹窗依赖第三方脚本,脚本加载慢或超时会拖长渲染时间。处理思路是让正文在初始 HTML 里就存在,弹窗逻辑延后执行;移动端的全屏引导尤其要注意,它经常是渲染后被“贴”上去的。

防火墙、UA 判断与验证码

WAF、CDN 防护和站内自研的防爬规则,是另一类容易被忽略的堵点。常见触发条件包括:请求频率触发限速、UA 命中黑名单规则、缺少某些浏览器请求头、来自云机房 IP 段、短时间内访问大量 URL。

表现通常是返回 403、429,或者一张验证码页,也可能是空响应。需要注意的是,这类拦截有时只在抓取高峰期生效,低峰期测试一切正常,导致问题很难复现。

怎么判断是不是被挡住了

  1. 看服务器日志里蜘蛛 UA 对应的状态码分布,重点找 3xx、403、429 以及返回体积异常小的 200;
  2. 对同一个 URL 分别用蜘蛛 UA 和普通浏览器访问,比对最终落地 URL 和正文内容;
  3. 清空 Cookie、不带登录态再访问一次,看是否发生跳转;
  4. 检查渲染后的页面,确认正文是否被遮罩或弹窗挡住;
  5. 核对 CDN 与 WAF 规则里是否存在针对 UA、频率、IP 的拦截项。

放行时该守住的原则

  • 安全策略按 IP 白名单和真实行为判断,不要仅凭 UA 字符串做业务逻辑;
  • 需要屏蔽的页面用 robots.txt 或 noindex 明确表达,而不是靠跳转和拦截;
  • 公开内容保持未登录可直接访问,登录墙不要覆盖整站;
  • 改版或调整防护规则后,留一段时间观察日志中的状态码变化。
蜘蛛抓不到内容,很多时候不是路径问题,而是入口被礼貌地挡在了外面。先把请求顺利放进来,再去谈抓取深度和抓取节奏,顺序会更顺一些。