把目标页面用 iframe 嵌进入口页,是不少人试过的省事做法:入口页本身内容不多,靠一个 iframe 把目标站挂上去,看上去既完成了展示,又好像顺手做了 URL 发现。问题在于,搜索引擎对 iframe 的处理方式和普通链接不一样,想靠 iframe 让搜索蜘蛛发现并抓取目标 URL,多数情况下并不可靠。
iframe 在爬虫眼里是另一个独立文档
iframe 在 HTML 里是一个独立的文档容器,它的 src 指向的页面会被当作单独的资源去请求。搜索引擎解析入口页时,一般能识别到 iframe 的 src 地址,但是否真的去抓取、是否会继续跟进里面的链接,取决于各家搜索引擎的实现和渲染策略,并不像普通 a 标签那样确定。
更关键的一点是,即使搜索引擎抓取了 iframe 里的页面,里面的链接也未必被当成入口页的出链来对待。链接的归属、发现路径和你预期的都不一样,URL 发现的效果会打很多折扣。
几种常见的失效情况
- 跨域 iframe:当 iframe 的域名和入口页不同时,部分爬虫只会记录 src 这一个地址,内层内容不深入处理。
- 延迟加载:设置惰性加载(lazy loading)或用 JS 动态写入 src,爬虫可能在渲染结束前就收工,内层链接完全没看到。
- 内层本身是 JS 渲染:iframe 里的页面是前端渲染的单页应用,链接要执行脚本才出现,被发现的概率更低。
- 目标站禁止被嵌套:目标站响应头里带了禁止嵌套的设置,iframe 根本加载不出来,自然也谈不上抓取。
为什么这类做法效果不稳定
普通 a 标签是 HTML 里最明确的「这里有一个 URL」的信号,解析成本低、识别率高。iframe 属于嵌套文档,需要额外的抓取和渲染预算。对爬虫来说,抓 iframe 内层的优先级通常低于正文里的正常链接,在抓取预算有限时更容易被放弃。
判断一种 URL 发现手段有没有用,不是看用户端能不能打开,而是看爬虫日志里有没有对内层 URL 的独立请求记录。
更稳妥的替代做法
- 把目标 URL 写成普通的 a 标签链接,放在入口页正文里,确保地址直接出现在 HTML 源码中,而不是脚本拼出来的。
- 确实需要展示目标页面内容时,在 iframe 之外再补一条同地址的文本链接,给爬虫留一个明确入口。
- 避免把 src 交给 JS 或懒加载去填,能静态写在源码里就静态写。
- 控制入口页上的 iframe 数量,别让大量嵌套文档把抓取预算消耗在渲染上。
怎么验证有没有真的抓到
先看服务器日志,目标 URL 所属域名有没有来自搜索引擎爬虫的请求,请求的 Referer 是不是入口页。再用搜索引擎提供的 URL 检查工具,看目标 URL 是否被发现。如果日志里只有入口页被访问、目标 URL 一直没动静,说明 iframe 这条路径没起效,换成正文里的普通链接再观察一轮。
小结
iframe 适合做页面展示,不适合当作 URL 发现的主要手段。把目标链接写成真实的 a 标签、放在能被静态解析的位置,再配合 sitemap 提交等常规方式,比依赖 iframe 更可控,也更容易从日志里判断效果。