在蜘蛛池和入口页运营中,有人会尝试根据访问者的 User-Agent、IP 或 Cookie 返回不同 HTML:普通用户看到带目标链接的页面,搜索蜘蛛看到另一个版本;或者反过来。这个做法的出发点通常是控制蜘蛛抓取路径或减少页面体积。但从 URL 发现的角度看,它经常带来一个直接问题:搜索蜘蛛看到的版本里根本没有目标链接,或者目标链接被替换成跳转脚本、空白容器。
搜索蜘蛛看到的是哪一版内容
搜索引擎爬虫访问时,通常带有明确的 UA 标识,也可能来自特定 IP 段。服务器端程序如果按 UA 或 IP 做条件判断,就可能在蜘蛛请求时返回不同内容。对蜘蛛来说,它只知道自己收到的那份 HTML。如果入口页给蜘蛛返回的是精简版、跳转版或屏蔽版,那么后续解析、链接提取、URL 入队都会围绕这份 HTML 进行。普通用户看到的链接再多,也不一定会进入蜘蛛的发现队列。
所以判断入口页能否帮助 URL 发现,不能只看浏览器里打开了什么,而要看蜘蛛实际收到的响应体里有什么。
常见的差异返回方式与风险
- 按 UA 返回:识别到特定爬虫 UA 后返回空壳页、跳转页或删减版 HTML。目标链接不在初始 HTML 中,蜘蛛就很难发现。
- 按 IP 返回:对来自搜索爬虫 IP 段的请求返回不同内容。IP 段会变化,判断容易误伤,也可能导致蜘蛛拿到与普通用户不一致的页面。
- 按 Cookie 或会话返回:第一次访问给蜘蛛一个没有目标链接的页面,需要设置 Cookie 后才展示。蜘蛛通常不会像浏览器那样完成复杂交互。
- 按 Referer 返回:只有从特定来源进入才展示链接。蜘蛛直接请求入口页时,Referer 为空或不匹配,看到的可能是另一套内容。
这些做法的共同点是:页面在“给谁看”上做了区分。如果区分的目的是刻意向搜索蜘蛛隐藏或展示不同内容,就可能触及搜索引擎的作弊识别,比如伪装页面、桥页或隐藏真实内容。即使只是技术配置失误,也会让 URL 发现变得不稳定。
为什么目标 URL 可能没被发现
当入口页对蜘蛛返回的版本缺少目标链接时,常见表现有几种:
- 蜘蛛抓取入口页返回 200,但 HTML 里没有目标 URL 的 a 标签。
- 目标链接由 JavaScript 在客户端插入,而蜘蛛拿到的是未渲染的初始 HTML。
- 页面返回的是跳转指令,但跳转目标写在脚本里,蜘蛛没有执行。
- 蜘蛛拿到的是验证页、地区选择页或错误页,目标链接被替换。
- 目标链接虽然存在,但被放在 nofollow、iframe 或需要交互才出现的位置。
这些问题不一定会在服务器日志里表现为“抓取失败”。日志可能显示蜘蛛成功请求了入口页,状态码也是 200,但目标 URL 从未被请求。这时候只看状态码容易误判。
排查顺序
- 用搜索蜘蛛的 UA 请求入口页,保存完整响应体,不要只看浏览器渲染后的结果。
- 在响应体里搜索目标 URL 的域名或路径,确认链接是否在初始 HTML 中存在。
- 对比普通用户 UA 与搜索蜘蛛 UA 返回的内容差异,确认是否触发了条件返回。
- 检查服务器端是否按 IP 段、Cookie、Referer 做逻辑判断,排除误伤蜘蛛。
- 查看服务器日志中入口页的响应状态、大小和请求头,确认蜘蛛实际拿到的版本。
- 如果目标链接依赖 JS 插入,评估蜘蛛能否渲染,以及渲染后的链接是否可被提取。
- 观察一段时间内目标 URL 是否在日志中出现;若始终没有,再调整入口页结构。
调整建议
- 尽量让搜索蜘蛛和普通用户看到同一份核心内容,目标链接在初始 HTML 中可见。
- 如果必须做地区或语言分流,保留一个默认版本,并确保默认版本包含目标链接。
- 避免专门针对搜索爬虫 UA 返回空壳页、跳转页或不同链接。
- 目标链接用标准 a 标签和可抓取路径,不要只依赖脚本点击或表单提交。
- 入口页响应保持稳定,不要因为 UA、IP 变化而返回完全不同的链接集合。
- 如果使用 CDN 或安全防护,检查是否对搜索蜘蛛 IP 返回了验证页或挑战页。
需要说明的是,让链接更容易被发现,不等于一定被收录或获得排名。搜索蜘蛛是否抓取、何时抓取,还受到抓取预算、站点质量、链接价值和算法判断等多方面影响。
小结
蜘蛛池入口页按 UA 或 IP 返回不同内容,本身就会增加 URL 发现的不确定性。对蜘蛛来说,只有它实际收到并解析到的 HTML 才是有效输入。想让入口页承担 URL 发现的作用,优先保证响应一致、链接在初始 HTML 中可见、路径可抓取。如果发现蜘蛛抓了入口页却没有请求目标 URL,先从这个方向排查,往往比继续增加入口页数量更有用。