把目标链接放进 iframe,是不少蜘蛛池入口页用来做页面分块或“藏链接”的做法。它到底能不能被搜索蜘蛛发现,取决于爬虫是否愿意把 iframe 当成一个独立文档去请求,以及请求之后怎么处理里面的链接。先说结论:部分场景下可以发现,但稳定性明显弱于正文里的普通 a 标签,不适合当作主要的 URL 发现渠道。
iframe 里的链接,搜索蜘蛛看不看
搜索引擎在渲染页面时,通常会把 iframe 视为一个单独的文档来处理,但这不等于里面的链接一定会进入主页面的链接图。实际抓取中常见的差异有这几种:
- iframe 的 src 指向同域名文档时,被请求和解析的概率相对较高;
- 跨域 iframe 也能被请求,但其中的链接是否被归到主页面,各家处理规则不一致;
- src 由 JavaScript 动态写入时,要等渲染阶段才可能被发现,延迟和不确定性都更大;
- 靠 noscript、懒加载占位符承载的链接,多数情况下会被当作不可见内容处理。
换句话说,iframe 更像是一个“可能被发现”的通道,而不是“会被发现”的通道。把它当成唯一入口,风险偏高。
为什么 iframe 里的链接容易被漏掉
漏抓通常不是单一原因造成的,常见的有以下几类:
- 额外一次请求的成本。爬虫要发现 iframe 内的链接,必须先请求 src 指向的文档,相当于多花一次抓取预算。在配额紧张时,这一步很容易被跳过。
- 链接归因不清。iframe 内的链接属于子文档,部分实现不会把它算作主页面的出链,因此不会从入口页“传导”到目标 URL。
- 渲染门槛。需要执行 JavaScript 才能写入 src 的 iframe,只有在渲染型抓取中才可能被处理,而渲染抓取本身是有额度的。
- 属性限制。iframe 上叠加了 sandbox、loading="lazy",或者被 CSS 设为 0×0、display:none 时,解析优先级会进一步降低。
想让 iframe 里的链接更容易被发现
如果确实要保留 iframe,可以尽量把条件简化,减少爬虫的决策成本:
- 使用同域 iframe,src 直接写在 HTML 属性里,不要靠脚本注入;
- 被 iframe 引用的页面要正常返回 200,并且内部是标准可解析的 a 标签;
- 不要在 iframe 上叠加多余的 sandbox 限制或懒加载条件;
- 给 iframe 一个合理的宽高,避免用 0×0 或 display:none 隐藏;
- iframe 内页面不要再用 robots.txt 屏蔽,否则连请求都不会发生。
更稳妥的做法:别把发现入口只押在 iframe 上
如果目标是让目标 URL 被稳定发现,建议在 iframe 之外再补几条路:
- 在入口页正文里放至少一个可见的普通链接,作为保底入口;
- 通过 sitemap、RSS 或站点主动提交接口补充 URL 来源;
- 在服务器日志里分别核对 iframe 内页与目标 URL 的抓取记录,确认哪一环断了。
如果日志显示爬虫只请求了入口页,却没有请求 iframe 的 src,说明它没有渲染或直接跳过了这个框架。这种情况下的 iframe 链接基本不具备发现价值,需要换回正文链接或其他提交方式。
排查顺序建议
- 先看 iframe 的 src 有没有被请求,没有请求就不用再往下查链接;
- 再看 src 页面是否返回 200,是否被 robots.txt 或 meta robots 挡住;
- 然后看 src 页面里的 a 标签是否可解析,是否被 JS 动态生成;
- 最后对比目标 URL 的日志,判断是发现环节还是抓取环节出了问题。
iframe 可以用,但要清楚它的定位:它只是入口页上的一种补充结构,而不是 URL 发现的主力。把可见链接、站点地图和主动提交组合起来,入口页的发现效率会更稳定,也更容易从日志里定位问题。